agentic-pi 0.2.4 → 0.2.6

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
@@ -15,11 +15,16 @@ 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
17
  import { loadFileSearchExtension, isMisconfigurationSkip as isFileSearchMisconfig, } from "./extensions/file-search/index.js";
18
+ import { loadSkillsExtension, buildSkillsStatusEvent } from "./extensions/skills/index.js";
18
19
  import { resolveModel } from "./models.js";
19
20
  import { buildSandbox } from "./sandbox/index.js";
20
21
  import { ensureImage, ImageLoaderError } from "./sandbox/images/loader.js";
22
+ import { createTelemetry, resolveTelemetryConfig } from "./telemetry/index.js";
21
23
  export async function runOnce(config, prompt, deps) {
22
24
  const warn = deps.onWarn ?? (() => undefined);
25
+ // Resolved up front so the telemetry extension_status can be emitted in the
26
+ // same block as the others. Off unless explicitly enabled (see resolver).
27
+ const telemetryConfig = resolveTelemetryConfig(config, process.env);
23
28
  const authStorage = AuthStorage.create();
24
29
  const modelRegistry = ModelRegistry.create(authStorage);
25
30
  const model = resolveModel(config.model, modelRegistry);
@@ -75,6 +80,16 @@ export async function runOnce(config, prompt, deps) {
75
80
  if (isFileSearchMisconfig(fileSearch)) {
76
81
  warn(`file-search extension disabled (${fileSearch.reason}): ${fileSearch.message ?? ""}`);
77
82
  }
83
+ // Agent Skills (https://agentskills.io). Pi discovers skills from default
84
+ // locations on its own; this only normalizes operator-mapped --skill paths
85
+ // (tilde/relative → absolute, drop missing) for the resource loader below.
86
+ const skills = loadSkillsExtension({
87
+ skillPaths: config.skillPaths,
88
+ noSkills: config.noSkills,
89
+ cwd: config.cwd,
90
+ });
91
+ for (const w of skills.warnings)
92
+ warn(`skills: ${w}`);
78
93
  // Compose the env for the sandbox VM. Order (later wins):
79
94
  // 1. Auto-injected GITHUB_TOKEN/GH_TOKEN from a minted installation
80
95
  // token (when sandbox=gondolin AND github extension is configured).
@@ -163,6 +178,11 @@ export async function runOnce(config, prompt, deps) {
163
178
  cwd: config.cwd,
164
179
  agentDir,
165
180
  additionalExtensionPaths: fileSearch.packageDir ? [fileSearch.packageDir] : [],
181
+ // Operator-mapped skill folders (e.g. --skill ~/.claude/skills). Additive
182
+ // even when noSkills is true (Pi semantics): --skill X --no-skills loads
183
+ // exactly X and nothing from default discovery.
184
+ additionalSkillPaths: skills.additionalSkillPaths,
185
+ noSkills: skills.noSkills,
166
186
  });
167
187
  await resourceLoader.reload();
168
188
  // A load failure (e.g. missing native binary for this platform) is
@@ -192,6 +212,16 @@ export async function runOnce(config, prompt, deps) {
192
212
  noTools: noToolsMode,
193
213
  customTools: [...sandbox.customTools, ...github.customTools, ...webSearch.customTools],
194
214
  });
