agentic-pi 0.2.3 → 0.2.5

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/runner.js CHANGED
@@ -10,15 +10,20 @@
10
10
  * an `onWarn` callback for the same reason — so library consumers never
11
11
  * see `process.stderr` writes they didn't ask for.
12
12
  */
13
- import { AuthStorage, ModelRegistry, SessionManager, createAgentSession, } from "@earendil-works/pi-coding-agent";
13
+ import { AuthStorage, DefaultResourceLoader, ModelRegistry, SessionManager, createAgentSession, getAgentDir, } from "@earendil-works/pi-coding-agent";
14
14
  import { Emitter } from "./emitter.js";
15
15
  import { loadGitHubExtension, isMisconfigurationSkip } from "./extensions/github/index.js";
16
16
  import { loadWebSearchExtension, isMisconfigurationSkip as isWebSearchMisconfig, } from "./extensions/web-search/index.js";
17
+ import { loadFileSearchExtension, isMisconfigurationSkip as isFileSearchMisconfig, } from "./extensions/file-search/index.js";
17
18
  import { resolveModel } from "./models.js";
18
19
  import { buildSandbox } from "./sandbox/index.js";
19
20
  import { ensureImage, ImageLoaderError } from "./sandbox/images/loader.js";
21
+ import { createTelemetry, resolveTelemetryConfig } from "./telemetry/index.js";
20
22
  export async function runOnce(config, prompt, deps) {
21
23
  const warn = deps.onWarn ?? (() => undefined);
24
+ // Resolved up front so the telemetry extension_status can be emitted in the
25
+ // same block as the others. Off unless explicitly enabled (see resolver).
26
+ const telemetryConfig = resolveTelemetryConfig(config, process.env);
22
27
  const authStorage = AuthStorage.create();
23
28
  const modelRegistry = ModelRegistry.create(authStorage);
24
29
  const model = resolveModel(config.model, modelRegistry);
@@ -56,6 +61,24 @@ export async function runOnce(config, prompt, deps) {
56
61
  // WEB_SEARCH_PROVIDER to override". Soft warning, not a misconfig.
57
62
  warn(`web-search: ${webSearch.message}`);
58
63
  }
64
+ // File-search extension (FFF). Bundled, default-on. Unlike github /
65
+ // web-search it doesn't contribute customTools — it's a full Pi
66
+ // extension loaded through the resource loader below. Here we only
67
+ // resolve the package and decide the mode; load failures are
68
+ // non-fatal (the agent falls back to Pi's built-in find/grep).
69
+ const fileSearch = loadFileSearchExtension({
70
+ fileSearch: config.fileSearch,
71
+ fileSearchMode: config.fileSearchMode,
72
+ });
73
+ // pi-fff reads its mode from the PI_FFF_MODE env in SDK mode (there is
74
+ // no CLI flag source). Publish the resolved mode, but never clobber an
75
+ // explicit operator-set value.
76
+ if (fileSearch.status === "configured" && fileSearch.mode && !process.env.PI_FFF_MODE) {
77
+ process.env.PI_FFF_MODE = fileSearch.mode;
78
+ }
79
+ if (isFileSearchMisconfig(fileSearch)) {
80
+ warn(`file-search extension disabled (${fileSearch.reason}): ${fileSearch.message ?? ""}`);
81
+ }
59
82
  // Compose the env for the sandbox VM. Order (later wins):
60
83
  // 1. Auto-injected GITHUB_TOKEN/GH_TOKEN from a minted installation
61
84
  // token (when sandbox=gondolin AND github extension is configured).
@@ -135,6 +158,32 @@ export async function runOnce(config, prompt, deps) {
135
158
  const noToolsMode = config.noBuiltinTools ? "builtin" :
136
159
  sandbox.suppressBuiltins ? "builtin" :
137
160
  undefined;
161
+ // Build the resource loader ourselves so we can inject the bundled
162
+ // pi-fff extension via additionalExtensionPaths while preserving Pi's
163
+ // default discovery (~/.pi/agent + project .pi). Mirrors the loader
164
+ // createAgentSession would build by default (same cwd + agentDir).
165
+ const agentDir = getAgentDir();
166
+ const resourceLoader = new DefaultResourceLoader({
167
+ cwd: config.cwd,
168
+ agentDir,
169
+ additionalExtensionPaths: fileSearch.packageDir ? [fileSearch.packageDir] : [],
170
+ });
171
+ await resourceLoader.reload();
172
+ // A load failure (e.g. missing native binary for this platform) is
173
+ // collected, not thrown — downgrade to a skip and warn so the run
174
+ // continues on Pi's built-in find/grep.
175
+ if (fileSearch.status === "configured" && fileSearch.packageDir) {
176
+ const loadError = resourceLoader
177
+ .getExtensions()
178
+ .errors.find((e) => e.path.startsWith(fileSearch.packageDir));
179
+ if (loadError) {
180
+ fileSearch.status = "skipped";
181
+ fileSearch.reason = "resolve-failed";
182
+ fileSearch.message = `pi-fff failed to load: ${loadError.error}`;
183
+ fileSearch.toolNames = [];
184
+ warn(`file-search extension disabled (resolve-failed): ${loadError.error}`);
185
+ }
186
+ }
138
187
  const { session } = await createAgentSession({
139
188
  cwd: config.cwd,
140
189
  model,
@@ -142,10 +191,21 @@ export async function runOnce(config, prompt, deps) {
142
191
  sessionManager,
143
192
  authStorage,
144
193
  modelRegistry,
194
+ resourceLoader,
145
195
  tools: config.tools,
146
196
  noTools: noToolsMode,
147
197
  customTools: [...sandbox.customTools, ...github.customTools, ...webSearch.customTools],
148
198
  });
199
+ // Telemetry observes the raw event stream below. Built after the session so
200
+ // it can stamp spans with the real sessionId. When disabled this is a cheap
201
+ // no-op that imports no OTEL SDK; init failures degrade to a skip + warning.
202
+ const telemetry = await createTelemetry({
203
+ config: telemetryConfig,
204
+ sessionId: session.sessionId,
205
+ model: config.model,
206
+ sandboxBackend: sandbox.backend,
207
+ onWarn: warn,
208
+ });
149
209
  const emitter = new Emitter({
150
210
  sessionId: session.sessionId,
151
211
  cwd: config.cwd,
@@ -176,9 +236,32 @@ export async function runOnce(config, prompt, deps) {
176
236
  toolCount: webSearch.toolNames.length,
177
237
  maxCalls: webSearch.maxCalls,
178
238
  });
239
+ emitter.event({
240
+ type: "extension_status",
241
+ extension: "file-search",
242
+ status: fileSearch.status,
243
+ reason: fileSearch.reason,
244
+ message: fileSearch.message,
245
+ mode: fileSearch.mode,
246
+ toolCount: fileSearch.toolNames.length,
247
+ });
248
+ // Only surfaced when telemetry was actually requested (enabled, or explicitly
249
+ // --no-otel). A silent default run emits nothing here, so the existing JSONL
250
+ // fixtures stay valid (AGENTS.md rule #2).
251
+ if (telemetryConfig.enabled || telemetryConfig.reason === "disabled-by-flag") {
252
+ emitter.event({
253
+ type: "extension_status",
254
+ extension: "telemetry",
255
+ status: telemetry.status,
256
+ reason: telemetry.reason,
257
+ message: telemetry.message,
258
+ includeContent: telemetryConfig.includeContent,
259
+ });
260
+ }
179
261
  let sawError = false;
180
262
  let agentEndSeen = false;
181
263
  const unsubscribe = session.subscribe((event) => {
264
+ telemetry.onEvent(event);
182
265
  emitter.event(event);
183
266
  if (event.type === "tool_execution_end" && event.isError) {
184
267
  sawError = true;
@@ -196,6 +279,8 @@ export async function runOnce(config, prompt, deps) {
196
279
  error: { name: err.name, message: err.message },
197
280
  });
198
281
  unsubscribe();
282
+ telemetry.recordFatal(err);
283
+ await telemetry.shutdown();
199
284
  session.dispose();
200
285
  await sandbox.close();
201
286
  return 1;
@@ -204,6 +289,7 @@ export async function runOnce(config, prompt, deps) {
204
289
  // does not carry per-event token/cost; lastlight reads this terminal event.
205
290
  try {
206
291
  const stats = session.getSessionStats();
292
+ telemetry.recordSessionStats(stats);
207
293
  emitter.event({
208
294
  type: "usage_snapshot",
209
295
  stats: {
@@ -223,6 +309,7 @@ export async function runOnce(config, prompt, deps) {
223
309
  });
224
310
  }
225
311
  unsubscribe();
312
+ await telemetry.shutdown();
226
313
  session.dispose();
227
314
  await sandbox.close();
228
315
  if (sawError && !agentEndSeen)
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Telemetry enablement + content-gating resolution.
3
+ *
4
+ * Pure and SDK-free on purpose: no `@opentelemetry/*` imports here, so the
5
+ * precedence rules are trivially unit-testable and importing this module
6
+ * costs nothing on the common (telemetry-disabled) path.
7
+ */
8
+ /** Inputs the resolver reads off `RunConfig` (kept structural to avoid a cycle). */
9
+ export interface TelemetryConfigInput {
10
+ /** Tri-state: true = --otel, false = --no-otel, undefined = env decides. */
11
+ otel?: boolean;
12
+ /** Export raw prompt/message/tool content (bounded). Default false. */
13
+ otelIncludeContent?: boolean;
14
+ /** Override OTEL_SERVICE_NAME. */
15
+ otelServiceName?: string;
16
+ /** Override OTEL_EXPORTER_OTLP_ENDPOINT. */
17
+ otelEndpoint?: string;
18
+ }
19
+ export type TelemetrySkipReason = "not-enabled" | "disabled-by-flag";
20
+ export interface TelemetryConfig {
21
+ enabled: boolean;
22
+ /** Why telemetry is off (only set when `enabled` is false). */
23
+ reason?: TelemetrySkipReason;
24
+ /** Whether raw content may be attached to spans. */
25
+ includeContent: boolean;
26
+ /** Resolved service name (flag > OTEL_SERVICE_NAME > default applied at init). */
27
+ serviceName?: string;
28
+ /** Explicit OTLP endpoint override (flag); env is honored by the SDK directly. */
29
+ endpoint?: string;
30
+ }
31
+ type Env = Record<string, string | undefined>;
32
+ /**
33
+ * Resolve whether telemetry is enabled and how content is treated.
34
+ *
35
+ * Enablement precedence (highest first):
36
+ * 1. `--no-otel` (otel === false) → disabled, reason "disabled-by-flag".
37
+ * 2. `--otel` (otel === true) → enabled.
38
+ * 3. env `AGENTIC_PI_OTEL_ENABLED` truthy → enabled.
39
+ * 4. otherwise → disabled, reason "not-enabled".
40
+ *
41
+ * A bare `OTEL_EXPORTER_OTLP_ENDPOINT` does NOT enable telemetry: the spec is
42
+ * "off unless explicitly enabled", and many environments export `OTEL_*`
43
+ * globally. Enablement must be intentional.
44
+ *
45
+ * Content gating: on iff `--otel-include-content` OR env
46
+ * `AGENTIC_PI_OTEL_INCLUDE_CONTENT` is truthy. Default is metadata-only.
47
+ */
48
+ export declare function resolveTelemetryConfig(cfg: TelemetryConfigInput, env: Env): TelemetryConfig;
49
+ /** Cap on a single content attribute's length when content export is enabled. */
50
+ export declare const MAX_CONTENT_CHARS = 4096;
51
+ /**
52
+ * Render a value for a content-gated span attribute.
53
+ *
54
+ * Returns `undefined` when content export is off (the attribute is then simply
55
+ * never set). When on, stringifies and truncates to {@link MAX_CONTENT_CHARS}
56
+ * with a marker so oversized prompts/results don't bloat OTLP payloads.
57
+ */
58
+ export declare function redact(value: unknown, includeContent: boolean): string | undefined;
59
+ export {};
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Telemetry enablement + content-gating resolution.
3
+ *
4
+ * Pure and SDK-free on purpose: no `@opentelemetry/*` imports here, so the
5
+ * precedence rules are trivially unit-testable and importing this module
6
+ * costs nothing on the common (telemetry-disabled) path.
7
+ */
8
+ function isTruthy(v) {
9
+ if (v === undefined)
10
+ return false;
11
+ const s = v.trim().toLowerCase();
12
+ return s === "1" || s === "true" || s === "yes" || s === "on";
13
+ }
14
+ /**
15
+ * Resolve whether telemetry is enabled and how content is treated.
16
+ *
17
+ * Enablement precedence (highest first):
18
+ * 1. `--no-otel` (otel === false) → disabled, reason "disabled-by-flag".
19
+ * 2. `--otel` (otel === true) → enabled.
20
+ * 3. env `AGENTIC_PI_OTEL_ENABLED` truthy → enabled.
21
+ * 4. otherwise → disabled, reason "not-enabled".
22
+ *
23
+ * A bare `OTEL_EXPORTER_OTLP_ENDPOINT` does NOT enable telemetry: the spec is
24
+ * "off unless explicitly enabled", and many environments export `OTEL_*`
25
+ * globally. Enablement must be intentional.
26
+ *
27
+ * Content gating: on iff `--otel-include-content` OR env
28
+ * `AGENTIC_PI_OTEL_INCLUDE_CONTENT` is truthy. Default is metadata-only.
29
+ */
30
+ export function resolveTelemetryConfig(cfg, env) {
31
+ const includeContent = cfg.otelIncludeContent === true || isTruthy(env.AGENTIC_PI_OTEL_INCLUDE_CONTENT);
32
+ const serviceName = cfg.otelServiceName ?? env.OTEL_SERVICE_NAME;
33
+ const endpoint = cfg.otelEndpoint;
34
+ const base = { includeContent, serviceName, endpoint };
35
+ if (cfg.otel === false) {
36
+ return { ...base, enabled: false, reason: "disabled-by-flag" };
37
+ }
38
+ if (cfg.otel === true || isTruthy(env.AGENTIC_PI_OTEL_ENABLED)) {
39
+ return { ...base, enabled: true };
40
+ }
41
+ return { ...base, enabled: false, reason: "not-enabled" };
42
+ }
43
+ /** Cap on a single content attribute's length when content export is enabled. */
44
+ export const MAX_CONTENT_CHARS = 4096;
45
+ /**
46
+ * Render a value for a content-gated span attribute.
47
+ *
48
+ * Returns `undefined` when content export is off (the attribute is then simply
49
+ * never set). When on, stringifies and truncates to {@link MAX_CONTENT_CHARS}
50
+ * with a marker so oversized prompts/results don't bloat OTLP payloads.
51
+ */
52
+ export function redact(value, includeContent) {
53
+ if (!includeContent)
54
+ return undefined;
55
+ if (value === undefined || value === null)
56
+ return undefined;
57
+ const str = typeof value === "string" ? value : safeStringify(value);
58
+ if (str.length <= MAX_CONTENT_CHARS)
59
+ return str;
60
+ return `${str.slice(0, MAX_CONTENT_CHARS)}…[truncated ${str.length - MAX_CONTENT_CHARS} chars]`;
61
+ }
62
+ function safeStringify(value) {
63
+ try {
64
+ return JSON.stringify(value) ?? String(value);
65
+ }
66
+ catch {
67
+ return String(value);
68
+ }
69
+ }
70
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/telemetry/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA8BH,SAAS,QAAQ,CAAC,CAAqB;IACrC,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAClC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACjC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC;AAChE,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,sBAAsB,CACpC,GAAyB,EACzB,GAAQ;IAER,MAAM,cAAc,GAClB,GAAG,CAAC,kBAAkB,KAAK,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IACnF,MAAM,WAAW,GAAG,GAAG,CAAC,eAAe,IAAI,GAAG,CAAC,iBAAiB,CAAC;IACjE,MAAM,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC;IAElC,MAAM,IAAI,GAAG,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;IAEvD,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACvB,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACjE,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAE,CAAC;QAC/D,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACpC,CAAC;IACD,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;AAC5D,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAEtC;;;;;;GAMG;AACH,MAAM,UAAU,MAAM,CAAC,KAAc,EAAE,cAAuB;IAC5D,IAAI,CAAC,cAAc;QAAE,OAAO,SAAS,CAAC;IACtC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5D,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACrE,IAAI,GAAG,CAAC,MAAM,IAAI,iBAAiB;QAAE,OAAO,GAAG,CAAC;IAChD,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,eAAe,GAAG,CAAC,MAAM,GAAG,iBAAiB,SAAS,CAAC;AAClG,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Telemetry lifecycle entry point.
3
+ *
4
+ * `createTelemetry()` returns a {@link TelemetryHandle} the runner drives with
5
+ * the raw Pi event stream. When telemetry is disabled (the common case) it
6
+ * returns a cheap no-op handle and imports NO OpenTelemetry SDK — the heavy
7
+ * `@opentelemetry/sdk-*` packages are pulled in via a dynamic `import("./sdk.js")`
8
+ * only on the enabled path, so a default run pays ~zero cost.
9
+ *
10
+ * Nothing here writes to `process.stdout`/`process.stderr`: SDK diagnostics are
11
+ * routed to the `onWarn` callback (see `sdk.ts`), preserving the library
12
+ * contract that `run()` never touches those streams.
13
+ */
14
+ import type { AgentSessionEvent } from "@earendil-works/pi-coding-agent";
15
+ import type { TelemetryConfig } from "./config.js";
16
+ import type { SessionStatsLike } from "./mapper.js";
17
+ export type { TelemetryConfig, TelemetrySkipReason } from "./config.js";
18
+ export { resolveTelemetryConfig } from "./config.js";
19
+ export interface TelemetryHandle {
20
+ /** Whether the OTEL pipeline is live. */
21
+ status: "configured" | "skipped";
22
+ /** Why it is skipped (or "init-failed" when enabled but setup threw). */
23
+ reason?: string;
24
+ message?: string;
25
+ /** Feed every raw Pi session event, in order. No-op when skipped. */
26
+ onEvent(event: AgentSessionEvent): void;
27
+ /** Decorate the root span with terminal aggregate stats. No-op when skipped. */
28
+ recordSessionStats(stats: SessionStatsLike): void;
29
+ /** Mark the run as fatally errored before shutdown. No-op when skipped. */
30
+ recordFatal(err: Error): void;
31
+ /** Flush + shut down exporters. Always resolves; never throws. */
32
+ shutdown(): Promise<void>;
33
+ }
34
+ export interface CreateTelemetryDeps {
35
+ config: TelemetryConfig;
36
+ sessionId: string;
37
+ /** "provider/model_id" — split into gen_ai.system + gen_ai.request.model. */
38
+ model: string;
39
+ sandboxBackend: string;
40
+ onWarn: (message: string) => void;
41
+ /** Defaults to process.env; injected by tests. */
42
+ env?: Record<string, string | undefined>;
43
+ }
44
+ /**
45
+ * Build a telemetry handle from the resolved config. Async because the enabled
46
+ * path dynamically imports the OTEL SDK. Initialization failures degrade to a
47
+ * skipped handle with a warning — telemetry never breaks the run.
48
+ */
49
+ export declare function createTelemetry(deps: CreateTelemetryDeps): Promise<TelemetryHandle>;
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Telemetry lifecycle entry point.
3
+ *
4
+ * `createTelemetry()` returns a {@link TelemetryHandle} the runner drives with
5
+ * the raw Pi event stream. When telemetry is disabled (the common case) it
6
+ * returns a cheap no-op handle and imports NO OpenTelemetry SDK — the heavy
7
+ * `@opentelemetry/sdk-*` packages are pulled in via a dynamic `import("./sdk.js")`
8
+ * only on the enabled path, so a default run pays ~zero cost.
9
+ *
10
+ * Nothing here writes to `process.stdout`/`process.stderr`: SDK diagnostics are
11
+ * routed to the `onWarn` callback (see `sdk.ts`), preserving the library
12
+ * contract that `run()` never touches those streams.
13
+ */
14
+ export { resolveTelemetryConfig } from "./config.js";
15
+ function noopHandle(reason, message) {
16
+ return {
17
+ status: "skipped",
18
+ reason,
19
+ message,
20
+ onEvent: () => undefined,
21
+ recordSessionStats: () => undefined,
22
+ recordFatal: () => undefined,
23
+ shutdown: async () => undefined,
24
+ };
25
+ }
26
+ /**
27
+ * Build a telemetry handle from the resolved config. Async because the enabled
28
+ * path dynamically imports the OTEL SDK. Initialization failures degrade to a
29
+ * skipped handle with a warning — telemetry never breaks the run.
30
+ */
31
+ export async function createTelemetry(deps) {
32
+ if (!deps.config.enabled) {
33
+ return noopHandle(deps.config.reason);
34
+ }
35
+ try {
36
+ const { startTelemetrySdk } = await import("./sdk.js");
37
+ return startTelemetrySdk(deps);
38
+ }
39
+ catch (err) {
40
+ const message = err.message;
41
+ deps.onWarn(`telemetry: initialization failed (${message}); continuing without OTEL`);
42
+ return noopHandle("init-failed", message);
43
+ }
44
+ }
45
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AA6BrD,SAAS,UAAU,CAAC,MAAe,EAAE,OAAgB;IACnD,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,MAAM;QACN,OAAO;QACP,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS;QACxB,kBAAkB,EAAE,GAAG,EAAE,CAAC,SAAS;QACnC,WAAW,EAAE,GAAG,EAAE,CAAC,SAAS;QAC5B,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS;KAChC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAyB;IAC7D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACzB,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QACvD,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAI,GAAa,CAAC,OAAO,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,qCAAqC,OAAO,4BAA4B,CAAC,CAAC;QACtF,OAAO,UAAU,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Translates Pi's raw session event stream into an OpenTelemetry span tree
3
+ * plus metrics.
4
+ *
5
+ * Span tree (one-shot run → short-lived, so a real root span is correct):
6
+ *
7
+ * agentic_pi.session (root)
8
+ * └── agentic_pi.turn (per turn_start/turn_end)
9
+ * ├── chat <model> (per assistant message_start→message_end)
10
+ * └── execute_tool <name> (per tool_execution_start→end, keyed by toolCallId)
11
+ *
12
+ * Spans and metrics are both sourced from the SAME per-message / per-tool
13
+ * events (never from the aggregate session stats), so they agree and nothing
14
+ * is double-counted. Aggregate stats only decorate the root span.
15
+ *
16
+ * Every public method is defensive: missing/out-of-order pairs warn once and
17
+ * never throw — a telemetry glitch must never break the run.
18
+ */
19
+ import { type Context, type Meter, type Tracer } from "@opentelemetry/api";
20
+ import type { AgentSessionEvent } from "@earendil-works/pi-coding-agent";
21
+ /** Terminal aggregate stats (subset of Pi's SessionStats) for root decoration. */
22
+ export interface SessionStatsLike {
23
+ tokens?: {
24
+ input?: number;
25
+ output?: number;
26
+ total?: number;
27
+ };
28
+ cost?: number;
29
+ }
30
+ export interface SpanMapperDeps {
31
+ tracer: Tracer;
32
+ meter: Meter;
33
+ /** Inbound parent context (extracted traceparent) or ROOT_CONTEXT. */
34
+ rootParentContext: Context;
35
+ sessionId: string;
36
+ /** gen_ai.system (provider, e.g. "openai"). */
37
+ genAiSystem: string;
38
+ /** gen_ai.request.model (model id, e.g. "gpt-5.4-nano"). */
39
+ requestModel: string;
40
+ sandboxBackend: string;
41
+ includeContent: boolean;
42
+ onWarn: (message: string) => void;
43
+ /** Milliseconds clock seam (tests inject a deterministic one). */
44
+ now?: () => number;
45
+ }
46
+ export declare class SpanMapper {
47
+ private readonly d;
48
+ private readonly now;
49
+ private readonly inst;
50
+ private rootSpan?;
51
+ private rootCtx;
52
+ private turnSpan?;
53
+ private turnCtx?;
54
+ private turnIndex;
55
+ private llm?;
56
+ private readonly toolSpans;
57
+ private ended;
58
+ private warnedUnknownTool;
59
+ constructor(deps: SpanMapperDeps);
60
+ onEvent(event: AgentSessionEvent): void;
61
+ /** Decorate the root span with terminal aggregate stats (reconciliation only). */
62
+ recordSessionStats(stats: SessionStatsLike): void;
63
+ /** Mark the root span as errored (called before shutdown on the fatal path). */
64
+ recordFatal(err: Error): void;
65
+ /** Close any still-open spans (ERROR) and end the root. Idempotent. */
66
+ end(): void;
67
+ private ensureRoot;
68
+ private parentCtx;
69
+ private onTurnStart;
70
+ private onTurnEnd;
71
+ private onMessageStart;
72
+ private onMessageEnd;
73
+ private onToolStart;
74
+ private onToolEnd;
75
+ private onAgentEnd;
76
+ private setAndMeasureToken;
77
+ private abandonTurn;
78
+ private assistantText;
79
+ private buildInstruments;
80
+ }