agentic-pi 0.2.4 → 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/README.md +66 -0
- package/dist/args.d.ts +19 -0
- package/dist/args.js +34 -0
- package/dist/args.js.map +1 -1
- package/dist/run.d.ts +24 -0
- package/dist/run.js +12 -0
- package/dist/run.js.map +1 -1
- package/dist/runner.js +32 -0
- package/dist/runner.js.map +1 -1
- package/dist/telemetry/config.d.ts +59 -0
- package/dist/telemetry/config.js +70 -0
- package/dist/telemetry/config.js.map +1 -0
- package/dist/telemetry/index.d.ts +49 -0
- package/dist/telemetry/index.js +45 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/mapper.d.ts +80 -0
- package/dist/telemetry/mapper.js +334 -0
- package/dist/telemetry/mapper.js.map +1 -0
- package/dist/telemetry/sdk.d.ts +13 -0
- package/dist/telemetry/sdk.js +147 -0
- package/dist/telemetry/sdk.js.map +1 -0
- package/dist/telemetry/semconv.d.ts +72 -0
- package/dist/telemetry/semconv.js +73 -0
- package/dist/telemetry/semconv.js.map +1 -0
- package/package.json +10 -1
package/README.md
CHANGED
|
@@ -293,6 +293,67 @@ built-in `find`/`grep`.
|
|
|
293
293
|
When disabled or unavailable, `status: "skipped"` carries a `reason` of
|
|
294
294
|
`disabled-by-flag` or `resolve-failed`.
|
|
295
295
|
|
|
296
|
+
### 10. Optional OpenTelemetry export via `--otel`
|
|
297
|
+
|
|
298
|
+
agentic-pi can export **traces and metrics** for its run to any OTLP-compatible
|
|
299
|
+
collector, using the standard OpenTelemetry JS SDK and the standard `OTEL_*`
|
|
300
|
+
environment variables. This is meant for orchestrators (e.g. lastlight) that
|
|
301
|
+
forward `OTEL_*` config into a sandboxed agentic-pi process so Pi's own activity
|
|
302
|
+
shows up in their observability stack.
|
|
303
|
+
|
|
304
|
+
**Off unless explicitly enabled.** Enablement precedence (highest first):
|
|
305
|
+
|
|
306
|
+
1. `--no-otel` → force-disabled (wins over everything).
|
|
307
|
+
2. `--otel` → enabled.
|
|
308
|
+
3. env `AGENTIC_PI_OTEL_ENABLED=1` (when neither flag is passed) → enabled.
|
|
309
|
+
4. otherwise → disabled.
|
|
310
|
+
|
|
311
|
+
A bare `OTEL_EXPORTER_OTLP_ENDPOINT` does **not** enable telemetry on its own —
|
|
312
|
+
enablement is always intentional. Configure the destination with the usual
|
|
313
|
+
`OTEL_EXPORTER_OTLP_ENDPOINT` / `OTEL_EXPORTER_OTLP_HEADERS` /
|
|
314
|
+
`OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` (etc.) variables, or `--otel-endpoint` as a
|
|
315
|
+
base-URL escape hatch.
|
|
316
|
+
|
|
317
|
+
**Span tree** (one-shot run → a short-lived root span is correct):
|
|
318
|
+
|
|
319
|
+
```
|
|
320
|
+
agentic_pi.session (root; gen_ai.conversation.id = sessionId)
|
|
321
|
+
└── agentic_pi.turn
|
|
322
|
+
├── chat <model> (per assistant message; tokens, cost, finish reason)
|
|
323
|
+
└── execute_tool <name> (per tool call; status, duration)
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
**Metrics**: `gen_ai.client.token.usage`, `gen_ai.client.operation.duration`,
|
|
327
|
+
`agentic_pi.cost.usd`, `agentic_pi.tool.duration`, `agentic_pi.tool.invocations`,
|
|
328
|
+
`agentic_pi.tool.failures`, `agentic_pi.turns`. Attribute names follow the OTEL
|
|
329
|
+
GenAI semantic conventions where stable, namespaced under `agentic_pi.*` otherwise.
|
|
330
|
+
|
|
331
|
+
**Metadata-only by default.** Raw prompt/message/tool-result content is **never**
|
|
332
|
+
exported unless you pass `--otel-include-content` (or set
|
|
333
|
+
`AGENTIC_PI_OTEL_INCLUDE_CONTENT=1`), in which case content is bounded and
|
|
334
|
+
truncated. Metric dimensions are always metadata (bounded cardinality).
|
|
335
|
+
|
|
336
|
+
**Trace correlation.** If a W3C `TRACEPARENT` env var is present, the session
|
|
337
|
+
span is parented to it, so a sandboxed agentic-pi run correlates with the
|
|
338
|
+
caller's trace across the process/container boundary.
|
|
339
|
+
|
|
340
|
+
**Safe by default.** Telemetry never affects the run's exit code, never writes to
|
|
341
|
+
stdout/stderr (SDK diagnostics route to the warning channel), and degrades to a
|
|
342
|
+
warning if the collector is unreachable. When requested, a final
|
|
343
|
+
`extension_status` event mirrors the others:
|
|
344
|
+
|
|
345
|
+
```jsonl
|
|
346
|
+
{"type":"extension_status","extension":"telemetry","status":"configured","includeContent":false,"sessionId":"…","timestamp":"…"}
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
A silent default run (no `--otel`) emits no telemetry event at all.
|
|
350
|
+
|
|
351
|
+
```bash
|
|
352
|
+
# Export to a local collector (e.g. otel-desktop-viewer, Jaeger, Grafana Alloy)
|
|
353
|
+
echo "summarize the repo" | OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 \
|
|
354
|
+
node dist/cli.js run --model openai/gpt-5.4-nano --otel --no-session
|
|
355
|
+
```
|
|
356
|
+
|
|
296
357
|
## When to use this
|
|
297
358
|
|
|
298
359
|
- You have an orchestrator that calls a coding agent once per workflow
|
|
@@ -358,6 +419,11 @@ GITHUB_TOKEN=ghp_…
|
|
|
358
419
|
| `--no-file-search` | Disable the bundled FFF file-search extension; fall back to Pi's built-in `find`/`grep`. |
|
|
359
420
|
| `--file-search-mode <m>` | FFF mode: `override` (default) \| `tools-only` \| `tools-and-ui`. Overridden by the `PI_FFF_MODE` env var. See section 9. |
|
|
360
421
|
| `--web-search-max-calls <n>` | Cap combined `web_search` + `web_fetch` calls per run. Default: 30. |
|
|
422
|
+
| `--otel` | Enable OpenTelemetry traces + metrics export. Off by default. Requires an OTLP endpoint via `OTEL_EXPORTER_OTLP_ENDPOINT` (or `--otel-endpoint`). See section 10. |
|
|
423
|
+
| `--no-otel` | Force-disable OTEL even if `AGENTIC_PI_OTEL_ENABLED=1`. |
|
|
424
|
+
| `--otel-include-content` | Attach prompt/message/tool content to spans (bounded + truncated). Default: metadata-only. |
|
|
425
|
+
| `--otel-service-name <n>` | Override `OTEL_SERVICE_NAME` (default: `agentic-pi`). |
|
|
426
|
+
| `--otel-endpoint <url>` | Override `OTEL_EXPORTER_OTLP_ENDPOINT` base URL. |
|
|
361
427
|
|
|
362
428
|
Reads the prompt from stdin. Emits JSONL on stdout. Exits 0 on `agent_end`,
|
|
363
429
|
1 on fatal error.
|
package/dist/args.d.ts
CHANGED
|
@@ -87,6 +87,25 @@ export interface RunConfig {
|
|
|
87
87
|
* the same names). Set via `--file-search-mode <override|tools-only|tools-and-ui>`.
|
|
88
88
|
*/
|
|
89
89
|
fileSearchMode?: "override" | "tools-only" | "tools-and-ui";
|
|
90
|
+
/**
|
|
91
|
+
* OpenTelemetry traces + metrics export. Tri-state:
|
|
92
|
+
* - `true` (`--otel`) → enabled.
|
|
93
|
+
* - `false` (`--no-otel`) → force-disabled (wins over env).
|
|
94
|
+
* - `undefined` (unset) → enabled iff env AGENTIC_PI_OTEL_ENABLED is truthy.
|
|
95
|
+
* Off by default. Requires an OTLP endpoint via OTEL_EXPORTER_OTLP_ENDPOINT
|
|
96
|
+
* (or `--otel-endpoint`). Standard OTEL_* env vars are honored by the SDK.
|
|
97
|
+
*/
|
|
98
|
+
otel?: boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Export raw prompt/message/tool content on spans (bounded + truncated).
|
|
101
|
+
* Default: false (metadata-only). Set via `--otel-include-content` or env
|
|
102
|
+
* AGENTIC_PI_OTEL_INCLUDE_CONTENT.
|
|
103
|
+
*/
|
|
104
|
+
otelIncludeContent?: boolean;
|
|
105
|
+
/** Override OTEL_SERVICE_NAME (default: "agentic-pi"). */
|
|
106
|
+
otelServiceName?: string;
|
|
107
|
+
/** Override OTEL_EXPORTER_OTLP_ENDPOINT (escape hatch; prefer the env var). */
|
|
108
|
+
otelEndpoint?: string;
|
|
90
109
|
}
|
|
91
110
|
export declare function printHelp(): void;
|
|
92
111
|
export declare function parseArgs(argv: string[]): RunConfig;
|
package/dist/args.js
CHANGED
|
@@ -48,6 +48,17 @@ Flags:
|
|
|
48
48
|
--file-search-mode <m> FFF mode: override | tools-only | tools-and-ui.
|
|
49
49
|
Default: override (FFF replaces built-in find/grep
|
|
50
50
|
under the same names). Overridden by PI_FFF_MODE env.
|
|
51
|
+
--otel Enable OpenTelemetry traces + metrics export.
|
|
52
|
+
Off by default. Requires an OTLP endpoint via
|
|
53
|
+
OTEL_EXPORTER_OTLP_ENDPOINT (or --otel-endpoint).
|
|
54
|
+
Honors standard OTEL_* env vars. Can also be
|
|
55
|
+
enabled with AGENTIC_PI_OTEL_ENABLED=1.
|
|
56
|
+
--no-otel Force-disable OTEL even if AGENTIC_PI_OTEL_ENABLED
|
|
57
|
+
is set (highest precedence).
|
|
58
|
+
--otel-include-content Attach prompt/message/tool content to spans
|
|
59
|
+
(bounded + truncated). Default: metadata-only.
|
|
60
|
+
--otel-service-name <n> Override OTEL_SERVICE_NAME (default: agentic-pi).
|
|
61
|
+
--otel-endpoint <url> Override OTEL_EXPORTER_OTLP_ENDPOINT base URL.
|
|
51
62
|
--sandbox-image <name> Image to boot when --sandbox=gondolin. Values:
|
|
52
63
|
'default' (recommended) — bundled agentic-pi-dev image
|
|
53
64
|
with git/gh/node/python/rust baked in (auto-downloaded).
|
|
@@ -193,6 +204,29 @@ export function parseArgs(argv) {
|
|
|
193
204
|
config.fileSearchMode = v;
|
|
194
205
|
break;
|
|
195
206
|
}
|
|
207
|
+
case "--otel":
|
|
208
|
+
config.otel = true;
|
|
209
|
+
break;
|
|
210
|
+
case "--no-otel":
|
|
211
|
+
config.otel = false;
|
|
212
|
+
break;
|
|
213
|
+
case "--otel-include-content":
|
|
214
|
+
config.otelIncludeContent = true;
|
|
215
|
+
break;
|
|
216
|
+
case "--otel-service-name": {
|
|
217
|
+
const v = next().trim();
|
|
218
|
+
if (!v)
|
|
219
|
+
throw new Error("--otel-service-name requires a value");
|
|
220
|
+
config.otelServiceName = v;
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
case "--otel-endpoint": {
|
|
224
|
+
const v = next().trim();
|
|
225
|
+
if (!v)
|
|
226
|
+
throw new Error("--otel-endpoint requires a value");
|
|
227
|
+
config.otelEndpoint = v;
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
196
230
|
case "-h":
|
|
197
231
|
case "--help":
|
|
198
232
|
printHelp();
|
package/dist/args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"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"}
|
package/dist/run.d.ts
CHANGED
|
@@ -101,6 +101,20 @@ export interface RunOptions {
|
|
|
101
101
|
* under the same names). The `PI_FFF_MODE` env var, if set, wins.
|
|
102
102
|
*/
|
|
103
103
|
fileSearchMode?: "override" | "tools-only" | "tools-and-ui";
|
|
104
|
+
/**
|
|
105
|
+
* Enable OTEL traces + metrics export. Default: `false` (or env
|
|
106
|
+
* `AGENTIC_PI_OTEL_ENABLED=1`). `false` here force-disables. Requires an
|
|
107
|
+
* OTLP endpoint via `OTEL_EXPORTER_OTLP_ENDPOINT` or `otelEndpoint`.
|
|
108
|
+
* Standard `OTEL_*` env vars are honored by the SDK. Sandbox/env-driven
|
|
109
|
+
* callers can leave this unset and rely on `AGENTIC_PI_OTEL_ENABLED`.
|
|
110
|
+
*/
|
|
111
|
+
otel?: boolean;
|
|
112
|
+
/** Attach bounded raw content to spans. Default: `false` (metadata-only). */
|
|
113
|
+
otelIncludeContent?: boolean;
|
|
114
|
+
/** Override OTEL service name (default: "agentic-pi"). */
|
|
115
|
+
otelServiceName?: string;
|
|
116
|
+
/** Override the OTLP endpoint base URL (escape hatch; prefer the env var). */
|
|
117
|
+
otelEndpoint?: string;
|
|
104
118
|
/**
|
|
105
119
|
* Called for every emitted JSONL record in order. Same shape that the
|
|
106
120
|
* CLI writes to stdout, with `sessionId` and `timestamp` already injected.
|
|
@@ -188,6 +202,16 @@ export interface RunResult {
|
|
|
188
202
|
mode?: string;
|
|
189
203
|
toolCount: number;
|
|
190
204
|
};
|
|
205
|
+
/**
|
|
206
|
+
* Mirror of the telemetry `extension_status` line. Present only when OTEL
|
|
207
|
+
* was requested (enabled or explicitly disabled); absent on a default run.
|
|
208
|
+
*/
|
|
209
|
+
telemetry?: {
|
|
210
|
+
status: "configured" | "skipped";
|
|
211
|
+
reason?: string;
|
|
212
|
+
message?: string;
|
|
213
|
+
includeContent?: boolean;
|
|
214
|
+
};
|
|
191
215
|
/** Every JSONL record the run emitted, in order. */
|
|
192
216
|
records: EmitterRecord[];
|
|
193
217
|
/** Warnings that would have gone to stderr in CLI mode. */
|
package/dist/run.js
CHANGED
|
@@ -51,6 +51,10 @@ export async function run(options) {
|
|
|
51
51
|
webSearchMaxCalls: options.webSearchMaxCalls,
|
|
52
52
|
fileSearch: options.fileSearch ?? true,
|
|
53
53
|
fileSearchMode: options.fileSearchMode,
|
|
54
|
+
otel: options.otel,
|
|
55
|
+
otelIncludeContent: options.otelIncludeContent,
|
|
56
|
+
otelServiceName: options.otelServiceName,
|
|
57
|
+
otelEndpoint: options.otelEndpoint,
|
|
54
58
|
};
|
|
55
59
|
const collector = new CollectorSink(options.onEvent);
|
|
56
60
|
const sink = options.extraSink
|
|
@@ -117,6 +121,14 @@ function buildResult(exitCode, records, warnings) {
|
|
|
117
121
|
toolCount: r.toolCount ?? 0,
|
|
118
122
|
};
|
|
119
123
|
}
|
|
124
|
+
else if (r.extension === "telemetry") {
|
|
125
|
+
result.telemetry = {
|
|
126
|
+
status: r.status,
|
|
127
|
+
reason: r.reason,
|
|
128
|
+
message: r.message,
|
|
129
|
+
includeContent: r.includeContent,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
120
132
|
break;
|
|
121
133
|
case "message_end": {
|
|
122
134
|
// Accumulate assistant text. Pi's message structure:
|
package/dist/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH,OAAO,EACL,aAAa,EACb,OAAO,GAGR,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,OAAO,EAAwB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH,OAAO,EACL,aAAa,EACb,OAAO,GAGR,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,OAAO,EAAwB,MAAM,aAAa,CAAC;AA6M5D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,OAAmB;IAC3C,MAAM,MAAM,GAAc;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;QACjC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,KAAK;QACrC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,KAAK;QAC/C,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,0BAA0B,EAAE,KAAK;QACjC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,MAAM;QAClC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;QACpC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;QACtC,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QAC9C,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,YAAY,EAAE,OAAO,CAAC,YAAY;KACnC,CAAC;IAEF,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,IAAI,GAAgB,OAAO,CAAC,SAAS;QACzC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAC7C,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,EAAE;QAC7B,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAEzE,OAAO,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,WAAW,CAClB,QAAyB,EACzB,OAAwB,EACxB,QAAkB;IAElB,MAAM,MAAM,GAAc;QACxB,QAAQ;QACR,EAAE,EAAE,QAAQ,KAAK,CAAC;QAClB,UAAU,EAAE,KAAK;QACjB,UAAU,EAAE,KAAK;QACjB,SAAS,EAAE,EAAE;QACb,QAAQ,EAAE,EAAE;QACZ,OAAO;QACP,QAAQ;KACT,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YACf,KAAK,SAAS;gBACZ,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,EAAY,CAAC;gBAClC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,GAAa,CAAC;gBAC7B,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,SAAmB,CAAC;gBACzC,MAAM;YAER,KAAK,gBAAgB;gBACnB,MAAM,CAAC,OAAO,GAAG;oBACf,OAAO,EAAE,CAAC,CAAC,OAAiB;oBAC5B,MAAM,EAAG,CAAC,CAAC,MAAkC,IAAI,EAAE;iBACpD,CAAC;gBACF,MAAM;YAER,KAAK,kBAAkB;gBACrB,IAAI,CAAC,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;oBAC7B,MAAM,CAAC,MAAM,GAAG;wBACd,MAAM,EAAE,CAAC,CAAC,MAAkC;wBAC5C,MAAM,EAAE,CAAC,CAAC,MAA4B;wBACtC,OAAO,EAAE,CAAC,CAAC,OAA6B;wBACxC,OAAO,EAAE,CAAC,CAAC,OAA6B;wBACxC,SAAS,EAAG,CAAC,CAAC,SAAoB,IAAI,CAAC;qBACxC,CAAC;gBACJ,CAAC;qBAAM,IAAI,CAAC,CAAC,SAAS,KAAK,YAAY,EAAE,CAAC;oBACxC,MAAM,CAAC,SAAS,GAAG;wBACjB,MAAM,EAAE,CAAC,CAAC,MAAkC;wBAC5C,MAAM,EAAE,CAAC,CAAC,MAA4B;wBACtC,OAAO,EAAE,CAAC,CAAC,OAA6B;wBACxC,QAAQ,EAAE,CAAC,CAAC,QAA8B;wBAC1C,SAAS,EAAG,CAAC,CAAC,SAAoB,IAAI,CAAC;wBACvC,QAAQ,EAAE,CAAC,CAAC,QAA8B;qBAC3C,CAAC;gBACJ,CAAC;qBAAM,IAAI,CAAC,CAAC,SAAS,KAAK,aAAa,EAAE,CAAC;oBACzC,MAAM,CAAC,UAAU,GAAG;wBAClB,MAAM,EAAE,CAAC,CAAC,MAAkC;wBAC5C,MAAM,EAAE,CAAC,CAAC,MAA4B;wBACtC,OAAO,EAAE,CAAC,CAAC,OAA6B;wBACxC,IAAI,EAAE,CAAC,CAAC,IAA0B;wBAClC,SAAS,EAAG,CAAC,CAAC,SAAoB,IAAI,CAAC;qBACxC,CAAC;gBACJ,CAAC;qBAAM,IAAI,CAAC,CAAC,SAAS,KAAK,WAAW,EAAE,CAAC;oBACvC,MAAM,CAAC,SAAS,GAAG;wBACjB,MAAM,EAAE,CAAC,CAAC,MAAkC;wBAC5C,MAAM,EAAE,CAAC,CAAC,MAA4B;wBACtC,OAAO,EAAE,CAAC,CAAC,OAA6B;wBACxC,cAAc,EAAE,CAAC,CAAC,cAAqC;qBACxD,CAAC;gBACJ,CAAC;gBACD,MAAM;YAER,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,qDAAqD;gBACrD,6EAA6E;gBAC7E,MAAM,CAAC,GAAG,CAAC,CAAC,OAA2F,CAAC;gBACxG,IAAI,CAAC,EAAE,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;oBACxD,+DAA+D;oBAC/D,+DAA+D;oBAC/D,wCAAwC;oBACxC,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO;yBACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;yBAC9D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAc,CAAC;yBAC5B,IAAI,CAAC,EAAE,CAAC,CAAC;oBACZ,IAAI,IAAI;wBAAE,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;gBACpC,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,oBAAoB;gBACvB,IAAI,CAAC,CAAC,OAAO,KAAK,IAAI;oBAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;gBACjD,MAAM;YAER,KAAK,WAAW;gBACd,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;gBACzB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC9B,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAqB,CAAC;gBAC5C,CAAC;gBACD,MAAM;YAER,KAAK,gBAAgB;gBACnB,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,KAA2B,CAAC;gBAC7C,MAAM;YAER,KAAK,aAAa;gBAChB,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,KAA0C,CAAC;gBACjE,MAAM;QACV,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/runner.js
CHANGED
|
@@ -18,8 +18,12 @@ import { loadFileSearchExtension, isMisconfigurationSkip as isFileSearchMisconfi
|
|
|
18
18
|
import { resolveModel } from "./models.js";
|
|
19
19
|
import { buildSandbox } from "./sandbox/index.js";
|
|
20
20
|
import { ensureImage, ImageLoaderError } from "./sandbox/images/loader.js";
|
|
21
|
+
import { createTelemetry, resolveTelemetryConfig } from "./telemetry/index.js";
|
|
21
22
|
export async function runOnce(config, prompt, deps) {
|
|
22
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);
|
|
23
27
|
const authStorage = AuthStorage.create();
|
|
24
28
|
const modelRegistry = ModelRegistry.create(authStorage);
|
|
25
29
|
const model = resolveModel(config.model, modelRegistry);
|
|
@@ -192,6 +196,16 @@ export async function runOnce(config, prompt, deps) {
|
|
|
192
196
|
noTools: noToolsMode,
|
|
193
197
|
customTools: [...sandbox.customTools, ...github.customTools, ...webSearch.customTools],
|
|
194
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
|
+
});
|
|
195
209
|
const emitter = new Emitter({
|
|
196
210
|
sessionId: session.sessionId,
|
|
197
211
|
cwd: config.cwd,
|
|
@@ -231,9 +245,23 @@ export async function runOnce(config, prompt, deps) {
|
|
|
231
245
|
mode: fileSearch.mode,
|
|
232
246
|
toolCount: fileSearch.toolNames.length,
|
|
233
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
|
+
}
|
|
234
261
|
let sawError = false;
|
|
235
262
|
let agentEndSeen = false;
|
|
236
263
|
const unsubscribe = session.subscribe((event) => {
|
|
264
|
+
telemetry.onEvent(event);
|
|
237
265
|
emitter.event(event);
|
|
238
266
|
if (event.type === "tool_execution_end" && event.isError) {
|
|
239
267
|
sawError = true;
|
|
@@ -251,6 +279,8 @@ export async function runOnce(config, prompt, deps) {
|
|
|
251
279
|
error: { name: err.name, message: err.message },
|
|
252
280
|
});
|
|
253
281
|
unsubscribe();
|
|
282
|
+
telemetry.recordFatal(err);
|
|
283
|
+
await telemetry.shutdown();
|
|
254
284
|
session.dispose();
|
|
255
285
|
await sandbox.close();
|
|
256
286
|
return 1;
|
|
@@ -259,6 +289,7 @@ export async function runOnce(config, prompt, deps) {
|
|
|
259
289
|
// does not carry per-event token/cost; lastlight reads this terminal event.
|
|
260
290
|
try {
|
|
261
291
|
const stats = session.getSessionStats();
|
|
292
|
+
telemetry.recordSessionStats(stats);
|
|
262
293
|
emitter.event({
|
|
263
294
|
type: "usage_snapshot",
|
|
264
295
|
stats: {
|
|
@@ -278,6 +309,7 @@ export async function runOnce(config, prompt, deps) {
|
|
|
278
309
|
});
|
|
279
310
|
}
|
|
280
311
|
unsubscribe();
|
|
312
|
+
await telemetry.shutdown();
|
|
281
313
|
session.dispose();
|
|
282
314
|
await sandbox.close();
|
|
283
315
|
if (sawError && !agentEndSeen)
|
package/dist/runner.js.map
CHANGED
|
@@ -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;
|
|
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"}
|