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

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.
@@ -0,0 +1,2 @@
1
+ var e=require(`../piTelemetry-P-o6KRQk.cjs`).t();module.exports=e;
2
+ //# sourceMappingURL=pi.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.cjs","names":["createPiTelemetryExtension"],"sources":["../../src/extensions/pi.ts"],"sourcesContent":["import { createPiTelemetryExtension } from './piTelemetry.js';\n\nexport default createPiTelemetryExtension();\n"],"mappings":"AAEA,IAAA,wCAAeA,CAAAA,GAA4B"}
@@ -0,0 +1,6 @@
1
+ import * as _$_earendil_works_pi_coding_agent0 from "@earendil-works/pi-coding-agent";
2
+
3
+ //#region src/extensions/pi.d.ts
4
+ declare const _default: (pi: _$_earendil_works_pi_coding_agent0.ExtensionAPI) => void;
5
+ export = _default;
6
+ //# sourceMappingURL=pi.d.cts.map
@@ -0,0 +1,7 @@
1
+ import * as _$_earendil_works_pi_coding_agent0 from "@earendil-works/pi-coding-agent";
2
+
3
+ //#region src/extensions/pi.d.ts
4
+ declare const _default: (pi: _$_earendil_works_pi_coding_agent0.ExtensionAPI) => void;
5
+ //#endregion
6
+ export { _default as default };
7
+ //# sourceMappingURL=pi.d.mts.map
@@ -0,0 +1,2 @@
1
+ import{t as e}from"../piTelemetry-BPQgGDpj.mjs";var t=e();export{t as default};
2
+ //# sourceMappingURL=pi.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.mjs","names":[],"sources":["../../src/extensions/pi.ts"],"sourcesContent":["import { createPiTelemetryExtension } from './piTelemetry.js';\n\nexport default createPiTelemetryExtension();\n"],"mappings":"gDAEA,IAAA,EAAe,GAA4B"}
package/dist/index.cjs CHANGED
@@ -1 +1 @@
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;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./node-9pwprHry.cjs`),t=require(`./stdio-Gb0mj6eo.cjs`),n=require(`./piTelemetry-P-o6KRQk.cjs`);let r=require(`@opentelemetry/api`),i=require(`@opentelemetry/api-logs`);exports.SpanKind=r.SpanKind,exports.SpanStatusCode=r.SpanStatusCode,exports.StdioTransportHandler=t.t,exports.createNodeTelemetry=e.t,exports.createPiTelemetryExtension=n.t,exports.createServer=t.n,exports.getLogSinkOtelEndpoint=e.n,exports.log=i.logs,exports.resolveLogSinkOtelEndpoint=e.a,exports.resolveLogSinkPort=e.o,exports.resolveNodeTelemetryEndpoints=e.r,exports.trace=r.trace;
package/dist/index.d.cts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { NodeTelemetryBackend, NodeTelemetryEndpointSource, NodeTelemetryHandle, NodeTelemetryLogOptions, NodeTelemetryLogger, NodeTelemetryOptions, NodeTelemetrySpanOptions, ResolvedNodeTelemetryEndpoints, SpanKind, SpanStatusCode, TelemetryLevel, createNodeTelemetry, getLogSinkOtelEndpoint, log as logs, resolveNodeTelemetryEndpoints, trace } from "./telemetry/node.cjs";
2
+ import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
3
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
4
  import { Container } from "inversify";
4
5
  import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
@@ -922,6 +923,15 @@ declare class StdioTransportHandler implements TransportHandler {
922
923
  stop(): Promise<void>;
923
924
  }
924
925
  //#endregion
926
+ //#region src/extensions/piTelemetry.d.ts
927
+ type TelemetryFactory = (options: NodeTelemetryOptions) => Promise<NodeTelemetryHandle>;
928
+ interface PiTelemetryExtensionOptions {
929
+ allowFileFallback?: boolean;
930
+ env?: NodeJS.ProcessEnv;
931
+ telemetryFactory?: TelemetryFactory;
932
+ }
933
+ declare function createPiTelemetryExtension(options?: PiTelemetryExtensionOptions): (pi: ExtensionAPI) => void;
934
+ //#endregion
925
935
  //#region src/utils/resolveLogSinkPort.d.ts
926
936
  interface LogSinkPortResult {
927
937
  port: number;
@@ -940,5 +950,5 @@ interface ResolveLogSinkPortOptions {
940
950
  declare function resolveLogSinkPort(options: ResolveLogSinkPortOptions): Promise<LogSinkPortResult | undefined>;
941
951
  declare function resolveLogSinkOtelEndpoint(options: ResolveLogSinkPortOptions): Promise<string | undefined>;
942
952
  //#endregion
943
- export { AgentIssue, AgentIssueCategory, AgentIssueFilters, AgentIssuesReport, LogAggregation, LogEntry, LogLevel, LogMetricGroupRow, LogMetricsFilters, LogMetricsGroupBy, LogMetricsReport, LogMetricsSort, type LogSinkPortResult, NewLogEntry, type NodeTelemetryBackend, type NodeTelemetryEndpointSource, type NodeTelemetryHandle, type NodeTelemetryLogOptions, type NodeTelemetryLogger, type NodeTelemetryOptions, type NodeTelemetrySpanOptions, QueryFilters, type ResolveLogSinkPortOptions, type ResolvedNodeTelemetryEndpoints, SearchOptions, SpanKind, SpanStatusCode, StdioTransportHandler, TYPES, type TelemetryLevel, TokenDistributionMetrics, TokenUsageMetrics, Tool, ToolDefinition, ToolMetricRow, ToolMetricsSort, ToolTokenAttribution, TraceTimelineEntry, TransportConfig, TransportHandler, TransportMode, TypeKey, TypeSymbol, createNodeTelemetry, createServer, getLogSinkOtelEndpoint, logs as log, resolveLogSinkOtelEndpoint, resolveLogSinkPort, resolveNodeTelemetryEndpoints, trace };
953
+ export { AgentIssue, AgentIssueCategory, AgentIssueFilters, AgentIssuesReport, LogAggregation, LogEntry, LogLevel, LogMetricGroupRow, LogMetricsFilters, LogMetricsGroupBy, LogMetricsReport, LogMetricsSort, type LogSinkPortResult, NewLogEntry, type NodeTelemetryBackend, type NodeTelemetryEndpointSource, type NodeTelemetryHandle, type NodeTelemetryLogOptions, type NodeTelemetryLogger, type NodeTelemetryOptions, type NodeTelemetrySpanOptions, type PiTelemetryExtensionOptions, QueryFilters, type ResolveLogSinkPortOptions, type ResolvedNodeTelemetryEndpoints, SearchOptions, SpanKind, SpanStatusCode, StdioTransportHandler, TYPES, type TelemetryLevel, TokenDistributionMetrics, TokenUsageMetrics, Tool, ToolDefinition, ToolMetricRow, ToolMetricsSort, ToolTokenAttribution, TraceTimelineEntry, TransportConfig, TransportHandler, TransportMode, TypeKey, TypeSymbol, createNodeTelemetry, createPiTelemetryExtension, createServer, getLogSinkOtelEndpoint, logs as log, resolveLogSinkOtelEndpoint, resolveLogSinkPort, resolveNodeTelemetryEndpoints, trace };
944
954
  //# sourceMappingURL=index.d.cts.map
package/dist/index.d.mts CHANGED
@@ -3,6 +3,7 @@ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
3
  import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
4
4
  import { z } from "zod";
5
5
  import { Container } from "inversify";
6
+ import { ExtensionAPI } from "@earendil-works/pi-coding-agent";
6
7
  import * as _$drizzle_orm_sqlite_core0 from "drizzle-orm/sqlite-core";
7
8
 
8
9
  //#region src/server/index.d.ts
@@ -922,6 +923,15 @@ declare class StdioTransportHandler implements TransportHandler {
922
923
  stop(): Promise<void>;
923
924
  }
924
925
  //#endregion
926
+ //#region src/extensions/piTelemetry.d.ts
927
+ type TelemetryFactory = (options: NodeTelemetryOptions) => Promise<NodeTelemetryHandle>;
928
+ interface PiTelemetryExtensionOptions {
929
+ allowFileFallback?: boolean;
930
+ env?: NodeJS.ProcessEnv;
931
+ telemetryFactory?: TelemetryFactory;
932
+ }
933
+ declare function createPiTelemetryExtension(options?: PiTelemetryExtensionOptions): (pi: ExtensionAPI) => void;
934
+ //#endregion
925
935
  //#region src/utils/resolveLogSinkPort.d.ts
926
936
  interface LogSinkPortResult {
927
937
  port: number;
@@ -940,5 +950,5 @@ interface ResolveLogSinkPortOptions {
940
950
  declare function resolveLogSinkPort(options: ResolveLogSinkPortOptions): Promise<LogSinkPortResult | undefined>;
941
951
  declare function resolveLogSinkOtelEndpoint(options: ResolveLogSinkPortOptions): Promise<string | undefined>;
942
952
  //#endregion
943
- export { AgentIssue, AgentIssueCategory, AgentIssueFilters, AgentIssuesReport, LogAggregation, LogEntry, LogLevel, LogMetricGroupRow, LogMetricsFilters, LogMetricsGroupBy, LogMetricsReport, LogMetricsSort, type LogSinkPortResult, NewLogEntry, type NodeTelemetryBackend, type NodeTelemetryEndpointSource, type NodeTelemetryHandle, type NodeTelemetryLogOptions, type NodeTelemetryLogger, type NodeTelemetryOptions, type NodeTelemetrySpanOptions, QueryFilters, type ResolveLogSinkPortOptions, type ResolvedNodeTelemetryEndpoints, SearchOptions, SpanKind, SpanStatusCode, StdioTransportHandler, TYPES, type TelemetryLevel, TokenDistributionMetrics, TokenUsageMetrics, Tool, ToolDefinition, ToolMetricRow, ToolMetricsSort, ToolTokenAttribution, TraceTimelineEntry, TransportConfig, TransportHandler, TransportMode, TypeKey, TypeSymbol, createNodeTelemetry, createServer, getLogSinkOtelEndpoint, logs as log, resolveLogSinkOtelEndpoint, resolveLogSinkPort, resolveNodeTelemetryEndpoints, trace };
953
+ export { AgentIssue, AgentIssueCategory, AgentIssueFilters, AgentIssuesReport, LogAggregation, LogEntry, LogLevel, LogMetricGroupRow, LogMetricsFilters, LogMetricsGroupBy, LogMetricsReport, LogMetricsSort, type LogSinkPortResult, NewLogEntry, type NodeTelemetryBackend, type NodeTelemetryEndpointSource, type NodeTelemetryHandle, type NodeTelemetryLogOptions, type NodeTelemetryLogger, type NodeTelemetryOptions, type NodeTelemetrySpanOptions, type PiTelemetryExtensionOptions, QueryFilters, type ResolveLogSinkPortOptions, type ResolvedNodeTelemetryEndpoints, SearchOptions, SpanKind, SpanStatusCode, StdioTransportHandler, TYPES, type TelemetryLevel, TokenDistributionMetrics, TokenUsageMetrics, Tool, ToolDefinition, ToolMetricRow, ToolMetricsSort, ToolTokenAttribution, TraceTimelineEntry, TransportConfig, TransportHandler, TransportMode, TypeKey, TypeSymbol, createNodeTelemetry, createPiTelemetryExtension, createServer, getLogSinkOtelEndpoint, logs as log, resolveLogSinkOtelEndpoint, resolveLogSinkPort, resolveNodeTelemetryEndpoints, trace };
944
954
  //# sourceMappingURL=index.d.mts.map
package/dist/index.mjs CHANGED
@@ -1 +1 @@
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
+ 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";import{t as d}from"./piTelemetry-BPQgGDpj.mjs";export{l as SpanKind,o as SpanStatusCode,t as StdioTransportHandler,c as createNodeTelemetry,d as createPiTelemetryExtension,e as createServer,i as getLogSinkOtelEndpoint,n as log,a as resolveLogSinkOtelEndpoint,u as resolveLogSinkPort,s as resolveNodeTelemetryEndpoints,r as trace};
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./node-Bv2snZci.mjs";function t(e){return e===`1`||e?.toLowerCase()===`true`||e?.toLowerCase()===`yes`}function n(e){try{return JSON.stringify(e)}catch{return`[unserializable]`}}function r(e,t){console.warn(`[log-sink-mcp pi telemetry] ${e} failed: ${t instanceof Error?t.message:String(t)}`)}function i(e){let t={"pi.cwd":e.cwd,"pi.mode":e.mode,"pi.session.id":e.sessionManager.getSessionId()};e.thinkingLevel&&(t[`pi.thinking_level`]=e.thinkingLevel);let n=e.sessionManager.getSessionFile();return n&&(t[`pi.session.file`]=n),e.model&&(t[`gen_ai.provider.name`]=e.model.provider,t[`gen_ai.request.model`]=e.model.id),t}function a(e){let t={"x-agent":`pi`},n=e.AGENT_SESSION_ID??e.PI_SESSION_ID;return n&&(t[`x-agent-session-id`]=n),e.AGENT_PARENT_SESSION_ID&&(t[`x-agent-parent-session-id`]=e.AGENT_PARENT_SESSION_ID),t}function o(o={}){return function(s){let c=o.env??process.env,l=o.telemetryFactory??e,u=c.AGENT_OTEL_REDACT===`0`,d=new Map,f,p,m=e=>c.AGENT_TELEMETRY_DISABLED===`1`?Promise.resolve(void 0):(p??=l({serviceName:`pi`,packageName:`@agimon-ai/log-sink-mcp`,cwd:e.cwd,env:c,discoverEndpoint:!0,enableLogs:!0,enableTraces:t(c.AGENT_OTEL_TRACES),headers:a(c)}).then(async e=>{let n=o.allowFileFallback||t(c.LOG_SINK_PI_FILE_FALLBACK);if(e.backend!==`file`||n)return e;await e.shutdown().catch(e=>r(`File fallback shutdown`,e))}).catch(e=>{r(`Initialization`,e)}),p);s.on(`session_start`,async(e,t)=>{(await m(t))?.logger.info(`pi.session.started`,{attributes:{...i(t),"pi.session.reason":e.reason}})}),s.on(`before_agent_start`,async(e,t)=>{(await m(t))?.logger.info(`pi.user_prompt`,{attributes:{...i(t),"pi.user_message.length":e.prompt.length,"pi.user_message.image_count":e.images?.length??0,...u?{"user.prompt":e.prompt}:{}}})}),s.on(`agent_start`,async(e,t)=>{f=Date.now(),(await m(t))?.logger.info(`pi.agent.started`,{attributes:i(t)})}),s.on(`turn_start`,async(e,t)=>{(await m(t))?.logger.debug(`pi.turn.started`,{attributes:{...i(t),"pi.turn.index":e.turnIndex}})}),s.on(`turn_end`,async(e,t)=>{let n=await m(t),r={...i(t),"pi.turn.index":e.turnIndex,"pi.tool_result.count":e.toolResults.length};e.message.role===`assistant`&&(r[`gen_ai.response.model`]=e.message.responseModel??e.message.model,r[`gen_ai.response.finish_reasons`]=e.message.stopReason,r[`gen_ai.usage.input_tokens`]=e.message.usage.input,r[`gen_ai.usage.output_tokens`]=e.message.usage.output,r[`gen_ai.usage.cache_read_tokens`]=e.message.usage.cacheRead,r[`gen_ai.usage.cache_write_tokens`]=e.message.usage.cacheWrite,r[`gen_ai.usage.total_tokens`]=e.message.usage.totalTokens,r[`gen_ai.usage.cost`]=e.message.usage.cost.total,e.message.usage.reasoning!==void 0&&(r[`gen_ai.usage.reasoning_tokens`]=e.message.usage.reasoning)),n?.logger.info(`pi.turn.finished`,{attributes:r})}),s.on(`tool_execution_start`,async(e,t)=>{d.set(e.toolCallId,Date.now()),(await m(t))?.logger.debug(`pi.tool_call`,{attributes:{...i(t),"tool.name":e.toolName,"tool.call.id":e.toolCallId,...u?{"tool.input":n(e.args)}:{}}})}),s.on(`tool_execution_end`,async(e,t)=>{let r=d.get(e.toolCallId);d.delete(e.toolCallId),(await m(t))?.logger.info(`pi.tool_result`,{attributes:{...i(t),success:!e.isError,tool_name:e.toolName,"tool.name":e.toolName,"tool.call.id":e.toolCallId,"tool.result.error":e.isError,...r===void 0?{}:{"tool.duration_ms":Date.now()-r},...u?{"tool.result":n(e.result)}:{}}})}),s.on(`after_provider_response`,async(e,t)=>{let n=await m(t),r={attributes:{...i(t),status_code:e.status,"http.response.status_code":e.status}};e.status>=400?n?.logger.error(`pi.api_error`,r):n?.logger.debug(`pi.api_response`,r)}),s.on(`model_select`,async(e,t)=>{(await m(t))?.logger.info(`pi.model.selected`,{attributes:{...i(t),"pi.model.source":e.source,"gen_ai.provider.name":e.model.provider,"gen_ai.request.model":e.model.id}})}),s.on(`agent_end`,async(e,t)=>{let n=await m(t);n?.logger.info(`pi.agent.finished`,{attributes:{...i(t),"pi.message.count":e.messages.length,...f===void 0?{}:{"pi.agent.duration_ms":Date.now()-f}}}),f=void 0,await n?.flush().catch(e=>r(`Flush`,e))}),s.on(`agent_settled`,async(e,t)=>{(await m(t))?.logger.debug(`pi.agent.settled`,{attributes:i(t)})}),s.on(`session_shutdown`,async(e,t)=>{let n=await m(t);n?.logger.info(`pi.session.finished`,{attributes:{...i(t),"pi.session.reason":e.reason}}),await n?.shutdown().catch(e=>r(`Shutdown`,e))})}}export{o as t};
2
+ //# sourceMappingURL=piTelemetry-BPQgGDpj.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"piTelemetry-BPQgGDpj.mjs","names":[],"sources":["../src/extensions/piTelemetry.ts"],"sourcesContent":["import type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\nimport { createNodeTelemetry, type NodeTelemetryHandle, type NodeTelemetryOptions } from '../telemetry/node.js';\n\nconst SERVICE_NAME = 'pi';\nconst PACKAGE_NAME = '@agimon-ai/log-sink-mcp';\n\ntype TelemetryFactory = (options: NodeTelemetryOptions) => Promise<NodeTelemetryHandle>;\n\nexport interface PiTelemetryExtensionOptions {\n allowFileFallback?: boolean;\n env?: NodeJS.ProcessEnv;\n telemetryFactory?: TelemetryFactory;\n}\n\nfunction isEnabled(value: string | undefined): boolean {\n return value === '1' || value?.toLowerCase() === 'true' || value?.toLowerCase() === 'yes';\n}\n\nfunction serialize(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return '[unserializable]';\n }\n}\n\nfunction reportFailure(operation: string, error: unknown): void {\n console.warn(\n `[log-sink-mcp pi telemetry] ${operation} failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n}\n\nfunction contextAttributes(ctx: ExtensionContext): Record<string, string | number | boolean> {\n const attributes: Record<string, string | number | boolean> = {\n 'pi.cwd': ctx.cwd,\n 'pi.mode': ctx.mode,\n 'pi.session.id': ctx.sessionManager.getSessionId(),\n };\n\n if (ctx.thinkingLevel) attributes['pi.thinking_level'] = ctx.thinkingLevel;\n const sessionFile = ctx.sessionManager.getSessionFile();\n if (sessionFile) attributes['pi.session.file'] = sessionFile;\n if (ctx.model) {\n attributes['gen_ai.provider.name'] = ctx.model.provider;\n attributes['gen_ai.request.model'] = ctx.model.id;\n }\n\n return attributes;\n}\n\nfunction telemetryHeaders(env: NodeJS.ProcessEnv): Record<string, string> {\n const headers: Record<string, string> = { 'x-agent': SERVICE_NAME };\n const sessionId = env.AGENT_SESSION_ID ?? env.PI_SESSION_ID;\n if (sessionId) headers['x-agent-session-id'] = sessionId;\n if (env.AGENT_PARENT_SESSION_ID) headers['x-agent-parent-session-id'] = env.AGENT_PARENT_SESSION_ID;\n return headers;\n}\n\nexport function createPiTelemetryExtension(options: PiTelemetryExtensionOptions = {}) {\n return function registerPiTelemetry(pi: ExtensionAPI): void {\n const env = options.env ?? process.env;\n const telemetryFactory = options.telemetryFactory ?? createNodeTelemetry;\n const includeSensitiveDetails = env.AGENT_OTEL_REDACT === '0';\n const toolStartedAt = new Map<string, number>();\n let agentStartedAt: number | undefined;\n let telemetryPromise: Promise<NodeTelemetryHandle | undefined> | undefined;\n\n const getTelemetry = (ctx: ExtensionContext): Promise<NodeTelemetryHandle | undefined> => {\n if (env.AGENT_TELEMETRY_DISABLED === '1') return Promise.resolve(undefined);\n\n telemetryPromise ??= telemetryFactory({\n serviceName: SERVICE_NAME,\n packageName: PACKAGE_NAME,\n cwd: ctx.cwd,\n env,\n discoverEndpoint: true,\n enableLogs: true,\n enableTraces: isEnabled(env.AGENT_OTEL_TRACES),\n headers: telemetryHeaders(env),\n })\n .then(async (telemetry) => {\n const allowFileFallback = options.allowFileFallback || isEnabled(env.LOG_SINK_PI_FILE_FALLBACK);\n if (telemetry.backend !== 'file' || allowFileFallback) return telemetry;\n\n await telemetry.shutdown().catch((error: unknown) => reportFailure('File fallback shutdown', error));\n return undefined;\n })\n .catch((error: unknown) => {\n reportFailure('Initialization', error);\n return undefined;\n });\n return telemetryPromise;\n };\n\n pi.on('session_start', async (event, ctx) => {\n const telemetry = await getTelemetry(ctx);\n telemetry?.logger.info('pi.session.started', {\n attributes: {\n ...contextAttributes(ctx),\n 'pi.session.reason': event.reason,\n },\n });\n });\n\n pi.on('before_agent_start', async (event, ctx) => {\n const telemetry = await getTelemetry(ctx);\n telemetry?.logger.info('pi.user_prompt', {\n attributes: {\n ...contextAttributes(ctx),\n 'pi.user_message.length': event.prompt.length,\n 'pi.user_message.image_count': event.images?.length ?? 0,\n ...(includeSensitiveDetails ? { 'user.prompt': event.prompt } : {}),\n },\n });\n });\n\n pi.on('agent_start', async (_event, ctx) => {\n agentStartedAt = Date.now();\n const telemetry = await getTelemetry(ctx);\n telemetry?.logger.info('pi.agent.started', {\n attributes: contextAttributes(ctx),\n });\n });\n\n pi.on('turn_start', async (event, ctx) => {\n const telemetry = await getTelemetry(ctx);\n telemetry?.logger.debug('pi.turn.started', {\n attributes: {\n ...contextAttributes(ctx),\n 'pi.turn.index': event.turnIndex,\n },\n });\n });\n\n pi.on('turn_end', async (event, ctx) => {\n const telemetry = await getTelemetry(ctx);\n const attributes: Record<string, string | number | boolean> = {\n ...contextAttributes(ctx),\n 'pi.turn.index': event.turnIndex,\n 'pi.tool_result.count': event.toolResults.length,\n };\n\n if (event.message.role === 'assistant') {\n attributes['gen_ai.response.model'] = event.message.responseModel ?? event.message.model;\n attributes['gen_ai.response.finish_reasons'] = event.message.stopReason;\n attributes['gen_ai.usage.input_tokens'] = event.message.usage.input;\n attributes['gen_ai.usage.output_tokens'] = event.message.usage.output;\n attributes['gen_ai.usage.cache_read_tokens'] = event.message.usage.cacheRead;\n attributes['gen_ai.usage.cache_write_tokens'] = event.message.usage.cacheWrite;\n attributes['gen_ai.usage.total_tokens'] = event.message.usage.totalTokens;\n attributes['gen_ai.usage.cost'] = event.message.usage.cost.total;\n if (event.message.usage.reasoning !== undefined) {\n attributes['gen_ai.usage.reasoning_tokens'] = event.message.usage.reasoning;\n }\n }\n\n telemetry?.logger.info('pi.turn.finished', { attributes });\n });\n\n pi.on('tool_execution_start', async (event, ctx) => {\n toolStartedAt.set(event.toolCallId, Date.now());\n const telemetry = await getTelemetry(ctx);\n telemetry?.logger.debug('pi.tool_call', {\n attributes: {\n ...contextAttributes(ctx),\n 'tool.name': event.toolName,\n 'tool.call.id': event.toolCallId,\n ...(includeSensitiveDetails ? { 'tool.input': serialize(event.args) } : {}),\n },\n });\n });\n\n pi.on('tool_execution_end', async (event, ctx) => {\n const startedAt = toolStartedAt.get(event.toolCallId);\n toolStartedAt.delete(event.toolCallId);\n const telemetry = await getTelemetry(ctx);\n telemetry?.logger.info('pi.tool_result', {\n attributes: {\n ...contextAttributes(ctx),\n success: !event.isError,\n tool_name: event.toolName,\n 'tool.name': event.toolName,\n 'tool.call.id': event.toolCallId,\n 'tool.result.error': event.isError,\n ...(startedAt === undefined ? {} : { 'tool.duration_ms': Date.now() - startedAt }),\n ...(includeSensitiveDetails ? { 'tool.result': serialize(event.result) } : {}),\n },\n });\n });\n\n pi.on('after_provider_response', async (event, ctx) => {\n const telemetry = await getTelemetry(ctx);\n const options = {\n attributes: {\n ...contextAttributes(ctx),\n status_code: event.status,\n 'http.response.status_code': event.status,\n },\n };\n if (event.status >= 400) telemetry?.logger.error('pi.api_error', options);\n else telemetry?.logger.debug('pi.api_response', options);\n });\n\n pi.on('model_select', async (event, ctx) => {\n const telemetry = await getTelemetry(ctx);\n telemetry?.logger.info('pi.model.selected', {\n attributes: {\n ...contextAttributes(ctx),\n 'pi.model.source': event.source,\n 'gen_ai.provider.name': event.model.provider,\n 'gen_ai.request.model': event.model.id,\n },\n });\n });\n\n pi.on('agent_end', async (event, ctx) => {\n const telemetry = await getTelemetry(ctx);\n telemetry?.logger.info('pi.agent.finished', {\n attributes: {\n ...contextAttributes(ctx),\n 'pi.message.count': event.messages.length,\n ...(agentStartedAt === undefined ? {} : { 'pi.agent.duration_ms': Date.now() - agentStartedAt }),\n },\n });\n agentStartedAt = undefined;\n await telemetry?.flush().catch((error: unknown) => reportFailure('Flush', error));\n });\n\n pi.on('agent_settled', async (_event, ctx) => {\n const telemetry = await getTelemetry(ctx);\n telemetry?.logger.debug('pi.agent.settled', {\n attributes: contextAttributes(ctx),\n });\n });\n\n pi.on('session_shutdown', async (event, ctx) => {\n const telemetry = await getTelemetry(ctx);\n telemetry?.logger.info('pi.session.finished', {\n attributes: {\n ...contextAttributes(ctx),\n 'pi.session.reason': event.reason,\n },\n });\n await telemetry?.shutdown().catch((error: unknown) => reportFailure('Shutdown', error));\n });\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e=require(`./node-9pwprHry.cjs`);function t(e){return e===`1`||e?.toLowerCase()===`true`||e?.toLowerCase()===`yes`}function n(e){try{return JSON.stringify(e)}catch{return`[unserializable]`}}function r(e,t){console.warn(`[log-sink-mcp pi telemetry] ${e} failed: ${t instanceof Error?t.message:String(t)}`)}function i(e){let t={"pi.cwd":e.cwd,"pi.mode":e.mode,"pi.session.id":e.sessionManager.getSessionId()};e.thinkingLevel&&(t[`pi.thinking_level`]=e.thinkingLevel);let n=e.sessionManager.getSessionFile();return n&&(t[`pi.session.file`]=n),e.model&&(t[`gen_ai.provider.name`]=e.model.provider,t[`gen_ai.request.model`]=e.model.id),t}function a(e){let t={"x-agent":`pi`},n=e.AGENT_SESSION_ID??e.PI_SESSION_ID;return n&&(t[`x-agent-session-id`]=n),e.AGENT_PARENT_SESSION_ID&&(t[`x-agent-parent-session-id`]=e.AGENT_PARENT_SESSION_ID),t}function o(o={}){return function(s){let c=o.env??process.env,l=o.telemetryFactory??e.t,u=c.AGENT_OTEL_REDACT===`0`,d=new Map,f,p,m=e=>c.AGENT_TELEMETRY_DISABLED===`1`?Promise.resolve(void 0):(p??=l({serviceName:`pi`,packageName:`@agimon-ai/log-sink-mcp`,cwd:e.cwd,env:c,discoverEndpoint:!0,enableLogs:!0,enableTraces:t(c.AGENT_OTEL_TRACES),headers:a(c)}).then(async e=>{let n=o.allowFileFallback||t(c.LOG_SINK_PI_FILE_FALLBACK);if(e.backend!==`file`||n)return e;await e.shutdown().catch(e=>r(`File fallback shutdown`,e))}).catch(e=>{r(`Initialization`,e)}),p);s.on(`session_start`,async(e,t)=>{(await m(t))?.logger.info(`pi.session.started`,{attributes:{...i(t),"pi.session.reason":e.reason}})}),s.on(`before_agent_start`,async(e,t)=>{(await m(t))?.logger.info(`pi.user_prompt`,{attributes:{...i(t),"pi.user_message.length":e.prompt.length,"pi.user_message.image_count":e.images?.length??0,...u?{"user.prompt":e.prompt}:{}}})}),s.on(`agent_start`,async(e,t)=>{f=Date.now(),(await m(t))?.logger.info(`pi.agent.started`,{attributes:i(t)})}),s.on(`turn_start`,async(e,t)=>{(await m(t))?.logger.debug(`pi.turn.started`,{attributes:{...i(t),"pi.turn.index":e.turnIndex}})}),s.on(`turn_end`,async(e,t)=>{let n=await m(t),r={...i(t),"pi.turn.index":e.turnIndex,"pi.tool_result.count":e.toolResults.length};e.message.role===`assistant`&&(r[`gen_ai.response.model`]=e.message.responseModel??e.message.model,r[`gen_ai.response.finish_reasons`]=e.message.stopReason,r[`gen_ai.usage.input_tokens`]=e.message.usage.input,r[`gen_ai.usage.output_tokens`]=e.message.usage.output,r[`gen_ai.usage.cache_read_tokens`]=e.message.usage.cacheRead,r[`gen_ai.usage.cache_write_tokens`]=e.message.usage.cacheWrite,r[`gen_ai.usage.total_tokens`]=e.message.usage.totalTokens,r[`gen_ai.usage.cost`]=e.message.usage.cost.total,e.message.usage.reasoning!==void 0&&(r[`gen_ai.usage.reasoning_tokens`]=e.message.usage.reasoning)),n?.logger.info(`pi.turn.finished`,{attributes:r})}),s.on(`tool_execution_start`,async(e,t)=>{d.set(e.toolCallId,Date.now()),(await m(t))?.logger.debug(`pi.tool_call`,{attributes:{...i(t),"tool.name":e.toolName,"tool.call.id":e.toolCallId,...u?{"tool.input":n(e.args)}:{}}})}),s.on(`tool_execution_end`,async(e,t)=>{let r=d.get(e.toolCallId);d.delete(e.toolCallId),(await m(t))?.logger.info(`pi.tool_result`,{attributes:{...i(t),success:!e.isError,tool_name:e.toolName,"tool.name":e.toolName,"tool.call.id":e.toolCallId,"tool.result.error":e.isError,...r===void 0?{}:{"tool.duration_ms":Date.now()-r},...u?{"tool.result":n(e.result)}:{}}})}),s.on(`after_provider_response`,async(e,t)=>{let n=await m(t),r={attributes:{...i(t),status_code:e.status,"http.response.status_code":e.status}};e.status>=400?n?.logger.error(`pi.api_error`,r):n?.logger.debug(`pi.api_response`,r)}),s.on(`model_select`,async(e,t)=>{(await m(t))?.logger.info(`pi.model.selected`,{attributes:{...i(t),"pi.model.source":e.source,"gen_ai.provider.name":e.model.provider,"gen_ai.request.model":e.model.id}})}),s.on(`agent_end`,async(e,t)=>{let n=await m(t);n?.logger.info(`pi.agent.finished`,{attributes:{...i(t),"pi.message.count":e.messages.length,...f===void 0?{}:{"pi.agent.duration_ms":Date.now()-f}}}),f=void 0,await n?.flush().catch(e=>r(`Flush`,e))}),s.on(`agent_settled`,async(e,t)=>{(await m(t))?.logger.debug(`pi.agent.settled`,{attributes:i(t)})}),s.on(`session_shutdown`,async(e,t)=>{let n=await m(t);n?.logger.info(`pi.session.finished`,{attributes:{...i(t),"pi.session.reason":e.reason}}),await n?.shutdown().catch(e=>r(`Shutdown`,e))})}}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return o}});
2
+ //# sourceMappingURL=piTelemetry-P-o6KRQk.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"piTelemetry-P-o6KRQk.cjs","names":["createNodeTelemetry"],"sources":["../src/extensions/piTelemetry.ts"],"sourcesContent":["import type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\nimport { createNodeTelemetry, type NodeTelemetryHandle, type NodeTelemetryOptions } from '../telemetry/node.js';\n\nconst SERVICE_NAME = 'pi';\nconst PACKAGE_NAME = '@agimon-ai/log-sink-mcp';\n\ntype TelemetryFactory = (options: NodeTelemetryOptions) => Promise<NodeTelemetryHandle>;\n\nexport interface PiTelemetryExtensionOptions {\n allowFileFallback?: boolean;\n env?: NodeJS.ProcessEnv;\n telemetryFactory?: TelemetryFactory;\n}\n\nfunction isEnabled(value: string | undefined): boolean {\n return value === '1' || value?.toLowerCase() === 'true' || value?.toLowerCase() === 'yes';\n}\n\nfunction serialize(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return '[unserializable]';\n }\n}\n\nfunction reportFailure(operation: string, error: unknown): void {\n console.warn(\n `[log-sink-mcp pi telemetry] ${operation} failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n}\n\nfunction contextAttributes(ctx: ExtensionContext): Record<string, string | number | boolean> {\n const attributes: Record<string, string | number | boolean> = {\n 'pi.cwd': ctx.cwd,\n 'pi.mode': ctx.mode,\n 'pi.session.id': ctx.sessionManager.getSessionId(),\n };\n\n if (ctx.thinkingLevel) attributes['pi.thinking_level'] = ctx.thinkingLevel;\n const sessionFile = ctx.sessionManager.getSessionFile();\n if (sessionFile) attributes['pi.session.file'] = sessionFile;\n if (ctx.model) {\n attributes['gen_ai.provider.name'] = ctx.model.provider;\n attributes['gen_ai.request.model'] = ctx.model.id;\n }\n\n return attributes;\n}\n\nfunction telemetryHeaders(env: NodeJS.ProcessEnv): Record<string, string> {\n const headers: Record<string, string> = { 'x-agent': SERVICE_NAME };\n const sessionId = env.AGENT_SESSION_ID ?? env.PI_SESSION_ID;\n if (sessionId) headers['x-agent-session-id'] = sessionId;\n if (env.AGENT_PARENT_SESSION_ID) headers['x-agent-parent-session-id'] = env.AGENT_PARENT_SESSION_ID;\n return headers;\n}\n\nexport function createPiTelemetryExtension(options: PiTelemetryExtensionOptions = {}) {\n return function registerPiTelemetry(pi: ExtensionAPI): void {\n const env = options.env ?? process.env;\n const telemetryFactory = options.telemetryFactory ?? createNodeTelemetry;\n const includeSensitiveDetails = env.AGENT_OTEL_REDACT === '0';\n const toolStartedAt = new Map<string, number>();\n let agentStartedAt: number | undefined;\n let telemetryPromise: Promise<NodeTelemetryHandle | undefined> | undefined;\n\n const getTelemetry = (ctx: ExtensionContext): Promise<NodeTelemetryHandle | undefined> => {\n if (env.AGENT_TELEMETRY_DISABLED === '1') return Promise.resolve(undefined);\n\n telemetryPromise ??= telemetryFactory({\n serviceName: SERVICE_NAME,\n packageName: PACKAGE_NAME,\n cwd: ctx.cwd,\n env,\n discoverEndpoint: true,\n enableLogs: true,\n enableTraces: isEnabled(env.AGENT_OTEL_TRACES),\n headers: telemetryHeaders(env),\n })\n .then(async (telemetry) => {\n const allowFileFallback = options.allowFileFallback || isEnabled(env.LOG_SINK_PI_FILE_FALLBACK);\n if (telemetry.backend !== 'file' || allowFileFallback) return telemetry;\n\n await telemetry.shutdown().catch((error: unknown) => reportFailure('File fallback shutdown', error));\n return undefined;\n })\n .catch((error: unknown) => {\n reportFailure('Initialization', error);\n return undefined;\n });\n return telemetryPromise;\n };\n\n pi.on('session_start', async (event, ctx) => {\n const telemetry = await getTelemetry(ctx);\n telemetry?.logger.info('pi.session.started', {\n attributes: {\n ...contextAttributes(ctx),\n 'pi.session.reason': event.reason,\n },\n });\n });\n\n pi.on('before_agent_start', async (event, ctx) => {\n const telemetry = await getTelemetry(ctx);\n telemetry?.logger.info('pi.user_prompt', {\n attributes: {\n ...contextAttributes(ctx),\n 'pi.user_message.length': event.prompt.length,\n 'pi.user_message.image_count': event.images?.length ?? 0,\n ...(includeSensitiveDetails ? { 'user.prompt': event.prompt } : {}),\n },\n });\n });\n\n pi.on('agent_start', async (_event, ctx) => {\n agentStartedAt = Date.now();\n const telemetry = await getTelemetry(ctx);\n telemetry?.logger.info('pi.agent.started', {\n attributes: contextAttributes(ctx),\n });\n });\n\n pi.on('turn_start', async (event, ctx) => {\n const telemetry = await getTelemetry(ctx);\n telemetry?.logger.debug('pi.turn.started', {\n attributes: {\n ...contextAttributes(ctx),\n 'pi.turn.index': event.turnIndex,\n },\n });\n });\n\n pi.on('turn_end', async (event, ctx) => {\n const telemetry = await getTelemetry(ctx);\n const attributes: Record<string, string | number | boolean> = {\n ...contextAttributes(ctx),\n 'pi.turn.index': event.turnIndex,\n 'pi.tool_result.count': event.toolResults.length,\n };\n\n if (event.message.role === 'assistant') {\n attributes['gen_ai.response.model'] = event.message.responseModel ?? event.message.model;\n attributes['gen_ai.response.finish_reasons'] = event.message.stopReason;\n attributes['gen_ai.usage.input_tokens'] = event.message.usage.input;\n attributes['gen_ai.usage.output_tokens'] = event.message.usage.output;\n attributes['gen_ai.usage.cache_read_tokens'] = event.message.usage.cacheRead;\n attributes['gen_ai.usage.cache_write_tokens'] = event.message.usage.cacheWrite;\n attributes['gen_ai.usage.total_tokens'] = event.message.usage.totalTokens;\n attributes['gen_ai.usage.cost'] = event.message.usage.cost.total;\n if (event.message.usage.reasoning !== undefined) {\n attributes['gen_ai.usage.reasoning_tokens'] = event.message.usage.reasoning;\n }\n }\n\n telemetry?.logger.info('pi.turn.finished', { attributes });\n });\n\n pi.on('tool_execution_start', async (event, ctx) => {\n toolStartedAt.set(event.toolCallId, Date.now());\n const telemetry = await getTelemetry(ctx);\n telemetry?.logger.debug('pi.tool_call', {\n attributes: {\n ...contextAttributes(ctx),\n 'tool.name': event.toolName,\n 'tool.call.id': event.toolCallId,\n ...(includeSensitiveDetails ? { 'tool.input': serialize(event.args) } : {}),\n },\n });\n });\n\n pi.on('tool_execution_end', async (event, ctx) => {\n const startedAt = toolStartedAt.get(event.toolCallId);\n toolStartedAt.delete(event.toolCallId);\n const telemetry = await getTelemetry(ctx);\n telemetry?.logger.info('pi.tool_result', {\n attributes: {\n ...contextAttributes(ctx),\n success: !event.isError,\n tool_name: event.toolName,\n 'tool.name': event.toolName,\n 'tool.call.id': event.toolCallId,\n 'tool.result.error': event.isError,\n ...(startedAt === undefined ? {} : { 'tool.duration_ms': Date.now() - startedAt }),\n ...(includeSensitiveDetails ? { 'tool.result': serialize(event.result) } : {}),\n },\n });\n });\n\n pi.on('after_provider_response', async (event, ctx) => {\n const telemetry = await getTelemetry(ctx);\n const options = {\n attributes: {\n ...contextAttributes(ctx),\n status_code: event.status,\n 'http.response.status_code': event.status,\n },\n };\n if (event.status >= 400) telemetry?.logger.error('pi.api_error', options);\n else telemetry?.logger.debug('pi.api_response', options);\n });\n\n pi.on('model_select', async (event, ctx) => {\n const telemetry = await getTelemetry(ctx);\n telemetry?.logger.info('pi.model.selected', {\n attributes: {\n ...contextAttributes(ctx),\n 'pi.model.source': event.source,\n 'gen_ai.provider.name': event.model.provider,\n 'gen_ai.request.model': event.model.id,\n },\n });\n });\n\n pi.on('agent_end', async (event, ctx) => {\n const telemetry = await getTelemetry(ctx);\n telemetry?.logger.info('pi.agent.finished', {\n attributes: {\n ...contextAttributes(ctx),\n 'pi.message.count': event.messages.length,\n ...(agentStartedAt === undefined ? {} : { 'pi.agent.duration_ms': Date.now() - agentStartedAt }),\n },\n });\n agentStartedAt = undefined;\n await telemetry?.flush().catch((error: unknown) => reportFailure('Flush', error));\n });\n\n pi.on('agent_settled', async (_event, ctx) => {\n const telemetry = await getTelemetry(ctx);\n telemetry?.logger.debug('pi.agent.settled', {\n attributes: contextAttributes(ctx),\n });\n });\n\n pi.on('session_shutdown', async (event, ctx) => {\n const telemetry = await getTelemetry(ctx);\n telemetry?.logger.info('pi.session.finished', {\n attributes: {\n ...contextAttributes(ctx),\n 'pi.session.reason': event.reason,\n },\n });\n await telemetry?.shutdown().catch((error: unknown) => reportFailure('Shutdown', error));\n });\n };\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,13 @@
1
1
  {
2
2
  "name": "@agimon-ai/log-sink-mcp",
3
3
  "description": "Log sink MCP server with HTTP ingestion and AI analysis",
4
- "version": "0.24.1",
4
+ "version": "0.24.3",
5
5
  "license": "BUSL-1.1",
6
6
  "keywords": [
7
7
  "mcp",
8
8
  "model-context-protocol",
9
+ "pi-package",
10
+ "telemetry",
9
11
  "typescript"
10
12
  ],
11
13
  "bin": {
@@ -41,14 +43,21 @@
41
43
  "sqlite-vec": "0.1.9",
42
44
  "ulidx": "2.4.1",
43
45
  "yaml": "2.8.3",
44
- "@agimon-ai/foundation-process-registry": "0.24.1",
45
- "@agimon-ai/foundation-port-registry": "0.24.1",
46
- "@agimon-ai/foundation-validator": "0.21.1"
46
+ "@agimon-ai/foundation-port-registry": "0.24.3",
47
+ "@agimon-ai/foundation-validator": "0.21.3",
48
+ "@agimon-ai/foundation-process-registry": "0.24.3"
47
49
  },
48
50
  "peerDependencies": {
51
+ "@earendil-works/pi-coding-agent": "*",
49
52
  "zod": "^4.4.3"
50
53
  },
54
+ "peerDependenciesMeta": {
55
+ "@earendil-works/pi-coding-agent": {
56
+ "optional": true
57
+ }
58
+ },
51
59
  "devDependencies": {
60
+ "@earendil-works/pi-coding-agent": "0.82.1",
52
61
  "@types/bun": "1.3.13",
53
62
  "@types/express": "5.0.6",
54
63
  "@types/node": "25.6.0",
@@ -67,12 +76,21 @@
67
76
  "import": "./dist/cli.mjs",
68
77
  "require": "./dist/cli.cjs"
69
78
  },
79
+ "./extensions/pi": {
80
+ "import": "./dist/extensions/pi.mjs",
81
+ "require": "./dist/extensions/pi.cjs"
82
+ },
70
83
  "./telemetry/node": {
71
84
  "import": "./dist/telemetry/node.mjs",
72
85
  "require": "./dist/telemetry/node.cjs"
73
86
  },
74
87
  "./package.json": "./package.json"
75
88
  },
89
+ "pi": {
90
+ "extensions": [
91
+ "./dist/extensions/pi.mjs"
92
+ ]
93
+ },
76
94
  "publishConfig": {
77
95
  "access": "public"
78
96
  },