@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.
- package/dist/extensions/pi.cjs +2 -0
- package/dist/extensions/pi.cjs.map +1 -0
- package/dist/extensions/pi.d.cts +6 -0
- package/dist/extensions/pi.d.mts +7 -0
- package/dist/extensions/pi.mjs +2 -0
- package/dist/extensions/pi.mjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +11 -1
- package/dist/index.d.mts +11 -1
- package/dist/index.mjs +1 -1
- package/dist/piTelemetry-BPQgGDpj.mjs +2 -0
- package/dist/piTelemetry-BPQgGDpj.mjs.map +1 -0
- package/dist/piTelemetry-P-o6KRQk.cjs +2 -0
- package/dist/piTelemetry-P-o6KRQk.cjs.map +1 -0
- package/package.json +22 -4
|
@@ -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,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 @@
|
|
|
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
|
|
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.
|
|
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-
|
|
45
|
-
"@agimon-ai/foundation-
|
|
46
|
-
"@agimon-ai/foundation-
|
|
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
|
},
|