215
+ // Telemetry observes the raw event stream below. Built after the session so
216
+ // it can stamp spans with the real sessionId. When disabled this is a cheap
217
+ // no-op that imports no OTEL SDK; init failures degrade to a skip + warning.
218
+ const telemetry = await createTelemetry({
219
+ config: telemetryConfig,
220
+ sessionId: session.sessionId,
221
+ model: config.model,
222
+ sandboxBackend: sandbox.backend,
223
+ onWarn: warn,
224
+ });
195
225
  const emitter = new Emitter({
196
226
  sessionId: session.sessionId,
197
227
  cwd: config.cwd,
@@ -231,9 +261,34 @@ export async function runOnce(config, prompt, deps) {
231
261
  mode: fileSearch.mode,
232
262
  toolCount: fileSearch.toolNames.length,
233
263
  });
264
+ // Pi emits no skill-specific event, so we synthesize one from the resource
265
+ // loader's discovery. Gated (status !== "default" OR ≥1 skill discovered) so
266
+ // a default run in a clean env stays silent and the JSONL fixtures stay valid.
267
+ const skillsStatus = buildSkillsStatusEvent(skills, resourceLoader.getSkills().skills.map((s) => ({
268
+ name: s.name,
269
+ source: s.filePath,
270
+ modelInvocable: !s.disableModelInvocation,
271
+ })));
272
+ if (skillsStatus) {
273
+ emitter.event(skillsStatus);
274
+ }
275
+ // Only surfaced when telemetry was actually requested (enabled, or explicitly
276
+ // --no-otel). A silent default run emits nothing here, so the existing JSONL
277
+ // fixtures stay valid (AGENTS.md rule #2).
278
+ if (telemetryConfig.enabled || telemetryConfig.reason === "disabled-by-flag") {
279
+ emitter.event({
280
+ type: "extension_status",
281
+ extension: "telemetry",
282
+ status: telemetry.status,
283
+ reason: telemetry.reason,
284
+ message: telemetry.message,
285
+ includeContent: telemetryConfig.includeContent,
286
+ });
287
+ }
234
288
  let sawError = false;
235
289
  let agentEndSeen = false;
236
290
  const unsubscribe = session.subscribe((event) => {
291
+ telemetry.onEvent(event);
237
292
  emitter.event(event);
238
293
  if (event.type === "tool_execution_end" && event.isError) {
239
294
  sawError = true;
@@ -251,6 +306,8 @@ export async function runOnce(config, prompt, deps) {
251
306
  error: { name: err.name, message: err.message },
252
307
  });
253
308
  unsubscribe();
309
+ telemetry.recordFatal(err);
310
+ await telemetry.shutdown();
254
311
  session.dispose();
255
312
  await sandbox.close();
256
313
  return 1;
@@ -259,6 +316,7 @@ export async function runOnce(config, prompt, deps) {
259
316
  // does not carry per-event token/cost; lastlight reads this terminal event.
260
317
  try {
261
318
  const stats = session.getSessionStats();
319
+ telemetry.recordSessionStats(stats);
262
320
  emitter.event({
263
321
  type: "usage_snapshot",
264
322
  stats: {
@@ -278,6 +336,7 @@ export async function runOnce(config, prompt, deps) {
278
336
  });
279
337
  }
280
338
  unsubscribe();
339
+ await telemetry.shutdown();
281
340
  session.dispose();
282
341
  await sandbox.close();
283
342
  if (sawError && !agentEndSeen)
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,WAAW,GACZ,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAAE,OAAO,EAAoB,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAC3F,OAAO,EACL,sBAAsB,EACtB,sBAAsB,IAAI,oBAAoB,GAC/C,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,uBAAuB,EACvB,sBAAsB,IAAI,qBAAqB,GAChD,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAA4C,MAAM,oBAAoB,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAW3E,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAiB,EACjB,MAAc,EACd,IAAiB;IAEjB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAE9C,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;IACzC,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IAExD,MAAM,cAAc,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAEnD,sEAAsE;IACtE,sEAAsE;IACtE,oEAAoE;IACpE,uEAAuE;IACvE,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnD,yEAAyE;IACzE,sEAAsE;IACtE,yCAAyC;IACzC,IAAI,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,8BAA8B,MAAM,CAAC,MAAM,MAAM,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC;IAChF,CAAC;SAAM,IACL,MAAM,CAAC,MAAM,KAAK,SAAS;QAC3B,MAAM,CAAC,MAAM,KAAK,gBAAgB;QAClC,MAAM,CAAC,OAAO,EACd,CAAC;QACD,IAAI,CAAC,aAAa,MAAM,CAAC,OAAO,gFAAgF,CAAC,CAAC;IACpH,CAAC;IAED,qEAAqE;IACrE,uEAAuE;IACvE,oEAAoE;IACpE,iCAAiC;IACjC,MAAM,SAAS,GAAG,sBAAsB,CAAC;QACvC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;KAC5C,CAAC,CAAC;IACH,IAAI,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,kCAAkC,SAAS,CAAC,MAAM,MAAM,SAAS,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1F,CAAC;SAAM,IAAI,SAAS,CAAC,MAAM,KAAK,YAAY,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;QAClE,2DAA2D;QAC3D,mEAAmE;QACnE,IAAI,CAAC,eAAe,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,oEAAoE;IACpE,gEAAgE;IAChE,mEAAmE;IACnE,6DAA6D;IAC7D,+DAA+D;IAC/D,MAAM,UAAU,GAAG,uBAAuB,CAAC;QACzC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,cAAc,EAAE,MAAM,CAAC,cAAc;KACtC,CAAC,CAAC;IACH,uEAAuE;IACvE,uEAAuE;IACvE,+BAA+B;IAC/B,IAAI,UAAU,CAAC,MAAM,KAAK,YAAY,IAAI,UAAU,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QACtF,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC;IAC5C,CAAC;IACD,IAAI,qBAAqB,CAAC,UAAU,CAAC,EAAE,CAAC;QACtC,IAAI,CAAC,mCAAmC,UAAU,CAAC,MAAM,MAAM,UAAU,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,0DAA0D;IAC1D,sEAAsE;IACtE,yEAAyE;IACzE,4CAA4C;IAC5C,oEAAoE;IACpE,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QACnF,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC3C,UAAU,CAAC,YAAY,GAAG,KAAK,CAAC;YAChC,UAAU,CAAC,QAAQ,GAAG,KAAK,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,+DAAgE,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAC/C,CAAC;IAED,oEAAoE;IACpE,wDAAwD;IACxD,+DAA+D;IAC/D,IAAI,SAA6B,CAAC;IAClC,IAAI,eAA4C,CAAC;IACjD,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,IAAI,SAAS,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC7C,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAChC,eAAe,GAAG,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACN,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;gBAC/B,eAAe,GAAG,QAAQ,CAAC,UAAU,CAAC;YACxC,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,gBAAgB,EAAE,CAAC;gBACpC,4DAA4D;gBAC5D,4DAA4D;gBAC5D,8DAA8D;gBAC9D,8DAA8D;gBAC9D,wDAAwD;gBACxD,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;oBACtC,IAAI,CAAC,8BAA8B,GAAG,CAAC,OAAO,8CAA8C,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;oBACxG,eAAe,GAAG,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;gBACpE,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,mBAAmB,QAAQ,YAAY,GAAG,CAAC,OAAO,WAAW,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC9E,OAAO,CAAC,CAAC;gBACX,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,yEAAyE;IACzE,yBAAyB;IACzB,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC;QACxC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QAChE,SAAS;QACT,KAAK,EAAE,eAAe;QACtB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;KAC1C,CAAC,CAAC;IACH,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;QACvB,IAAI,CAAC,aAAa,cAAc,CAAC,OAAO,YAAY,cAAc,CAAC,MAAM,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;QACtG,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,OAAO,GAAkB,cAAc,CAAC,OAAO,CAAC;IAEtD,yEAAyE;IACzE,sEAAsE;IACtE,wCAAwC;IACxC,MAAM,WAAW,GACf,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACnC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACtC,SAAS,CAAC;IAEZ,mEAAmE;IACnE,sEAAsE;IACtE,oEAAoE;IACpE,mEAAmE;IACnE,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,cAAc,GAAG,IAAI,qBAAqB,CAAC;QAC/C,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,QAAQ;QACR,wBAAwB,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE;KAC/E,CAAC,CAAC;IACH,MAAM,cAAc,CAAC,MAAM,EAAE,CAAC;IAE9B,mEAAmE;IACnE,kEAAkE;IAClE,wCAAwC;IACxC,IAAI,UAAU,CAAC,MAAM,KAAK,YAAY,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;QAChE,MAAM,SAAS,GAAG,cAAc;aAC7B,aAAa,EAAE;aACf,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,UAAW,CAAC,CAAC,CAAC;QACjE,IAAI,SAAS,EAAE,CAAC;YACd,UAAU,CAAC,MAAM,GAAG,SAAS,CAAC;YAC9B,UAAU,CAAC,MAAM,GAAG,gBAAgB,CAAC;YACrC,UAAU,CAAC,OAAO,GAAG,0BAA0B,SAAS,CAAC,KAAK,EAAE,CAAC;YACjE,UAAU,CAAC,SAAS,GAAG,EAAE,CAAC;YAC1B,IAAI,CAAC,oDAAoD,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,kBAAkB,CAAC;QAC3C,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,KAAK;QACL,aAAa,EAAE,MAAM,CAAC,QAAQ;QAC9B,cAAc;QACd,WAAW;QACX,aAAa;QACb,cAAc;QACd,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,WAAW;QACpB,WAAW,EAAE,CAAC,GAAG,OAAO,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,WAAW,CAAC;KACvF,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAI,OAAO,CACzB;QACE,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,EACD,IAAI,CAAC,IAAI,CACV,CAAC;IAEF,OAAO,CAAC,aAAa,EAAE,CAAC;IACxB,OAAO,CAAC,KAAK,CAAC;QACZ,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IACH,OAAO,CAAC,KAAK,CAAC;QACZ,IAAI,EAAE,kBAAkB;QACxB,SAAS,EAAE,QAAQ;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM;KACnC,CAAC,CAAC;IACH,OAAO,CAAC,KAAK,CAAC;QACZ,IAAI,EAAE,kBAAkB;QACxB,SAAS,EAAE,YAAY;QACvB,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,OAAO,EAAE,SAAS,CAAC,OAAO;QAC1B,QAAQ,EAAE,SAAS,CAAC,QAAQ;QAC5B,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM;QACrC,QAAQ,EAAE,SAAS,CAAC,QAAQ;KAC7B,CAAC,CAAC;IACH,OAAO,CAAC,KAAK,CAAC;QACZ,IAAI,EAAE,kBAAkB;QACxB,SAAS,EAAE,aAAa;QACxB,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,MAAM;KACvC,CAAC,CAAC;IAEH,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,KAAwB,EAAE,EAAE;QACjE,OAAO,CAAC,KAAK,CAAC,KAA8D,CAAC,CAAC;QAE9E,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YACzD,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/B,YAAY,GAAG,IAAI,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC;YACZ,IAAI,EAAE,aAAa;YACnB,KAAK,EAAE,EAAE,IAAI,EAAG,GAAa,CAAC,IAAI,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE;SACtE,CAAC,CAAC;QACH,WAAW,EAAE,CAAC;QACd,OAAO,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,wEAAwE;IACxE,4EAA4E;IAC5E,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;QACxC,OAAO,CAAC,KAAK,CAAC;YACZ,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE;gBACL,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;gBAC1C,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC;YACZ,IAAI,EAAE,sBAAsB;YAC5B,KAAK,EAAE,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,WAAW,EAAE,CAAC;IACd,OAAO,CAAC,OAAO,EAAE,CAAC;IAClB,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IAEtB,IAAI,QAAQ,IAAI,CAAC,YAAY;QAAE,OAAO,CAAC,CAAC;IACxC,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAiB;IAC5C,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;AAC9D,CAAC"}
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
+ }