@damngamerz/pi-otel 0.1.0-bootstrap.0

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.
Files changed (90) hide show
  1. package/ACKNOWLEDGEMENTS.md +7 -0
  2. package/CHANGELOG.md +10 -0
  3. package/LICENSE +21 -0
  4. package/LICENSES/Apache-2.0.txt +202 -0
  5. package/NOTICE +15 -0
  6. package/README.md +120 -0
  7. package/SECURITY.md +24 -0
  8. package/dist/commands/flush.d.ts +4 -0
  9. package/dist/commands/flush.d.ts.map +1 -0
  10. package/dist/commands/flush.js +20 -0
  11. package/dist/commands/flush.js.map +1 -0
  12. package/dist/commands/status.d.ts +5 -0
  13. package/dist/commands/status.d.ts.map +1 -0
  14. package/dist/commands/status.js +47 -0
  15. package/dist/commands/status.js.map +1 -0
  16. package/dist/config.d.ts +41 -0
  17. package/dist/config.d.ts.map +1 -0
  18. package/dist/config.js +260 -0
  19. package/dist/config.js.map +1 -0
  20. package/dist/evaluation/evaluator.d.ts +11 -0
  21. package/dist/evaluation/evaluator.d.ts.map +1 -0
  22. package/dist/evaluation/evaluator.js +55 -0
  23. package/dist/evaluation/evaluator.js.map +1 -0
  24. package/dist/evaluation/parser.d.ts +3 -0
  25. package/dist/evaluation/parser.d.ts.map +1 -0
  26. package/dist/evaluation/parser.js +42 -0
  27. package/dist/evaluation/parser.js.map +1 -0
  28. package/dist/evaluation/prompt.d.ts +2 -0
  29. package/dist/evaluation/prompt.d.ts.map +1 -0
  30. package/dist/evaluation/prompt.js +16 -0
  31. package/dist/evaluation/prompt.js.map +1 -0
  32. package/dist/evaluation/sampling.d.ts +9 -0
  33. package/dist/evaluation/sampling.d.ts.map +1 -0
  34. package/dist/evaluation/sampling.js +25 -0
  35. package/dist/evaluation/sampling.js.map +1 -0
  36. package/dist/evaluation/types.d.ts +19 -0
  37. package/dist/evaluation/types.d.ts.map +1 -0
  38. package/dist/evaluation/types.js +2 -0
  39. package/dist/evaluation/types.js.map +1 -0
  40. package/dist/index.d.ts +4 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +151 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/lifecycle.d.ts +3 -0
  45. package/dist/lifecycle.d.ts.map +1 -0
  46. package/dist/lifecycle.js +15 -0
  47. package/dist/lifecycle.js.map +1 -0
  48. package/dist/privacy/content-policy.d.ts +8 -0
  49. package/dist/privacy/content-policy.d.ts.map +1 -0
  50. package/dist/privacy/content-policy.js +48 -0
  51. package/dist/privacy/content-policy.js.map +1 -0
  52. package/dist/privacy/sanitization.d.ts +5 -0
  53. package/dist/privacy/sanitization.d.ts.map +1 -0
  54. package/dist/privacy/sanitization.js +42 -0
  55. package/dist/privacy/sanitization.js.map +1 -0
  56. package/dist/privacy/secret-detector.d.ts +2 -0
  57. package/dist/privacy/secret-detector.d.ts.map +1 -0
  58. package/dist/privacy/secret-detector.js +14 -0
  59. package/dist/privacy/secret-detector.js.map +1 -0
  60. package/dist/telemetry/attributes.d.ts +11 -0
  61. package/dist/telemetry/attributes.d.ts.map +1 -0
  62. package/dist/telemetry/attributes.js +13 -0
  63. package/dist/telemetry/attributes.js.map +1 -0
  64. package/dist/telemetry/instruments.d.ts +17 -0
  65. package/dist/telemetry/instruments.d.ts.map +1 -0
  66. package/dist/telemetry/instruments.js +54 -0
  67. package/dist/telemetry/instruments.js.map +1 -0
  68. package/dist/telemetry/providers.d.ts +21 -0
  69. package/dist/telemetry/providers.d.ts.map +1 -0
  70. package/dist/telemetry/providers.js +88 -0
  71. package/dist/telemetry/providers.js.map +1 -0
  72. package/dist/telemetry/traces.d.ts +44 -0
  73. package/dist/telemetry/traces.d.ts.map +1 -0
  74. package/dist/telemetry/traces.js +265 -0
  75. package/dist/telemetry/traces.js.map +1 -0
  76. package/dist/telemetry/usage.d.ts +11 -0
  77. package/dist/telemetry/usage.d.ts.map +1 -0
  78. package/dist/telemetry/usage.js +25 -0
  79. package/dist/telemetry/usage.js.map +1 -0
  80. package/docs/configuration.md +61 -0
  81. package/docs/evaluation.md +38 -0
  82. package/docs/metrics.md +27 -0
  83. package/docs/operations.md +41 -0
  84. package/docs/privacy.md +38 -0
  85. package/examples/grafana-lgtm/LICENSE +6 -0
  86. package/examples/grafana-lgtm/README.md +47 -0
  87. package/examples/grafana-lgtm/compose.yaml +16 -0
  88. package/examples/grafana-lgtm/dashboard.json +616 -0
  89. package/examples/grafana-lgtm/provisioning.yaml +9 -0
  90. package/package.json +87 -0
