@warlock.js/ai-panoptic 5.29.0 → 5.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -3
- package/README.md +2 -2
- package/cjs/index.cjs +53 -50
- package/cjs/index.cjs.map +1 -1
- package/esm/collector/collector.d.mts +1 -1
- package/esm/collector/collector.d.mts.map +1 -1
- package/esm/collector/collector.mjs +1 -1
- package/esm/collector/collector.mjs.map +1 -1
- package/esm/collector/content-capture.type.d.mts +1 -1
- package/esm/collector/content-capture.type.d.mts.map +1 -1
- package/esm/collector/extract-span-attributes.d.mts +1 -1
- package/esm/collector/extract-span-attributes.d.mts.map +1 -1
- package/esm/collector/extract-span-attributes.mjs +2 -1
- package/esm/collector/extract-span-attributes.mjs.map +1 -1
- package/esm/collector/normalize-error.d.mts +1 -1
- package/esm/collector/normalize-error.d.mts.map +1 -1
- package/esm/collector/normalize-error.mjs +1 -1
- package/esm/collector/normalize-error.mjs.map +1 -1
- package/esm/collector/report-to-span.d.mts +1 -1
- package/esm/collector/report-to-span.d.mts.map +1 -1
- package/esm/collector/report-to-span.mjs +1 -1
- package/esm/collector/report-to-span.mjs.map +1 -1
- package/esm/collector/report-to-trace.d.mts +1 -1
- package/esm/collector/report-to-trace.d.mts.map +1 -1
- package/esm/collector/report-to-trace.mjs +1 -1
- package/esm/collector/report-to-trace.mjs.map +1 -1
- package/esm/config/apply-panoptic-config.d.mts +1 -1
- package/esm/config/apply-panoptic-config.d.mts.map +1 -1
- package/esm/config/apply-panoptic-config.mjs +1 -1
- package/esm/config/apply-panoptic-config.mjs.map +1 -1
- package/esm/config/panoptic-config.type.d.mts +1 -1
- package/esm/config/panoptic-config.type.d.mts.map +1 -1
- package/esm/contracts/collector.contract.d.mts +1 -1
- package/esm/contracts/collector.contract.d.mts.map +1 -1
- package/esm/contracts/exporter.contract.d.mts +1 -1
- package/esm/contracts/exporter.contract.d.mts.map +1 -1
- package/esm/contracts/trace.type.d.mts +1 -1
- package/esm/contracts/trace.type.d.mts.map +1 -1
- package/esm/dashboard/dashboard.d.mts +1 -1
- package/esm/dashboard/dashboard.d.mts.map +1 -1
- package/esm/dashboard/dashboard.mjs +1 -1
- package/esm/dashboard/dashboard.mjs.map +1 -1
- package/esm/dashboard/dashboard.type.d.mts +1 -1
- package/esm/dashboard/dashboard.type.d.mts.map +1 -1
- package/esm/dashboard/parse-query.mjs +2 -1
- package/esm/dashboard/parse-query.mjs.map +1 -1
- package/esm/dashboard/serve.mjs +1 -1
- package/esm/dashboard/serve.mjs.map +1 -1
- package/esm/dashboard/trace-filter.d.mts +1 -1
- package/esm/dashboard/trace-filter.d.mts.map +1 -1
- package/esm/dashboard/trace-filter.mjs +2 -2
- package/esm/dashboard/trace-filter.mjs.map +1 -1
- package/esm/dashboard/ui.html.mjs +6 -5
- package/esm/dashboard/ui.html.mjs.map +1 -1
- package/esm/dashboard/warlock-logo.mjs +1 -1
- package/esm/dashboard/warlock-logo.mjs.map +1 -1
- package/esm/evaluate/evaluate-system-prompt.d.mts +1 -1
- package/esm/evaluate/evaluate-system-prompt.d.mts.map +1 -1
- package/esm/evaluate/evaluate-system-prompt.mjs +1 -1
- package/esm/evaluate/evaluate-system-prompt.mjs.map +1 -1
- package/esm/evaluate/evaluate.type.d.mts +1 -1
- package/esm/evaluate/evaluate.type.d.mts.map +1 -1
- package/esm/evaluate/extract-last-system-prompt.d.mts +1 -1
- package/esm/evaluate/extract-last-system-prompt.d.mts.map +1 -1
- package/esm/evaluate/extract-last-system-prompt.mjs +1 -1
- package/esm/evaluate/extract-last-system-prompt.mjs.map +1 -1
- package/esm/evaluate/find-span-by-id.d.mts +1 -1
- package/esm/evaluate/find-span-by-id.d.mts.map +1 -1
- package/esm/evaluate/find-span-by-id.mjs +1 -1
- package/esm/evaluate/find-span-by-id.mjs.map +1 -1
- package/esm/exporters/console/console-exporter.d.mts +1 -1
- package/esm/exporters/console/console-exporter.d.mts.map +1 -1
- package/esm/exporters/console/console-exporter.mjs +5 -4
- package/esm/exporters/console/console-exporter.mjs.map +1 -1
- package/esm/exporters/console/console-exporter.type.d.mts +1 -1
- package/esm/exporters/console/console-exporter.type.d.mts.map +1 -1
- package/esm/exporters/console/format-span-io.d.mts +1 -1
- package/esm/exporters/console/format-span-io.d.mts.map +1 -1
- package/esm/exporters/console/format-span-io.mjs +1 -1
- package/esm/exporters/console/format-span-io.mjs.map +1 -1
- package/esm/exporters/console/format-span-line.d.mts +1 -1
- package/esm/exporters/console/format-span-line.d.mts.map +1 -1
- package/esm/exporters/console/format-span-line.mjs +3 -1
- package/esm/exporters/console/format-span-line.mjs.map +1 -1
- package/esm/exporters/console/index.mjs +5 -0
- package/esm/exporters/file/file-exporter.d.mts +1 -1
- package/esm/exporters/file/file-exporter.d.mts.map +1 -1
- package/esm/exporters/file/file-exporter.mjs +1 -1
- package/esm/exporters/file/file-exporter.mjs.map +1 -1
- package/esm/exporters/file/file-exporter.type.d.mts +1 -1
- package/esm/exporters/file/file-exporter.type.d.mts.map +1 -1
- package/esm/exporters/index.mjs +2 -0
- package/esm/exporters/langfuse/langfuse-exporter.d.mts +1 -1
- package/esm/exporters/langfuse/langfuse-exporter.d.mts.map +1 -1
- package/esm/exporters/langfuse/langfuse-exporter.mjs +4 -3
- package/esm/exporters/langfuse/langfuse-exporter.mjs.map +1 -1
- package/esm/exporters/langfuse/langfuse-exporter.type.d.mts +1 -1
- package/esm/exporters/langfuse/langfuse-exporter.type.d.mts.map +1 -1
- package/esm/exporters/otel/otel-api.shim.type.d.mts +1 -1
- package/esm/exporters/otel/otel-api.shim.type.d.mts.map +1 -1
- package/esm/exporters/otel/otel-exporter.d.mts +1 -1
- package/esm/exporters/otel/otel-exporter.d.mts.map +1 -1
- package/esm/exporters/otel/otel-exporter.mjs +3 -2
- package/esm/exporters/otel/otel-exporter.mjs.map +1 -1
- package/esm/exporters/otel/otel-exporter.type.d.mts +1 -1
- package/esm/exporters/otel/otel-exporter.type.d.mts.map +1 -1
- package/esm/exporters/utils/gen-ai-attributes.d.mts +1 -1
- package/esm/exporters/utils/gen-ai-attributes.d.mts.map +1 -1
- package/esm/exporters/utils/gen-ai-attributes.mjs +1 -1
- package/esm/exporters/utils/gen-ai-attributes.mjs.map +1 -1
- package/esm/exporters/utils/index.mjs +5 -0
- package/esm/exporters/utils/total-cost.d.mts +3 -5
- package/esm/exporters/utils/total-cost.d.mts.map +1 -1
- package/esm/exporters/utils/total-cost.mjs +6 -8
- package/esm/exporters/utils/total-cost.mjs.map +1 -1
- package/esm/exporters/utils/walk-spans.d.mts +1 -1
- package/esm/exporters/utils/walk-spans.d.mts.map +1 -1
- package/esm/exporters/utils/walk-spans.mjs +1 -1
- package/esm/exporters/utils/walk-spans.mjs.map +1 -1
- package/esm/panoptic/panoptic-middleware.d.mts +1 -1
- package/esm/panoptic/panoptic-middleware.d.mts.map +1 -1
- package/esm/panoptic/panoptic-middleware.mjs +1 -1
- package/esm/panoptic/panoptic-middleware.mjs.map +1 -1
- package/esm/panoptic/panoptic-target.type.d.mts +1 -1
- package/esm/panoptic/panoptic-target.type.d.mts.map +1 -1
- package/esm/panoptic/panoptic.d.mts +1 -1
- package/esm/panoptic/panoptic.d.mts.map +1 -1
- package/esm/panoptic/panoptic.mjs +1 -1
- package/esm/panoptic/panoptic.mjs.map +1 -1
- package/esm/panoptic/panoptic.type.d.mts +1 -1
- package/esm/panoptic/panoptic.type.d.mts.map +1 -1
- package/esm/register.mjs +1 -1
- package/esm/register.mjs.map +1 -1
- package/esm/store/cache-trace-store.d.mts +1 -1
- package/esm/store/cache-trace-store.d.mts.map +1 -1
- package/esm/store/cache-trace-store.mjs +2 -1
- package/esm/store/cache-trace-store.mjs.map +1 -1
- package/esm/store/in-memory-trace-store.d.mts +1 -1
- package/esm/store/in-memory-trace-store.d.mts.map +1 -1
- package/esm/store/in-memory-trace-store.mjs +4 -2
- package/esm/store/in-memory-trace-store.mjs.map +1 -1
- package/esm/store/match-trace.d.mts +1 -1
- package/esm/store/match-trace.d.mts.map +1 -1
- package/esm/store/match-trace.mjs +1 -1
- package/esm/store/match-trace.mjs.map +1 -1
- package/esm/store/sum-usage.d.mts +1 -1
- package/esm/store/sum-usage.d.mts.map +1 -1
- package/esm/store/sum-usage.mjs +1 -1
- package/esm/store/sum-usage.mjs.map +1 -1
- package/esm/store/trace-aggregate.type.d.mts +3 -7
- package/esm/store/trace-aggregate.type.d.mts.map +1 -1
- package/esm/store/trace-query.type.d.mts +1 -1
- package/esm/store/trace-query.type.d.mts.map +1 -1
- package/esm/store/trace-store.contract.d.mts +1 -1
- package/esm/store/trace-store.contract.d.mts.map +1 -1
- package/llms-full.txt +134 -117
- package/package.json +6 -5
- package/skills/evaluate-system-prompt/SKILL.md +21 -17
- package/skills/export-traces/SKILL.md +32 -24
- package/skills/index.md +3 -0
- package/skills/observe-with-panoptic/SKILL.md +18 -18
- package/skills/query-traces/SKILL.md +31 -33
- package/skills/use-local-dashboard/SKILL.md +33 -26
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,23 @@ All notable changes to `@warlock.js/ai-panoptic` are documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). `@warlock.js/*` packages are released in lockstep — every package shares the same version number, so a version below may list only the changes that affected this package.
|
|
6
6
|
|
|
7
|
+
## 5.31.0 - 2026-10-18
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- Trace cost totals (exporters, the dashboard and trace filters) include the new cache-write cost channel.
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- Tool spans carry the provider's tool-call id as the `tool.callId` attribute.
|
|
16
|
+
- Agent runs with `status: "incomplete"` (their final answer was cut off) are exported as errors: OTel `ERROR` status, Langfuse level `ERROR`, the console exporter's error stream (marked `INCOMPLETE`), the dashboard's error filter, and the `failed` count of trace-store aggregates. `?status=incomplete` is accepted by the dashboard API.
|
|
17
|
+
|
|
18
|
+
## 5.30.0 - 2026-10-16
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- Lockstep release; package APIs are unchanged.
|
|
23
|
+
|
|
7
24
|
## 5.29.0 - 2026-10-01
|
|
8
25
|
|
|
9
26
|
### Changed
|
|
@@ -75,6 +92,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
75
92
|
### Changed
|
|
76
93
|
|
|
77
94
|
- Lockstep release maintenance and dependency refresh.
|
|
95
|
+
|
|
78
96
|
## 5.20.0 - 2026-09-24
|
|
79
97
|
|
|
80
98
|
### Changed
|
|
@@ -140,9 +158,9 @@ changelogs.
|
|
|
140
158
|
|
|
141
159
|
- **Dashboard stored XSS via `javascript:` markdown links — fixed.** The dashboard's markdown link renderer (`mdInline` in `ui.html.ts`) rewrote `[text](url)` into a live `<a href>` without validating the URL scheme, so a `javascript:` URL embedded in captured trace content (`span.input` / `span.output` under `captureContent` — i.e. prompt-injected model output or attacker-controlled tool results) became a stored XSS that fired when an operator clicked the link; the page's CSP (`script-src 'unsafe-inline'`) permits `javascript:` URI execution and does not restrict top-level navigation, putting the in-page bearer token in reach. Link URLs are now checked against a scheme allowlist (`http:`, `https:`, `mailto:`, plus relative/anchor URLs) after normalizing the URL the way a browser will — attribute-entity decode, strip of ignored control chars/whitespace (`java\tscript:`), lowercase — and scheme-relative `//host` links are rejected too; a rejected URL renders its label as plain text with no `href` at all. Regression-tested by executing the actual inlined client renderer against `javascript:`/`data:`/`vbscript:` payloads and their case/whitespace/entity obfuscations (`ui.html.md-links.spec.ts`)
|
|
142
160
|
- **Dashboard token-handling hardening (3 residual findings from the same audit as the XSS above).** None of these are exploitable on their own today, but each widened the blast radius of a future bug:
|
|
143
|
-
-
|
|
144
|
-
-
|
|
145
|
-
-
|
|
161
|
+
- _Bearer token no longer a page-global._ `ui.html.ts`'s client script kept `TOKEN` as a `var` shared across its whole ~1000-line closure. It's now sealed inside its own inner IIFE that exposes only the `fetchAuthed` helper — code elsewhere in that closure (present or future) can no longer read the raw token by name.
|
|
162
|
+
- _Constant-time token comparison._ `serve.ts`'s `isAuthorized` compared the header/query token with plain `===`, which short-circuits on the first differing byte and is a textbook timing side-channel — the one scenario the package's own docs call out as realistic (`authToken` is required specifically when bound off-loopback, i.e. reachable over a network). Both the header and query-string checks now go through `crypto.timingSafeEqual` on length-checked, equal-length buffers.
|
|
163
|
+
- _Token-in-URL narrowed to the one route that needs it._ `?token=` is no longer accepted on the JSON API routes, only on the HTML page route. The page's own polling already re-sends the token as an `Authorization` header (fixed in 4.8.2), so the only request that structurally _can't_ carry a header is the initial browser navigation that loads the HTML shell — that's the sole remaining query-string exposure, narrowing the token's footprint in access/proxy logs and browser history from every poll to one request.
|
|
146
164
|
|
|
147
165
|
## 4.12.0
|
|
148
166
|
|
package/README.md
CHANGED
|
@@ -81,8 +81,8 @@ Four exporters ship today, each a factory returning an `ExporterContract`:
|
|
|
81
81
|
```ts
|
|
82
82
|
import {
|
|
83
83
|
consoleExporter, // zero-dep — print trace summary or full span tree
|
|
84
|
-
fileExporter,
|
|
85
|
-
otelExporter,
|
|
84
|
+
fileExporter, // zero-dep — append traces as JSON Lines, buffered
|
|
85
|
+
otelExporter, // OpenTelemetry — gen_ai.* semantic conventions (lazy @opentelemetry/api)
|
|
86
86
|
langfuseExporter, // Langfuse — traces + generations (lazy langfuse)
|
|
87
87
|
} from "@warlock.js/ai-panoptic";
|
|
88
88
|
|
package/cjs/index.cjs
CHANGED
|
@@ -6,7 +6,7 @@ let node_http = require("node:http");
|
|
|
6
6
|
let node_crypto = require("node:crypto");
|
|
7
7
|
let _warlock_js_logger = require("@warlock.js/logger");
|
|
8
8
|
|
|
9
|
-
//#region
|
|
9
|
+
//#region ../../packages/ai-panoptic/src/exporters/utils/walk-spans.ts
|
|
10
10
|
/**
|
|
11
11
|
* Depth-first pre-order traversal of a {@link TraceSpan} tree, yielding
|
|
12
12
|
* the root first and then each descendant in `children` (invocation)
|
|
@@ -25,7 +25,7 @@ function* walkSpans(root) {
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
//#endregion
|
|
28
|
-
//#region
|
|
28
|
+
//#region ../../packages/ai-panoptic/src/collector/normalize-error.ts
|
|
29
29
|
/**
|
|
30
30
|
* Project a captured execution error onto the structural
|
|
31
31
|
* {@link TraceSpanError} shape used on a failed / cancelled span.
|
|
@@ -73,7 +73,7 @@ function pickString(value) {
|
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
//#endregion
|
|
76
|
-
//#region
|
|
76
|
+
//#region ../../packages/ai-panoptic/src/collector/extract-span-attributes.ts
|
|
77
77
|
/**
|
|
78
78
|
* Build the free-form `TraceSpan.attributes` bag for one report node.
|
|
79
79
|
*
|
|
@@ -146,11 +146,12 @@ function addOrchestratorAttributes(attributes, extensions) {
|
|
|
146
146
|
}
|
|
147
147
|
function addToolAttributes(attributes, extensions) {
|
|
148
148
|
if (extensions.tripIndex !== void 0) attributes["tool.tripIndex"] = extensions.tripIndex;
|
|
149
|
+
if (extensions.callId !== void 0) attributes["tool.callId"] = extensions.callId;
|
|
149
150
|
if (extensions.recoveredFrom !== void 0) attributes["tool.recoveredFrom"] = extensions.recoveredFrom;
|
|
150
151
|
}
|
|
151
152
|
|
|
152
153
|
//#endregion
|
|
153
|
-
//#region
|
|
154
|
+
//#region ../../packages/ai-panoptic/src/collector/report-to-span.ts
|
|
154
155
|
/**
|
|
155
156
|
* Project one {@link BaseReport} node — and its entire subtree — into a
|
|
156
157
|
* {@link TraceSpan}. Pure and recursive: identity, timing, status, and
|
|
@@ -283,7 +284,7 @@ function lastNonEmptyOutput(trips) {
|
|
|
283
284
|
}
|
|
284
285
|
|
|
285
286
|
//#endregion
|
|
286
|
-
//#region
|
|
287
|
+
//#region ../../packages/ai-panoptic/src/collector/report-to-trace.ts
|
|
287
288
|
/**
|
|
288
289
|
* Project an outermost {@link BaseReport} (one whole `.execute()` /
|
|
289
290
|
* `.invoke()` run) into a {@link Trace} — the root {@link
|
|
@@ -334,7 +335,7 @@ function reportToTrace(report, rootError, options) {
|
|
|
334
335
|
}
|
|
335
336
|
|
|
336
337
|
//#endregion
|
|
337
|
-
//#region
|
|
338
|
+
//#region ../../packages/ai-panoptic/src/collector/collector.ts
|
|
338
339
|
/**
|
|
339
340
|
* Drive the source end of the Panoptic pipeline: ingest core
|
|
340
341
|
* `@warlock.js/ai` {@link BaseReport} trees, project them into {@link
|
|
@@ -458,7 +459,7 @@ function createCollector(options = {}) {
|
|
|
458
459
|
}
|
|
459
460
|
|
|
460
461
|
//#endregion
|
|
461
|
-
//#region
|
|
462
|
+
//#region ../../packages/ai-panoptic/src/store/match-trace.ts
|
|
462
463
|
/**
|
|
463
464
|
* Test whether one trace satisfies a {@link TraceQuery}. Every declared
|
|
464
465
|
* filter field must match (logical AND); absent fields are ignored, so
|
|
@@ -500,7 +501,7 @@ function toEpoch(bound) {
|
|
|
500
501
|
}
|
|
501
502
|
|
|
502
503
|
//#endregion
|
|
503
|
-
//#region
|
|
504
|
+
//#region ../../packages/ai-panoptic/src/store/sum-usage.ts
|
|
504
505
|
/**
|
|
505
506
|
* Fold a child {@link Usage} into a running accumulator. Token channels
|
|
506
507
|
* (`input` / `output` / `total`) always sum; the optional cache /
|
|
@@ -561,7 +562,7 @@ function sumOptional(accumulator, next) {
|
|
|
561
562
|
}
|
|
562
563
|
|
|
563
564
|
//#endregion
|
|
564
|
-
//#region
|
|
565
|
+
//#region ../../packages/ai-panoptic/src/store/cache-trace-store.ts
|
|
565
566
|
const DEFAULT_PREFIX = "panoptic";
|
|
566
567
|
/**
|
|
567
568
|
* Cache-backed {@link TraceStoreContract} with a **write-through** design
|
|
@@ -781,6 +782,7 @@ var CacheTraceStore = class {
|
|
|
781
782
|
aggregate.completed += 1;
|
|
782
783
|
break;
|
|
783
784
|
case "failed":
|
|
785
|
+
case "incomplete":
|
|
784
786
|
aggregate.failed += 1;
|
|
785
787
|
break;
|
|
786
788
|
case "cancelled":
|
|
@@ -846,7 +848,7 @@ function createCacheTraceStore(cache, options = {}) {
|
|
|
846
848
|
}
|
|
847
849
|
|
|
848
850
|
//#endregion
|
|
849
|
-
//#region
|
|
851
|
+
//#region ../../packages/ai-panoptic/src/store/in-memory-trace-store.ts
|
|
850
852
|
/**
|
|
851
853
|
* In-memory {@link TraceStoreContract} that doubles as an
|
|
852
854
|
* {@link ExporterContract} — register it on a collector
|
|
@@ -927,7 +929,8 @@ var InMemoryTraceStore = class {
|
|
|
927
929
|
* Non-terminal statuses (`awaiting-input`, `max-iterations`) are
|
|
928
930
|
* counted in `traces` but tracked by none of the three headline
|
|
929
931
|
* counters — intentional, those three answer the common
|
|
930
|
-
* "succeeded / errored / aborted" question.
|
|
932
|
+
* "succeeded / errored / aborted" question. An `incomplete` agent run
|
|
933
|
+
* (its answer was cut off) errored, so it counts as `failed`.
|
|
931
934
|
*/
|
|
932
935
|
countStatus(aggregate, trace) {
|
|
933
936
|
switch (trace.root.status) {
|
|
@@ -935,6 +938,7 @@ var InMemoryTraceStore = class {
|
|
|
935
938
|
aggregate.completed += 1;
|
|
936
939
|
break;
|
|
937
940
|
case "failed":
|
|
941
|
+
case "incomplete":
|
|
938
942
|
aggregate.failed += 1;
|
|
939
943
|
break;
|
|
940
944
|
case "cancelled":
|
|
@@ -982,13 +986,11 @@ function createInMemoryTraceStore(options) {
|
|
|
982
986
|
}
|
|
983
987
|
|
|
984
988
|
//#endregion
|
|
985
|
-
//#region
|
|
989
|
+
//#region ../../packages/ai-panoptic/src/exporters/utils/total-cost.ts
|
|
986
990
|
/**
|
|
987
991
|
* Collapse a {@link Usage.cost} breakdown into a single USD scalar by
|
|
988
|
-
* summing every populated
|
|
989
|
-
*
|
|
990
|
-
* folds in `reasoning` for forward-safety when a provider prices
|
|
991
|
-
* reasoning tokens as a separate channel. Returns `undefined` when no
|
|
992
|
+
* summing every populated channel (input, output, cache reads, cache
|
|
993
|
+
* writes, reasoning) via `totalCost` from `@warlock.js/ai`. Returns `undefined` when no
|
|
992
994
|
* pricing was attached, so exporters can omit the cost attribute
|
|
993
995
|
* entirely rather than reporting a misleading `0`.
|
|
994
996
|
*
|
|
@@ -997,13 +999,11 @@ function createInMemoryTraceStore(options) {
|
|
|
997
999
|
* // => 0.05
|
|
998
1000
|
*/
|
|
999
1001
|
function totalCostUsd(usage) {
|
|
1000
|
-
|
|
1001
|
-
if (!cost) return;
|
|
1002
|
-
return (cost.input ?? 0) + (cost.output ?? 0) + (cost.cachedInput ?? 0) + (cost.cachedOutput ?? 0) + (cost.reasoning ?? 0);
|
|
1002
|
+
return (0, _warlock_js_ai.totalCost)(usage.cost);
|
|
1003
1003
|
}
|
|
1004
1004
|
|
|
1005
1005
|
//#endregion
|
|
1006
|
-
//#region
|
|
1006
|
+
//#region ../../packages/ai-panoptic/src/exporters/utils/gen-ai-attributes.ts
|
|
1007
1007
|
/**
|
|
1008
1008
|
* Subset of the OpenTelemetry GenAI semantic-convention attribute keys
|
|
1009
1009
|
* Panoptic emits. Kept as a named constant map (not inline string
|
|
@@ -1091,7 +1091,7 @@ function mergeScalarAttributes(target, source) {
|
|
|
1091
1091
|
}
|
|
1092
1092
|
|
|
1093
1093
|
//#endregion
|
|
1094
|
-
//#region
|
|
1094
|
+
//#region ../../packages/ai-panoptic/src/exporters/console/format-span-io.ts
|
|
1095
1095
|
/** Default cap on how many characters of captured content a console line shows. */
|
|
1096
1096
|
const DEFAULT_IO_MAX_CHARS = 500;
|
|
1097
1097
|
/**
|
|
@@ -1141,7 +1141,7 @@ function stringify(value) {
|
|
|
1141
1141
|
}
|
|
1142
1142
|
|
|
1143
1143
|
//#endregion
|
|
1144
|
-
//#region
|
|
1144
|
+
//#region ../../packages/ai-panoptic/src/exporters/console/format-span-line.ts
|
|
1145
1145
|
/**
|
|
1146
1146
|
* Render a single {@link TraceSpan} as one scannable console line:
|
|
1147
1147
|
* `<status> <type> "<name>" — <duration>ms, <tokens> tok[, $<cost>]`.
|
|
@@ -1171,6 +1171,7 @@ function statusMarker(status) {
|
|
|
1171
1171
|
case "completed": return "ok";
|
|
1172
1172
|
case "failed": return "ERR";
|
|
1173
1173
|
case "cancelled": return "cancel";
|
|
1174
|
+
case "incomplete": return "INCOMPLETE";
|
|
1174
1175
|
case "max-iterations": return "max-iter";
|
|
1175
1176
|
case "awaiting-input": return "await";
|
|
1176
1177
|
default: return status;
|
|
@@ -1178,7 +1179,7 @@ function statusMarker(status) {
|
|
|
1178
1179
|
}
|
|
1179
1180
|
|
|
1180
1181
|
//#endregion
|
|
1181
|
-
//#region
|
|
1182
|
+
//#region ../../packages/ai-panoptic/src/exporters/console/console-exporter.ts
|
|
1182
1183
|
const EXPORTER_NAME$3 = "console";
|
|
1183
1184
|
/**
|
|
1184
1185
|
* Zero-dependency {@link ExporterContract} that prints traces to a
|
|
@@ -1245,11 +1246,11 @@ function writeSpan(sink, span, depth, io, ioMaxChars) {
|
|
|
1245
1246
|
if (io) for (const line of formatSpanIO(span, depth, ioMaxChars)) writeAtSeverity(sink, span.status, line);
|
|
1246
1247
|
}
|
|
1247
1248
|
/**
|
|
1248
|
-
* Route a line to `error` when the span failed/cancelled,
|
|
1249
|
-
* `log`. Keeps healthy traces out of the error stream.
|
|
1249
|
+
* Route a line to `error` when the span failed/cancelled/incomplete,
|
|
1250
|
+
* otherwise to `log`. Keeps healthy traces out of the error stream.
|
|
1250
1251
|
*/
|
|
1251
1252
|
function writeAtSeverity(sink, status, line) {
|
|
1252
|
-
if (status === "failed" || status === "cancelled") {
|
|
1253
|
+
if (status === "failed" || status === "cancelled" || status === "incomplete") {
|
|
1253
1254
|
sink.error(line);
|
|
1254
1255
|
return;
|
|
1255
1256
|
}
|
|
@@ -1269,7 +1270,7 @@ function spanDepth(root, targetSpanId, depth = 0) {
|
|
|
1269
1270
|
}
|
|
1270
1271
|
|
|
1271
1272
|
//#endregion
|
|
1272
|
-
//#region
|
|
1273
|
+
//#region ../../packages/ai-panoptic/src/exporters/file/file-exporter.ts
|
|
1273
1274
|
const EXPORTER_NAME$2 = "file";
|
|
1274
1275
|
/**
|
|
1275
1276
|
* Zero-dependency {@link ExporterContract} that appends completed traces
|
|
@@ -1360,7 +1361,7 @@ var FileTraceWriter = class {
|
|
|
1360
1361
|
};
|
|
1361
1362
|
|
|
1362
1363
|
//#endregion
|
|
1363
|
-
//#region
|
|
1364
|
+
//#region ../../packages/ai-panoptic/src/exporters/langfuse/langfuse-exporter.ts
|
|
1364
1365
|
const EXPORTER_NAME$1 = "langfuse";
|
|
1365
1366
|
let LangfuseSdk;
|
|
1366
1367
|
let isModuleExists$1 = null;
|
|
@@ -1556,15 +1557,15 @@ function langfuseMetadata(span) {
|
|
|
1556
1557
|
}
|
|
1557
1558
|
/**
|
|
1558
1559
|
* Map the Panoptic span status onto a Langfuse observation level —
|
|
1559
|
-
* failed/cancelled spans surface as `ERROR`, everything else `DEFAULT`.
|
|
1560
|
+
* failed/cancelled/incomplete spans surface as `ERROR`, everything else `DEFAULT`.
|
|
1560
1561
|
*/
|
|
1561
1562
|
function toLevel(span) {
|
|
1562
|
-
if (span.status === "failed" || span.status === "cancelled") return "ERROR";
|
|
1563
|
+
if (span.status === "failed" || span.status === "cancelled" || span.status === "incomplete") return "ERROR";
|
|
1563
1564
|
return "DEFAULT";
|
|
1564
1565
|
}
|
|
1565
1566
|
|
|
1566
1567
|
//#endregion
|
|
1567
|
-
//#region
|
|
1568
|
+
//#region ../../packages/ai-panoptic/src/exporters/otel/otel-exporter.ts
|
|
1568
1569
|
const EXPORTER_NAME = "otel";
|
|
1569
1570
|
const DEFAULT_TRACER_NAME = "@warlock.js/ai-panoptic";
|
|
1570
1571
|
let OtelApi;
|
|
@@ -1692,7 +1693,7 @@ function applyStatus(otelSpan, span) {
|
|
|
1692
1693
|
message: span.error.message,
|
|
1693
1694
|
stack: span.error.stack
|
|
1694
1695
|
});
|
|
1695
|
-
if (span.status === "failed" || span.status === "cancelled") {
|
|
1696
|
+
if (span.status === "failed" || span.status === "cancelled" || span.status === "incomplete") {
|
|
1696
1697
|
otelSpan.setStatus({
|
|
1697
1698
|
code: codes.ERROR,
|
|
1698
1699
|
message: span.error?.message
|
|
@@ -1717,7 +1718,7 @@ function toEpochMillis(isoTimestamp) {
|
|
|
1717
1718
|
}
|
|
1718
1719
|
|
|
1719
1720
|
//#endregion
|
|
1720
|
-
//#region
|
|
1721
|
+
//#region ../../packages/ai-panoptic/src/panoptic/panoptic-middleware.ts
|
|
1721
1722
|
/**
|
|
1722
1723
|
* Build an {@link AgentMiddleware} that feeds a collector from the
|
|
1723
1724
|
* `execute`- and `supervisor`-level hooks. An alternative wiring to event
|
|
@@ -1783,7 +1784,7 @@ function isReport(value) {
|
|
|
1783
1784
|
}
|
|
1784
1785
|
|
|
1785
1786
|
//#endregion
|
|
1786
|
-
//#region
|
|
1787
|
+
//#region ../../packages/ai-panoptic/src/panoptic/panoptic.ts
|
|
1787
1788
|
/**
|
|
1788
1789
|
* Terminal `*.completed` events of every core primitive that carries the
|
|
1789
1790
|
* finalized `result` (and therefore the `report` tree). These fire once
|
|
@@ -1920,7 +1921,7 @@ function panoptic(options = {}) {
|
|
|
1920
1921
|
}
|
|
1921
1922
|
|
|
1922
1923
|
//#endregion
|
|
1923
|
-
//#region
|
|
1924
|
+
//#region ../../packages/ai-panoptic/src/evaluate/evaluate-system-prompt.ts
|
|
1924
1925
|
/**
|
|
1925
1926
|
* Grade `systemPrompt` with the configured judge model, reusing
|
|
1926
1927
|
* `ai.prompts().validate()`'s own `judgePromptBody` — never a second
|
|
@@ -1938,7 +1939,7 @@ async function evaluateSystemPrompt(systemPrompt, config, instructionsOverride)
|
|
|
1938
1939
|
}
|
|
1939
1940
|
|
|
1940
1941
|
//#endregion
|
|
1941
|
-
//#region
|
|
1942
|
+
//#region ../../packages/ai-panoptic/src/evaluate/extract-last-system-prompt.ts
|
|
1942
1943
|
/**
|
|
1943
1944
|
* Pull the LAST `{role: "system"}` message off a span's captured `input`.
|
|
1944
1945
|
*
|
|
@@ -1960,7 +1961,7 @@ function extractLastSystemPrompt(span) {
|
|
|
1960
1961
|
}
|
|
1961
1962
|
|
|
1962
1963
|
//#endregion
|
|
1963
|
-
//#region
|
|
1964
|
+
//#region ../../packages/ai-panoptic/src/evaluate/find-span-by-id.ts
|
|
1964
1965
|
/** Depth-first search for the span with `spanId` inside a trace's span tree. */
|
|
1965
1966
|
function findSpanById(root, spanId) {
|
|
1966
1967
|
if (root.spanId === spanId) return root;
|
|
@@ -1971,7 +1972,7 @@ function findSpanById(root, spanId) {
|
|
|
1971
1972
|
}
|
|
1972
1973
|
|
|
1973
1974
|
//#endregion
|
|
1974
|
-
//#region
|
|
1975
|
+
//#region ../../packages/ai-panoptic/src/dashboard/parse-query.ts
|
|
1975
1976
|
/**
|
|
1976
1977
|
* The set of terminal statuses a stored trace can carry. Used to keep
|
|
1977
1978
|
* `parseQuery` from forwarding arbitrary `?status=` junk into the store.
|
|
@@ -1980,6 +1981,7 @@ const KNOWN_STATUSES = [
|
|
|
1980
1981
|
"completed",
|
|
1981
1982
|
"failed",
|
|
1982
1983
|
"cancelled",
|
|
1984
|
+
"incomplete",
|
|
1983
1985
|
"max-iterations",
|
|
1984
1986
|
"awaiting-input",
|
|
1985
1987
|
"awaiting-approval"
|
|
@@ -2023,7 +2025,7 @@ function parseQuery(params) {
|
|
|
2023
2025
|
}
|
|
2024
2026
|
|
|
2025
2027
|
//#endregion
|
|
2026
|
-
//#region
|
|
2028
|
+
//#region ../../packages/ai-panoptic/src/dashboard/warlock-logo.ts
|
|
2027
2029
|
/**
|
|
2028
2030
|
* The Warlock logo as an inlined base64 PNG data URI (64x64, ~9KB).
|
|
2029
2031
|
* Inlined so the dashboard stays a single self-contained, offline-capable
|
|
@@ -2034,7 +2036,7 @@ function parseQuery(params) {
|
|
|
2034
2036
|
const WARLOCK_LOGO_DATA_URI = "data:image/png;base64,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";
|
|
2035
2037
|
|
|
2036
2038
|
//#endregion
|
|
2037
|
-
//#region
|
|
2039
|
+
//#region ../../packages/ai-panoptic/src/dashboard/ui.html.ts
|
|
2038
2040
|
/**
|
|
2039
2041
|
* Build the single self-contained dashboard HTML page. No external
|
|
2040
2042
|
* assets, no bundler, no framework — one inlined string that polls the
|
|
@@ -2370,13 +2372,14 @@ function dashboardHtml(basePath, title, evaluateEnabled = false, evaluateDefault
|
|
|
2370
2372
|
|
|
2371
2373
|
var STATUS_FILTERS = ["completed", "failed", "cancelled"];
|
|
2372
2374
|
var TYPE_FILTERS = ["agent", "tool", "model", "supervisor", "team", "workflow", "orchestrator", "planner", "batch", "callback"];
|
|
2373
|
-
var ERROR_STATUSES = { failed: 1, cancelled: 1 };
|
|
2375
|
+
var ERROR_STATUSES = { failed: 1, cancelled: 1, incomplete: 1 };
|
|
2374
2376
|
var NO_SESSION_KEY = "(no session)";
|
|
2375
2377
|
var NO_PROMPT_KEY = "(no prompt)";
|
|
2376
2378
|
var NO_TYPE_KEY = "(no type)";
|
|
2377
2379
|
|
|
2378
2380
|
var statusClass = function (s) {
|
|
2379
2381
|
if (s === "completed" || s === "failed" || s === "cancelled") return s;
|
|
2382
|
+
if (s === "incomplete") return "failed";
|
|
2380
2383
|
return "other";
|
|
2381
2384
|
};
|
|
2382
2385
|
var esc = function (v) {
|
|
@@ -2464,7 +2467,7 @@ function dashboardHtml(basePath, title, evaluateEnabled = false, evaluateDefault
|
|
|
2464
2467
|
// Sum every priced lane of a cost object into one USD number.
|
|
2465
2468
|
function costSumObj(c) {
|
|
2466
2469
|
if (!c) return 0;
|
|
2467
|
-
return (c.input || 0) + (c.output || 0) + (c.cachedInput || 0) + (c.cachedOutput || 0) + (c.reasoning || 0);
|
|
2470
|
+
return (c.input || 0) + (c.output || 0) + (c.cachedInput || 0) + (c.cacheWrite || 0) + (c.cachedOutput || 0) + (c.reasoning || 0);
|
|
2468
2471
|
}
|
|
2469
2472
|
// The cost a single span directly carries (on its rolled-up usage).
|
|
2470
2473
|
function usageCost(usage) { return usage ? costSumObj(usage.cost) : 0; }
|
|
@@ -2798,7 +2801,7 @@ function dashboardHtml(basePath, title, evaluateEnabled = false, evaluateDefault
|
|
|
2798
2801
|
}
|
|
2799
2802
|
|
|
2800
2803
|
function renderStats(a) {
|
|
2801
|
-
var cost = a.cost ? (((a.cost.input || 0) + (a.cost.output || 0) + (a.cost.cachedInput || 0) + (a.cost.cachedOutput || 0)).toFixed(4)) : "—";
|
|
2804
|
+
var cost = a.cost ? (((a.cost.input || 0) + (a.cost.output || 0) + (a.cost.cachedInput || 0) + (a.cost.cacheWrite || 0) + (a.cost.cachedOutput || 0) + (a.cost.reasoning || 0)).toFixed(4)) : "—";
|
|
2802
2805
|
var u = a.usage || {};
|
|
2803
2806
|
var cells = [
|
|
2804
2807
|
["traces", num(a.traces), null],
|
|
@@ -3055,7 +3058,7 @@ function dashboardHtml(basePath, title, evaluateEnabled = false, evaluateDefault
|
|
|
3055
3058
|
// "Supervisor Terminated By", "span id" → "Span ID", "agent.trips" →
|
|
3056
3059
|
// "Agent Trips". Underlying attribute keys are untouched.
|
|
3057
3060
|
// NB: this whole script is a template literal — regex backslash classes
|
|
3058
|
-
// MUST be double-escaped (\\s
|
|
3061
|
+
// MUST be double-escaped (\\s) so the rendered script retains its backslash.
|
|
3059
3062
|
function humanizeKey(key) {
|
|
3060
3063
|
return String(key).split(/[.\\s]+/).map(function (seg) {
|
|
3061
3064
|
return seg.replace(/([a-z0-9])([A-Z])/g, "$1 $2").split(/\\s+/).map(function (w) {
|
|
@@ -3519,7 +3522,7 @@ function encodeForInlineScript(value) {
|
|
|
3519
3522
|
}
|
|
3520
3523
|
|
|
3521
3524
|
//#endregion
|
|
3522
|
-
//#region
|
|
3525
|
+
//#region ../../packages/ai-panoptic/src/dashboard/serve.ts
|
|
3523
3526
|
/** Hard cap on the evaluate route's request body — well beyond a real instructions string. */
|
|
3524
3527
|
const MAX_EVALUATE_BODY_BYTES = 64 * 1024;
|
|
3525
3528
|
/**
|
|
@@ -3768,7 +3771,7 @@ async function handleEvaluate(store, evaluate, traceId, spanId, req, res) {
|
|
|
3768
3771
|
}
|
|
3769
3772
|
|
|
3770
3773
|
//#endregion
|
|
3771
|
-
//#region
|
|
3774
|
+
//#region ../../packages/ai-panoptic/src/dashboard/dashboard.ts
|
|
3772
3775
|
const DEFAULT_PORT = 4319;
|
|
3773
3776
|
const DEFAULT_HOST = "127.0.0.1";
|
|
3774
3777
|
const DEFAULT_TITLE = "Panoptic";
|
|
@@ -3896,7 +3899,7 @@ function openBrowser(url) {
|
|
|
3896
3899
|
}
|
|
3897
3900
|
|
|
3898
3901
|
//#endregion
|
|
3899
|
-
//#region
|
|
3902
|
+
//#region ../../packages/ai-panoptic/src/dashboard/trace-filter.ts
|
|
3900
3903
|
/** Statuses the errors-only toggle keeps. */
|
|
3901
3904
|
const ERROR_STATUSES = ["failed", "cancelled"];
|
|
3902
3905
|
/**
|
|
@@ -4124,7 +4127,7 @@ function aggregateByType(traces) {
|
|
|
4124
4127
|
*/
|
|
4125
4128
|
function costSumObj(cost) {
|
|
4126
4129
|
if (cost === void 0) return 0;
|
|
4127
|
-
return (cost.input ?? 0) + (cost.output ?? 0) + (cost.cachedInput ?? 0) + (cost.cachedOutput ?? 0) + (cost.reasoning ?? 0);
|
|
4130
|
+
return (cost.input ?? 0) + (cost.output ?? 0) + (cost.cachedInput ?? 0) + (cost.cacheWrite ?? 0) + (cost.cachedOutput ?? 0) + (cost.reasoning ?? 0);
|
|
4128
4131
|
}
|
|
4129
4132
|
/**
|
|
4130
4133
|
* Rollup-aware subtree cost: a node's own cost when it carries one
|
|
@@ -4164,7 +4167,7 @@ function maxNodeCost(root) {
|
|
|
4164
4167
|
}
|
|
4165
4168
|
|
|
4166
4169
|
//#endregion
|
|
4167
|
-
//#region
|
|
4170
|
+
//#region ../../packages/ai-panoptic/src/config/apply-panoptic-config.ts
|
|
4168
4171
|
let applied;
|
|
4169
4172
|
/**
|
|
4170
4173
|
* Read a {@link PanopticConfig} and wire panoptic onto the core observe
|
|
@@ -4246,7 +4249,7 @@ function startDashboard(store, dashboardConfig) {
|
|
|
4246
4249
|
}
|
|
4247
4250
|
|
|
4248
4251
|
//#endregion
|
|
4249
|
-
//#region
|
|
4252
|
+
//#region ../../packages/ai-panoptic/src/register.ts
|
|
4250
4253
|
(0, _warlock_js_ai.onConfigApplied)((config) => {
|
|
4251
4254
|
applyPanopticConfig(config.panoptic);
|
|
4252
4255
|
});
|