package/dist/index.js ADDED
@@ -0,0 +1,151 @@
1
+ import { registerFlushCommand } from "./commands/flush.js";
2
+ import { registerStatusCommand } from "./commands/status.js";
3
+ import { ConfigError, resolveConfig } from "./config.js";
4
+ import { runRemoteEvaluation } from "./evaluation/evaluator.js";
5
+ import { EvaluationDeduplicator, shouldEvaluate } from "./evaluation/sampling.js";
6
+ import { isAssistantStreamUpdate } from "./lifecycle.js";
7
+ import { isAssistantMessage, latestEvaluationPair } from "./privacy/content-policy.js";
8
+ import { anonymize } from "./privacy/sanitization.js";
9
+ import { containsLikelySecret } from "./privacy/secret-detector.js";
10
+ import { TelemetryProviders } from "./telemetry/providers.js";
11
+ import { TelemetryRuntime } from "./telemetry/traces.js";
12
+ export const VERSION = "0.1.0";
13
+ const STATUS_ID = "damngamerz-pi-otel";
14
+ const JUDGE_STATUS_ID = "damngamerz-pi-otel-judge";
15
+ export default function piOtel(pi) {
16
+ let config;
17
+ let providers;
18
+ let runtime;
19
+ const evaluatedExchangeHashes = new EvaluationDeduplicator();
20
+ let evaluationInFlight = false;
21
+ registerStatusCommand(pi, () => config, () => runtime);
22
+ registerFlushCommand(pi, () => runtime);
23
+ const evaluateLatest = async (ctx, force) => {
24
+ if (!config || !runtime || evaluationInFlight)
25
+ return;
26
+ if (config.evaluation.mode === "off") {
27
+ if (force) {
28
+ ctx.ui.notify("Remote evaluation is disabled. Set piOtel.evaluation.mode to manual, sample, or always.", "warning");
29
+ }
30
+ return;
31
+ }
32
+ const pair = latestEvaluationPair(ctx.sessionManager.getBranch());
33
+ if (!pair) {
34
+ if (force)
35
+ ctx.ui.notify("No completed user/assistant pair is available to evaluate.", "warning");
36
+ return;
37
+ }
38
+ const exchangeHash = anonymize(`${pair.userRequest}\0${pair.assistantResponse}`);
39
+ if (!shouldEvaluate(config.evaluation.mode, config.evaluation.sampleRate, exchangeHash, force))
40
+ return;
41
+ if (evaluatedExchangeHashes.has(exchangeHash)) {
42
+ if (force)
43
+ ctx.ui.notify("The latest exchange has already been evaluated.", "info");
44
+ return;
45
+ }
46
+ if (config.evaluation.blockLikelySecrets &&
47
+ (containsLikelySecret(pair.userRequest) || containsLikelySecret(pair.assistantResponse))) {
48
+ ctx.ui.notify("Remote evaluation skipped: the latest exchange appears to contain a credential or private key.", "warning");
49
+ return;
50
+ }
51
+ evaluatedExchangeHashes.mark(exchangeHash);
52
+ evaluationInFlight = true;
53
+ ctx.ui.setStatus(JUDGE_STATUS_ID, ctx.ui.theme.fg("warning", `Evaluating with ${config.evaluation.provider}/${config.evaluation.model}`));
54
+ try {
55
+ const evaluation = await runRemoteEvaluation(ctx, pair, config.evaluation);
56
+ runtime.recordEvaluation(evaluation.batch);
57
+ await runtime.forceFlush();
58
+ ctx.ui.notify([
59
+ `Evaluation (${config.evaluation.provider}/${config.evaluation.model}):`,
60
+ ...evaluation.result.scores.map((score) => ` ${score.name}: ${score.score.toFixed(2)} (${score.label})`),
61
+ evaluation.result.summary ? `Summary: ${evaluation.result.summary}` : "",
62
+ ...evaluation.result.issues.map((issue) => `- ${issue}`),
63
+ evaluation.truncated
64
+ ? `Note: input was limited to ${config.evaluation.maxCharsPerField} characters per field.`
65
+ : "",
66
+ ]
67
+ .filter(Boolean)
68
+ .join("\n"), "info");
69
+ }
70
+ catch (error) {
71
+ ctx.ui.notify(`Remote evaluation failed: ${error instanceof Error ? error.message : String(error)}`, "error");
72
+ }
73
+ finally {
74
+ evaluationInFlight = false;
75
+ ctx.ui.setStatus(JUDGE_STATUS_ID, undefined);
76
+ }
77
+ };
78
+ pi.registerCommand("otel-eval-last", {
79
+ description: "Evaluate the latest Pi response when remote evaluation is enabled",
80
+ handler: async (_args, ctx) => {
81
+ await ctx.waitForIdle();
82
+ await evaluateLatest(ctx, true);
83
+ },
84
+ });
85
+ pi.on("session_start", async (_event, ctx) => {
86
+ try {
87
+ config = resolveConfig(ctx.cwd, ctx.isProjectTrusted());
88
+ if (!config.enabled)
89
+ return;
90
+ providers = new TelemetryProviders(config, VERSION);
91
+ runtime = new TelemetryRuntime(providers);
92
+ runtime.startSession(anonymize(ctx.sessionManager.getSessionId?.() ?? "ephemeral"));
93
+ evaluatedExchangeHashes.clear();
94
+ evaluationInFlight = false;
95
+ if (ctx.hasUI) {
96
+ ctx.ui.setStatus(STATUS_ID, ctx.ui.theme.fg("dim", `OTel · eval:${config.evaluation.mode}`));
97
+ }
98
+ }
99
+ catch (error) {
100
+ config = undefined;
101
+ providers = undefined;
102
+ runtime = undefined;
103
+ ctx.ui.notify(`Pi OTel disabled: ${error instanceof ConfigError ? error.message : String(error)}`, "error");
104
+ }
105
+ });
106
+ pi.on("agent_start", async () => runtime?.startAgent());
107
+ pi.on("turn_start", async (event) => runtime?.startTurn(event.turnIndex));
108
+ pi.on("before_provider_request", async (_event, ctx) => {
109
+ runtime?.startLlm(ctx.model?.provider ?? "unknown", ctx.model?.id ?? "unknown");
110
+ });
111
+ pi.on("after_provider_response", async (event) => runtime?.noteProviderResponse(event.status));
112
+ pi.on("message_update", async (event) => {
113
+ if (isAssistantStreamUpdate(event.message, event.assistantMessageEvent))
114
+ runtime?.noteFirstToken();
115
+ });
116
+ pi.on("message_end", async (event) => {
117
+ if (isAssistantMessage(event.message))
118
+ runtime?.finishLlm(event.message);
119
+ });
120
+ pi.on("tool_execution_start", async (event) => {
121
+ runtime?.startTool(event.toolCallId, event.toolName);
122
+ });
123
+ pi.on("tool_execution_end", async (event) => {
124
+ runtime?.finishTool(event.toolCallId, event.isError ?? false);
125
+ });
126
+ pi.on("turn_end", async (event) => {
127
+ runtime?.finishTurn(isAssistantMessage(event.message) ? event.message : undefined);
128
+ });
129
+ pi.on("agent_end", async () => runtime?.finishAgent());
130
+ pi.on("agent_settled", async (_event, ctx) => {
131
+ if (config?.evaluation.mode === "sample" || config?.evaluation.mode === "always") {
132
+ await evaluateLatest(ctx, false);
133
+ }
134
+ });
135
+ pi.on("session_shutdown", async (_event, ctx) => {
136
+ try {
137
+ await runtime?.shutdown();
138
+ }
139
+ catch (error) {
140
+ ctx.ui.notify(`Pi OpenTelemetry shutdown failed: ${error instanceof Error ? error.message : String(error)}`, "error");
141
+ }
142
+ if (ctx.hasUI) {
143
+ ctx.ui.setStatus(STATUS_ID, undefined);
144
+ ctx.ui.setStatus(JUDGE_STATUS_ID, undefined);
145
+ }
146
+ config = undefined;
147
+ providers = undefined;
148
+ runtime = undefined;
149
+ });
150
+ }
151
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function containsStreamDelta(event: unknown): boolean;
2
+ export declare function isAssistantStreamUpdate(message: unknown, event: unknown): boolean;
3
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAEA,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAU3D;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAEjF"}
@@ -0,0 +1,15 @@
1
+ import { isAssistantMessage } from "./privacy/content-policy.js";
2
+ export function containsStreamDelta(event) {
3
+ if (!event || typeof event !== "object")
4
+ return false;
5
+ const candidate = event;
6
+ return ((candidate.type === "text_delta" ||
7
+ candidate.type === "thinking_delta" ||
8
+ candidate.type === "toolcall_delta") &&
9
+ typeof candidate.delta === "string" &&
10
+ candidate.delta.length > 0);
11
+ }
12
+ export function isAssistantStreamUpdate(message, event) {
13
+ return isAssistantMessage(message) && containsStreamDelta(event);
14
+ }
15
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,MAAM,UAAU,mBAAmB,CAAC,KAAc;IACjD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,SAAS,GAAG,KAA4C,CAAC;IAC/D,OAAO,CACN,CAAC,SAAS,CAAC,IAAI,KAAK,YAAY;QAC/B,SAAS,CAAC,IAAI,KAAK,gBAAgB;QACnC,SAAS,CAAC,IAAI,KAAK,gBAAgB,CAAC;QACrC,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ;QACnC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAC1B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAgB,EAAE,KAAc;IACvE,OAAO,kBAAkB,CAAC,OAAO,CAAC,IAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface EvaluationPair {
2
+ userRequest: string;
3
+ assistantResponse: string;
4
+ }
5
+ export declare function isAssistantMessage(message: unknown): boolean;
6
+ export declare function messageText(message: unknown): string;
7
+ export declare function latestEvaluationPair(entries: readonly unknown[]): EvaluationPair | undefined;
8
+ //# sourceMappingURL=content-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-policy.d.ts","sourceRoot":"","sources":["../../src/privacy/content-policy.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAE5D;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAiBpD;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,GAAG,cAAc,GAAG,SAAS,CAqB5F"}
@@ -0,0 +1,48 @@
1
+ export function isAssistantMessage(message) {
2
+ return !!message && typeof message === "object" && message.role === "assistant";
3
+ }
4
+ export function messageText(message) {
5
+ if (!message || typeof message !== "object")
6
+ return "";
7
+ const content = message.content;
8
+ if (typeof content === "string")
9
+ return content.trim();
10
+ if (!Array.isArray(content))
11
+ return "";
12
+ return content
13
+ .filter((part) => {
14
+ return (!!part &&
15
+ typeof part === "object" &&
16
+ part.type === "text" &&
17
+ typeof part.text === "string");
18
+ })
19
+ .map((part) => part.text)
20
+ .join("\n")
21
+ .trim();
22
+ }
23
+ export function latestEvaluationPair(entries) {
24
+ let assistantIndex = -1;
25
+ let assistantResponse = "";
26
+ for (let index = entries.length - 1; index >= 0; index--) {
27
+ const entry = entries[index];
28
+ if (entry?.type !== "message" || !isAssistantMessage(entry.message))
29
+ continue;
30
+ assistantResponse = messageText(entry.message);
31
+ if (assistantResponse) {
32
+ assistantIndex = index;
33
+ break;
34
+ }
35
+ }
36
+ if (assistantIndex < 0)
37
+ return undefined;
38
+ for (let index = assistantIndex - 1; index >= 0; index--) {
39
+ const entry = entries[index];
40
+ if (entry?.type !== "message" || entry.message?.role !== "user")
41
+ continue;
42
+ const userRequest = messageText(entry.message);
43
+ if (userRequest)
44
+ return { userRequest, assistantResponse };
45
+ }
46
+ return undefined;
47
+ }
48
+ //# sourceMappingURL=content-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-policy.js","sourceRoot":"","sources":["../../src/privacy/content-policy.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IAClD,OAAO,CAAC,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAK,OAA8B,CAAC,IAAI,KAAK,WAAW,CAAC;AACzG,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC3C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACvD,MAAM,OAAO,GAAI,OAAiC,CAAC,OAAO,CAAC;IAC3D,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;IACvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,OAAO,OAAO;SACZ,MAAM,CAAC,CAAC,IAAI,EAA0C,EAAE;QACxD,OAAO,CACN,CAAC,CAAC,IAAI;YACN,OAAO,IAAI,KAAK,QAAQ;YACvB,IAA2B,CAAC,IAAI,KAAK,MAAM;YAC5C,OAAQ,IAA2B,CAAC,IAAI,KAAK,QAAQ,CACrD,CAAC;IACH,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;SACxB,IAAI,CAAC,IAAI,CAAC;SACV,IAAI,EAAE,CAAC;AACV,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAA2B;IAC/D,IAAI,cAAc,GAAG,CAAC,CAAC,CAAC;IACxB,IAAI,iBAAiB,GAAG,EAAE,CAAC;IAC3B,KAAK,IAAI,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAA0C,CAAC;QACtE,IAAI,KAAK,EAAE,IAAI,KAAK,SAAS,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC;YAAE,SAAS;QAC9E,iBAAiB,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,iBAAiB,EAAE,CAAC;YACvB,cAAc,GAAG,KAAK,CAAC;YACvB,MAAM;QACP,CAAC;IACF,CAAC;IACD,IAAI,cAAc,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAEzC,KAAK,IAAI,KAAK,GAAG,cAAc,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAqD,CAAC;QACjF,IAAI,KAAK,EAAE,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,KAAK,MAAM;YAAE,SAAS;QAC1E,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,WAAW;YAAE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC;IAC5D,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function finiteNumber(value: unknown): number;
2
+ export declare function safeDimension(value: unknown, fallback?: string, maxLength?: number): string;
3
+ export declare function safeTelemetryIdentifier(value: unknown, fallback?: string, maxLength?: number): string;
4
+ export declare function anonymize(value: string): string;
5
+ //# sourceMappingURL=sanitization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitization.d.ts","sourceRoot":"","sources":["../../src/privacy/sanitization.ts"],"names":[],"mappings":"AAYA,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEnD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,SAAY,EAAE,SAAS,SAAM,GAAG,MAAM,CAK3F;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,SAAa,EAAE,SAAS,SAAM,GAAG,MAAM,CAoBtG;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C"}
@@ -0,0 +1,42 @@
1
+ import { createHash } from "node:crypto";
2
+ import { containsLikelySecret } from "./secret-detector.js";
3
+ const IDENTIFIER_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._:+-";
4
+ function hasSafeIdentifierCharacters(value) {
5
+ return (/[A-Za-z0-9]/.test(value[0] ?? "") &&
6
+ [...value].every((character) => IDENTIFIER_CHARACTERS.includes(character)));
7
+ }
8
+ export function finiteNumber(value) {
9
+ return typeof value === "number" && Number.isFinite(value) ? value : 0;
10
+ }
11
+ export function safeDimension(value, fallback = "unknown", maxLength = 128) {
12
+ if (typeof value !== "string")
13
+ return fallback;
14
+ const normalized = value.trim().replace(/[\r\n\t]/g, " ");
15
+ if (!normalized)
16
+ return fallback;
17
+ return normalized.slice(0, maxLength);
18
+ }
19
+ export function safeTelemetryIdentifier(value, fallback = "redacted", maxLength = 128) {
20
+ if (typeof value !== "string")
21
+ return fallback;
22
+ const candidate = value.trim();
23
+ if (!candidate ||
24
+ candidate.length > maxLength ||
25
+ containsLikelySecret(candidate) ||
26
+ /\s/.test(candidate) ||
27
+ /@/.test(candidate) ||
28
+ candidate.startsWith("/") ||
29
+ candidate.startsWith("\\\\") ||
30
+ /^[A-Za-z]:[\\/]/.test(candidate) ||
31
+ candidate.includes("..") ||
32
+ candidate.includes("://") ||
33
+ candidate.includes("/") ||
34
+ !hasSafeIdentifierCharacters(candidate)) {
35
+ return fallback;
36
+ }
37
+ return candidate;
38
+ }
39
+ export function anonymize(value) {
40
+ return createHash("sha256").update(value).digest("hex").slice(0, 16);
41
+ }
42
+ //# sourceMappingURL=sanitization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitization.js","sourceRoot":"","sources":["../../src/privacy/sanitization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,qBAAqB,GAAG,qEAAqE,CAAC;AAEpG,SAAS,2BAA2B,CAAC,KAAa;IACjD,OAAO,CACN,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,qBAAqB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAC1E,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAc;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc,EAAE,QAAQ,GAAG,SAAS,EAAE,SAAS,GAAG,GAAG;IAClF,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC/C,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAC1D,IAAI,CAAC,UAAU;QAAE,OAAO,QAAQ,CAAC;IACjC,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAc,EAAE,QAAQ,GAAG,UAAU,EAAE,SAAS,GAAG,GAAG;IAC7F,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC/C,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC/B,IACC,CAAC,SAAS;QACV,SAAS,CAAC,MAAM,GAAG,SAAS;QAC5B,oBAAoB,CAAC,SAAS,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QACpB,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;QACnB,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;QACzB,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;QAC5B,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC;QACjC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;QACxB,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;QACzB,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC;QACvB,CAAC,2BAA2B,CAAC,SAAS,CAAC,EACtC,CAAC;QACF,OAAO,QAAQ,CAAC;IACjB,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACtC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function containsLikelySecret(text: string): boolean;
2
+ //# sourceMappingURL=secret-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-detector.d.ts","sourceRoot":"","sources":["../../src/privacy/secret-detector.ts"],"names":[],"mappings":"AAWA,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D"}
@@ -0,0 +1,14 @@
1
+ const SECRET_PATTERNS = [
2
+ /-----BEGIN (?:RSA |EC |OPENSSH |PGP )?PRIVATE KEY-----/i,
3
+ /\b(?:sk|ghp|github_pat|xox[baprs])[-_][A-Za-z0-9_-]{16,}\b/,
4
+ /\bAKIA[0-9A-Z]{16}\b/,
5
+ /\bAIza[0-9A-Za-z_-]{30,}\b/,
6
+ /\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/,
7
+ /\bauthorization\s*:\s*bearer\s+[A-Za-z0-9_./+=-]{16,}/i,
8
+ /\b(?:api[_-]?key|access[_-]?token|client[_-]?secret|secret|password|passwd|accountkey)\s*[:=]\s*["']?[^\s"']{8,}/i,
9
+ /\b(?:postgres(?:ql)?|mysql|mongodb(?:\+srv)?|redis):\/\/[^\s:@/]+:[^\s@/]+@/i,
10
+ ];
11
+ export function containsLikelySecret(text) {
12
+ return SECRET_PATTERNS.some((pattern) => pattern.test(text));
13
+ }
14
+ //# sourceMappingURL=secret-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-detector.js","sourceRoot":"","sources":["../../src/privacy/secret-detector.ts"],"names":[],"mappings":"AAAA,MAAM,eAAe,GAAG;IACvB,yDAAyD;IACzD,4DAA4D;IAC5D,sBAAsB;IACtB,4BAA4B;IAC5B,uDAAuD;IACvD,wDAAwD;IACxD,mHAAmH;IACnH,8EAA8E;CAC9E,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAChD,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare const BASE_GEN_AI_ATTRIBUTES: {
2
+ readonly "gen_ai.system": "pi";
3
+ };
4
+ export declare function modelAttributes(provider: string, model: string, operation?: string): {
5
+ "gen_ai.operation.name": string;
6
+ "gen_ai.provider.name": string;
7
+ "gen_ai.request.model": string;
8
+ "gen_ai.response.model": string;
9
+ "gen_ai.system": "pi";
10
+ };
11
+ //# sourceMappingURL=attributes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attributes.d.ts","sourceRoot":"","sources":["../../src/telemetry/attributes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB;;CAEzB,CAAC;AAEX,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,SAAS;;;;;;EAQlF"}
@@ -0,0 +1,13 @@
1
+ export const BASE_GEN_AI_ATTRIBUTES = {
2
+ "gen_ai.system": "pi",
3
+ };
4
+ export function modelAttributes(provider, model, operation = "chat") {
5
+ return {
6
+ ...BASE_GEN_AI_ATTRIBUTES,
7
+ "gen_ai.operation.name": operation,
8
+ "gen_ai.provider.name": provider,
9
+ "gen_ai.request.model": model,
10
+ "gen_ai.response.model": model,
11
+ };
12
+ }
13
+ //# sourceMappingURL=attributes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attributes.js","sourceRoot":"","sources":["../../src/telemetry/attributes.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACrC,eAAe,EAAE,IAAI;CACZ,CAAC;AAEX,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,KAAa,EAAE,SAAS,GAAG,MAAM;IAClF,OAAO;QACN,GAAG,sBAAsB;QACzB,uBAAuB,EAAE,SAAS;QAClC,sBAAsB,EAAE,QAAQ;QAChC,sBAAsB,EAAE,KAAK;QAC7B,uBAAuB,EAAE,KAAK;KAC9B,CAAC;AACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { Counter, Histogram, Meter } from "@opentelemetry/api";
2
+ export interface Instruments {
3
+ operationDuration: Histogram;
4
+ tokenUsage: Histogram;
5
+ toolCallsPerOperation: Histogram;
6
+ toolCalls: Counter;
7
+ toolErrors: Counter;
8
+ toolDuration: Histogram;
9
+ promptCount: Counter;
10
+ turnCount: Counter;
11
+ sessionDuration: Histogram;
12
+ costUsd: Counter;
13
+ timeToFirstToken: Histogram;
14
+ evaluationScore: Histogram;
15
+ }
16
+ export declare function createInstruments(meter: Meter): Instruments;
17
+ //# sourceMappingURL=instruments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instruments.d.ts","sourceRoot":"","sources":["../../src/telemetry/instruments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEpE,MAAM,WAAW,WAAW;IAC3B,iBAAiB,EAAE,SAAS,CAAC;IAC7B,UAAU,EAAE,SAAS,CAAC;IACtB,qBAAqB,EAAE,SAAS,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,SAAS,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,EAAE,SAAS,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,EAAE,SAAS,CAAC;IAC5B,eAAe,EAAE,SAAS,CAAC;CAC3B;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,WAAW,CAoD3D"}
@@ -0,0 +1,54 @@
1
+ export function createInstruments(meter) {
2
+ return {
3
+ operationDuration: meter.createHistogram("gen_ai.client.operation.duration", {
4
+ description: "Duration of GenAI client operations",
5
+ unit: "s",
6
+ }),
7
+ tokenUsage: meter.createHistogram("gen_ai.client.token.usage", {
8
+ description: "Tokens used by GenAI client operations",
9
+ unit: "{token}",
10
+ }),
11
+ toolCallsPerOperation: meter.createHistogram("gen_ai.client.tool_calls_per_operation", {
12
+ description: "Tool calls made during one agent operation",
13
+ unit: "{call}",
14
+ advice: { explicitBucketBoundaries: Array.from({ length: 33 }, (_, index) => index) },
15
+ }),
16
+ toolCalls: meter.createCounter("gen_ai.client.tool.calls", {
17
+ description: "Tool calls made by Pi",
18
+ unit: "{call}",
19
+ }),
20
+ toolErrors: meter.createCounter("pi.agent.tool.errors", {
21
+ description: "Failed Pi tool executions",
22
+ unit: "{error}",
23
+ }),
24
+ toolDuration: meter.createHistogram("pi.agent.tool.duration", {
25
+ description: "Pi tool execution duration",
26
+ unit: "s",
27
+ }),
28
+ promptCount: meter.createCounter("pi.agent.prompts", {
29
+ description: "Pi agent prompts",
30
+ unit: "{prompt}",
31
+ }),
32
+ turnCount: meter.createCounter("pi.agent.turns", {
33
+ description: "Pi LLM turns",
34
+ unit: "{turn}",
35
+ }),
36
+ sessionDuration: meter.createHistogram("pi.agent.session.duration", {
37
+ description: "Pi session duration",
38
+ unit: "s",
39
+ }),
40
+ costUsd: meter.createCounter("pi.agent.cost", {
41
+ description: "Cost reported by Pi",
42
+ unit: "USD",
43
+ }),
44
+ timeToFirstToken: meter.createHistogram("pi.agent.time_to_first_token", {
45
+ description: "Time from provider request to first streamed delta",
46
+ unit: "s",
47
+ }),
48
+ evaluationScore: meter.createHistogram("gen_ai.evaluation.score", {
49
+ description: "Validated LLM evaluation score",
50
+ unit: "1",
51
+ }),
52
+ };
53
+ }
54
+ //# sourceMappingURL=instruments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instruments.js","sourceRoot":"","sources":["../../src/telemetry/instruments.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,iBAAiB,CAAC,KAAY;IAC7C,OAAO;QACN,iBAAiB,EAAE,KAAK,CAAC,eAAe,CAAC,kCAAkC,EAAE;YAC5E,WAAW,EAAE,qCAAqC;YAClD,IAAI,EAAE,GAAG;SACT,CAAC;QACF,UAAU,EAAE,KAAK,CAAC,eAAe,CAAC,2BAA2B,EAAE;YAC9D,WAAW,EAAE,wCAAwC;YACrD,IAAI,EAAE,SAAS;SACf,CAAC;QACF,qBAAqB,EAAE,KAAK,CAAC,eAAe,CAAC,wCAAwC,EAAE;YACtF,WAAW,EAAE,4CAA4C;YACzD,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,EAAE,wBAAwB,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE;SACrF,CAAC;QACF,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,0BAA0B,EAAE;YAC1D,WAAW,EAAE,uBAAuB;YACpC,IAAI,EAAE,QAAQ;SACd,CAAC;QACF,UAAU,EAAE,KAAK,CAAC,aAAa,CAAC,sBAAsB,EAAE;YACvD,WAAW,EAAE,2BAA2B;YACxC,IAAI,EAAE,SAAS;SACf,CAAC;QACF,YAAY,EAAE,KAAK,CAAC,eAAe,CAAC,wBAAwB,EAAE;YAC7D,WAAW,EAAE,4BAA4B;YACzC,IAAI,EAAE,GAAG;SACT,CAAC;QACF,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC,kBAAkB,EAAE;YACpD,WAAW,EAAE,kBAAkB;YAC/B,IAAI,EAAE,UAAU;SAChB,CAAC;QACF,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC,gBAAgB,EAAE;YAChD,WAAW,EAAE,cAAc;YAC3B,IAAI,EAAE,QAAQ;SACd,CAAC;QACF,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,2BAA2B,EAAE;YACnE,WAAW,EAAE,qBAAqB;YAClC,IAAI,EAAE,GAAG;SACT,CAAC;QACF,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,eAAe,EAAE;YAC7C,WAAW,EAAE,qBAAqB;YAClC,IAAI,EAAE,KAAK;SACX,CAAC;QACF,gBAAgB,EAAE,KAAK,CAAC,eAAe,CAAC,8BAA8B,EAAE;YACvE,WAAW,EAAE,oDAAoD;YACjE,IAAI,EAAE,GAAG;SACT,CAAC;QACF,eAAe,EAAE,KAAK,CAAC,eAAe,CAAC,yBAAyB,EAAE;YACjE,WAAW,EAAE,gCAAgC;YAC7C,IAAI,EAAE,GAAG;SACT,CAAC;KACF,CAAC;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { Tracer } from "@opentelemetry/api";
2
+ import { MeterProvider, type PushMetricExporter } from "@opentelemetry/sdk-metrics";
3
+ import { type SpanExporter } from "@opentelemetry/sdk-trace-base";
4
+ import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
5
+ import type { PiOtelConfig } from "../config.js";
6
+ import { type Instruments } from "./instruments.js";
7
+ export interface ProviderOverrides {
8
+ traceExporter?: SpanExporter;
9
+ metricExporter?: PushMetricExporter;
10
+ metricIntervalMs?: number;
11
+ }
12
+ export declare class TelemetryProviders {
13
+ readonly tracerProvider: NodeTracerProvider;
14
+ readonly meterProvider: MeterProvider;
15
+ readonly tracer: Tracer;
16
+ readonly instruments: Instruments;
17
+ constructor(config: PiOtelConfig, version: string, overrides?: ProviderOverrides);
18
+ forceFlush(): Promise<void>;
19
+ shutdown(): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/telemetry/providers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAIjD,OAAO,EACN,aAAa,EAEb,KAAK,kBAAkB,EACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,+BAA+B,CAAC;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEvE,MAAM,WAAW,iBAAiB;IACjC,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,cAAc,CAAC,EAAE,kBAAkB,CAAC;IACpC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,kBAAkB;IAC9B,QAAQ,CAAC,cAAc,EAAE,kBAAkB,CAAC;IAC5C,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;gBAEtB,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,iBAAsB;IAiD9E,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAW3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAa/B"}
@@ -0,0 +1,88 @@
1
+ import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-http";
2
+ import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
3
+ import { resourceFromAttributes } from "@opentelemetry/resources";
4
+ import { MeterProvider, PeriodicExportingMetricReader, } from "@opentelemetry/sdk-metrics";
5
+ import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base";
6
+ import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
7
+ import { safeTelemetryIdentifier } from "../privacy/sanitization.js";
8
+ import { createInstruments } from "./instruments.js";
9
+ export class TelemetryProviders {
10
+ tracerProvider;
11
+ meterProvider;
12
+ tracer;
13
+ instruments;
14
+ constructor(config, version, overrides = {}) {
15
+ const resource = resourceFromAttributes({
16
+ "service.name": safeTelemetryIdentifier(config.serviceName, "pi"),
17
+ "service.version": version,
18
+ "deployment.environment.name": "local",
19
+ });
20
+ const traceExporter = overrides.traceExporter ??
21
+ new OTLPTraceExporter({
22
+ url: `${config.endpoint}/v1/traces`,
23
+ headers: config.headers,
24
+ timeoutMillis: 5_000,
25
+ });
26
+ const metricExporter = overrides.metricExporter ??
27
+ new OTLPMetricExporter({
28
+ url: `${config.endpoint}/v1/metrics`,
29
+ headers: config.headers,
30
+ timeoutMillis: 5_000,
31
+ });
32
+ this.tracerProvider = new NodeTracerProvider({
33
+ resource,
34
+ spanProcessors: config.signals.traces
35
+ ? [
36
+ new BatchSpanProcessor(traceExporter, {
37
+ maxQueueSize: 512,
38
+ maxExportBatchSize: 128,
39
+ scheduledDelayMillis: 1_000,
40
+ exportTimeoutMillis: 5_000,
41
+ }),
42
+ ]
43
+ : [],
44
+ });
45
+ this.meterProvider = new MeterProvider({
46
+ resource,
47
+ readers: config.signals.metrics
48
+ ? [
49
+ new PeriodicExportingMetricReader({
50
+ exporter: metricExporter,
51
+ exportIntervalMillis: overrides.metricIntervalMs ?? 10_000,
52
+ exportTimeoutMillis: 5_000,
53
+ }),
54
+ ]
55
+ : [],
56
+ });
57
+ this.tracer = this.tracerProvider.getTracer("@damngamerz/pi-otel", version);
58
+ this.instruments = createInstruments(this.meterProvider.getMeter("@damngamerz/pi-otel", version));
59
+ }
60
+ async forceFlush() {
61
+ const results = await Promise.allSettled([
62
+ this.tracerProvider.forceFlush(),
63
+ this.meterProvider.forceFlush(),
64
+ ]);
65
+ const failures = results
66
+ .filter((result) => result.status === "rejected")
67
+ .map((result) => result.reason);
68
+ if (failures.length > 0)
69
+ throw new AggregateError(failures, "OpenTelemetry flush failed");
70
+ }
71
+ async shutdown() {
72
+ const failures = [];
73
+ try {
74
+ await this.forceFlush();
75
+ }
76
+ catch (error) {
77
+ failures.push(error);
78
+ }
79
+ const results = await Promise.allSettled([this.tracerProvider.shutdown(), this.meterProvider.shutdown()]);
80
+ for (const result of results) {
81
+ if (result.status === "rejected")
82
+ failures.push(result.reason);
83
+ }
84
+ if (failures.length > 0)
85
+ throw new AggregateError(failures, "OpenTelemetry shutdown failed");
86
+ }
87
+ }
88
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/telemetry/providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { EvaluationBatch } from "../evaluation/types.js";
2
+ import type { TelemetryProviders } from "./providers.js";
3
+ export interface RuntimeStats {
4
+ prompts: number;
5
+ turns: number;
6
+ toolCalls: number;
7
+ toolErrors: number;
8
+ inputTokens: number;
9
+ outputTokens: number;
10
+ costUsd: number;
11
+ evaluationRuns: number;
12
+ evaluationCostUsd: number;
13
+ }
14
+ export declare class TelemetryRuntime {
15
+ private readonly providers;
16
+ readonly stats: RuntimeStats;
17
+ private sessionContext;
18
+ private sessionId;
19
+ private sessionStartedAt;
20
+ private agentSpan;
21
+ private agentContext;
22
+ private lastCompletedAgentContext;
23
+ private turnSpan;
24
+ private turnContext;
25
+ private activeLlm;
26
+ private readonly activeTools;
27
+ private toolsInCurrentOperation;
28
+ constructor(providers: TelemetryProviders);
29
+ startSession(anonymizedSessionId: string): void;
30
+ startAgent(): void;
31
+ startTurn(turnIndex: number): void;
32
+ startLlm(providerValue: string, modelValue: string): void;
33
+ noteProviderResponse(status: number): void;
34
+ noteFirstToken(): void;
35
+ finishLlm(message?: unknown, errorType?: string): void;
36
+ startTool(toolCallId: string, toolName: string): void;
37
+ finishTool(toolCallId: string, isError: boolean): void;
38
+ finishTurn(message?: unknown): void;
39
+ finishAgent(): void;
40
+ recordEvaluation(batch: EvaluationBatch): void;
41
+ forceFlush(): Promise<void>;
42
+ shutdown(): Promise<void>;
43
+ }
44
+ //# sourceMappingURL=traces.d.ts.map