@dudousxd/nestjs-agent-dashboard 0.4.1 → 0.6.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/dist/client/agent-client.d.ts +94 -0
- package/dist/client/agent-client.d.ts.map +1 -1
- package/dist/client/agent-client.js +32 -0
- package/dist/client/agent-client.js.map +1 -1
- package/dist/client/error-breakdown.d.ts +9 -0
- package/dist/client/error-breakdown.d.ts.map +1 -0
- package/dist/client/error-breakdown.js +20 -0
- package/dist/client/error-breakdown.js.map +1 -0
- package/dist/client/format-usd.d.ts +2 -0
- package/dist/client/format-usd.d.ts.map +1 -1
- package/dist/client/format-usd.js +13 -0
- package/dist/client/format-usd.js.map +1 -1
- package/dist/client/run-trend-path.d.ts +30 -0
- package/dist/client/run-trend-path.d.ts.map +1 -0
- package/dist/client/run-trend-path.js +36 -0
- package/dist/client/run-trend-path.js.map +1 -0
- package/dist/server/index.cjs +235 -56
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.d.cts +67 -4
- package/dist/server/index.d.ts +67 -4
- package/dist/server/index.js +194 -17
- package/dist/server/index.js.map +1 -1
- package/dist/spa/assets/index-BjIcXlBO.js +1 -0
- package/dist/spa/assets/index-CES4RqI4.js +49 -0
- package/dist/spa/assets/index-CVcgbps5.css +1 -0
- package/dist/spa/assets/preview-A3jHlGra.js +1 -0
- package/dist/spa/index.html +3 -3
- package/dist/spa/preview.html +3 -3
- package/package.json +2 -2
- package/dist/spa/assets/index-BHFHKR8b.css +0 -1
- package/dist/spa/assets/index-DPCmjbDB.js +0 -1
- package/dist/spa/assets/index-DXmRzl_c.js +0 -49
- package/dist/spa/assets/preview-BQeQWTP5.js +0 -1
|
@@ -57,6 +57,86 @@ export interface ThreadActivityRow {
|
|
|
57
57
|
/** Human-readable label resolved from `actorRef` (an `ActorDirectory`), when one is bound server-side. */
|
|
58
58
|
actorLabel: string | null;
|
|
59
59
|
}
|
|
60
|
+
/** Aggregated run reliability over a range. */
|
|
61
|
+
export interface RunMetrics {
|
|
62
|
+
runs: number;
|
|
63
|
+
completed: number;
|
|
64
|
+
failed: number;
|
|
65
|
+
/** completed / runs, 0 when runs = 0. */
|
|
66
|
+
successRate: number;
|
|
67
|
+
/** Total llm-step retries across the range's runs. */
|
|
68
|
+
retries: number;
|
|
69
|
+
durationP50Ms: number | null;
|
|
70
|
+
durationP95Ms: number | null;
|
|
71
|
+
}
|
|
72
|
+
/** Run/failure counts for one agent over a range. */
|
|
73
|
+
export interface RunAgentBreakdownRow {
|
|
74
|
+
agentName: string;
|
|
75
|
+
runs: number;
|
|
76
|
+
failed: number;
|
|
77
|
+
retries: number;
|
|
78
|
+
}
|
|
79
|
+
/** Failure count for one error code over a range. */
|
|
80
|
+
export interface RunErrorBreakdownRow {
|
|
81
|
+
errorCode: string;
|
|
82
|
+
count: number;
|
|
83
|
+
}
|
|
84
|
+
/** One point on the daily run/failure trend. */
|
|
85
|
+
export interface RunTrendPoint {
|
|
86
|
+
day: string;
|
|
87
|
+
runs: number;
|
|
88
|
+
failed: number;
|
|
89
|
+
}
|
|
90
|
+
/** A recent run for the Reliability recent-runs table. */
|
|
91
|
+
export interface RecentRunRow {
|
|
92
|
+
runId: string;
|
|
93
|
+
threadId: string;
|
|
94
|
+
actorRef: string;
|
|
95
|
+
agentName: string | null;
|
|
96
|
+
status: string;
|
|
97
|
+
durationMs: number | null;
|
|
98
|
+
errorCode: string | null;
|
|
99
|
+
errorMessage: string | null;
|
|
100
|
+
retries: number;
|
|
101
|
+
startedAt: string;
|
|
102
|
+
/** sha256 hex of the run's resolved (pre-RAG) system prompt; `null` for a run recorded before this shipped. */
|
|
103
|
+
promptHash: string | null;
|
|
104
|
+
}
|
|
105
|
+
/** One tool call awaiting a HITL decision, for the cross-thread approvals inbox. */
|
|
106
|
+
export interface PendingApprovalRow {
|
|
107
|
+
toolCallId: string;
|
|
108
|
+
toolName: string;
|
|
109
|
+
input: unknown;
|
|
110
|
+
threadId: string;
|
|
111
|
+
threadTitle: string;
|
|
112
|
+
/** Who asked — the run's actor. */
|
|
113
|
+
actorRef: string;
|
|
114
|
+
agentName: string | null;
|
|
115
|
+
/** ISO timestamp. */
|
|
116
|
+
requestedAt: string;
|
|
117
|
+
}
|
|
118
|
+
/** Body for `POST <api>/approvals/:toolCallId` — decide a pending HITL tool call. */
|
|
119
|
+
export interface ApprovalDecisionInput {
|
|
120
|
+
approved: boolean;
|
|
121
|
+
reason?: string;
|
|
122
|
+
}
|
|
123
|
+
/** Governance rollup for one tool over a range, for the Tools section. */
|
|
124
|
+
export interface ToolStatRow {
|
|
125
|
+
toolName: string;
|
|
126
|
+
toolType: string;
|
|
127
|
+
calls: number;
|
|
128
|
+
failed: number;
|
|
129
|
+
rejected: number;
|
|
130
|
+
/** p95 of executionMs across executed calls; null when none carry it. */
|
|
131
|
+
p95ExecutionMs: number | null;
|
|
132
|
+
}
|
|
133
|
+
/** The `GET <api>/reliability` response. */
|
|
134
|
+
export interface ReliabilityOverview {
|
|
135
|
+
metrics: RunMetrics;
|
|
136
|
+
byAgent: RunAgentBreakdownRow[];
|
|
137
|
+
errors: RunErrorBreakdownRow[];
|
|
138
|
+
trend: RunTrendPoint[];
|
|
139
|
+
}
|
|
60
140
|
/** A model's current per-1M-token price (the pricing tab's row shape). */
|
|
61
141
|
export interface ModelPrice {
|
|
62
142
|
modelId: string;
|
|
@@ -99,8 +179,22 @@ export declare const agentClient: {
|
|
|
99
179
|
spend(range: GovernanceRange): Promise<SpendOverview>;
|
|
100
180
|
/** Top threads by cost for a day range (default 10). */
|
|
101
181
|
topThreads(range: GovernanceRange, limit?: number): Promise<ThreadSpendRow[]>;
|
|
182
|
+
/** Run reliability for a day range: `{ metrics, byAgent, errors, trend }`. */
|
|
183
|
+
reliability(range: GovernanceRange): Promise<ReliabilityOverview>;
|
|
184
|
+
/** Most recent runs (default 50). */
|
|
185
|
+
runs(limit?: number): Promise<RecentRunRow[]>;
|
|
102
186
|
/** Most recent tool calls (default 50). */
|
|
103
187
|
toolCalls(limit?: number): Promise<ToolCallActivityRow[]>;
|
|
188
|
+
/** Tool calls sitting `pending_approval`, oldest first (default 50) — the approvals inbox. */
|
|
189
|
+
approvals(limit?: number): Promise<PendingApprovalRow[]>;
|
|
190
|
+
/**
|
|
191
|
+
* Decide a pending HITL tool call. 501s (a plain `Error` whose message starts with `501`, like
|
|
192
|
+
* `upsertPrice` below) if the host has no `AGENT_APPROVAL_PORT` bound — the approvals inbox reads
|
|
193
|
+
* that as "render read-only".
|
|
194
|
+
*/
|
|
195
|
+
decideApproval(toolCallId: string, input: ApprovalDecisionInput): Promise<void>;
|
|
196
|
+
/** Per-tool call/failure/rejection/latency rollup for a day range (the Tools section). */
|
|
197
|
+
toolStats(range: GovernanceRange): Promise<ToolStatRow[]>;
|
|
104
198
|
/** Most recent threads (default 50). */
|
|
105
199
|
threads(limit?: number): Promise<ThreadActivityRow[]>;
|
|
106
200
|
/** Current price row per model. 501s if the host has no pricing store bound. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-client.d.ts","sourceRoot":"","sources":["../../src/client/agent-client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent-client.d.ts","sourceRoot":"","sources":["../../src/client/agent-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,10 +24,42 @@ export const agentClient = {
|
|
|
24
24
|
const q = new URLSearchParams({ from: range.fromDay, to: range.toDay, limit: `${limit}` });
|
|
25
25
|
return http(`/top-threads?${q.toString()}`);
|
|
26
26
|
},
|
|
27
|
+
/** Run reliability for a day range: `{ metrics, byAgent, errors, trend }`. */
|
|
28
|
+
reliability(range) {
|
|
29
|
+
const q = new URLSearchParams({ from: range.fromDay, to: range.toDay });
|
|
30
|
+
return http(`/reliability?${q.toString()}`);
|
|
31
|
+
},
|
|
32
|
+
/** Most recent runs (default 50). */
|
|
33
|
+
runs(limit = 50) {
|
|
34
|
+
return http(`/runs?limit=${limit}`);
|
|
35
|
+
},
|
|
27
36
|
/** Most recent tool calls (default 50). */
|
|
28
37
|
toolCalls(limit = 50) {
|
|
29
38
|
return http(`/tool-calls?limit=${limit}`);
|
|
30
39
|
},
|
|
40
|
+
/** Tool calls sitting `pending_approval`, oldest first (default 50) — the approvals inbox. */
|
|
41
|
+
approvals(limit = 50) {
|
|
42
|
+
return http(`/approvals?limit=${limit}`);
|
|
43
|
+
},
|
|
44
|
+
/**
|
|
45
|
+
* Decide a pending HITL tool call. 501s (a plain `Error` whose message starts with `501`, like
|
|
46
|
+
* `upsertPrice` below) if the host has no `AGENT_APPROVAL_PORT` bound — the approvals inbox reads
|
|
47
|
+
* that as "render read-only".
|
|
48
|
+
*/
|
|
49
|
+
async decideApproval(toolCallId, input) {
|
|
50
|
+
const res = await fetch(`${apiBase()}/approvals/${encodeURIComponent(toolCallId)}`, {
|
|
51
|
+
method: 'POST',
|
|
52
|
+
headers: { 'Content-Type': 'application/json' },
|
|
53
|
+
body: JSON.stringify(input),
|
|
54
|
+
});
|
|
55
|
+
if (!res.ok)
|
|
56
|
+
throw new Error(`${res.status} ${res.statusText}`);
|
|
57
|
+
},
|
|
58
|
+
/** Per-tool call/failure/rejection/latency rollup for a day range (the Tools section). */
|
|
59
|
+
toolStats(range) {
|
|
60
|
+
const q = new URLSearchParams({ from: range.fromDay, to: range.toDay });
|
|
61
|
+
return http(`/tools?${q.toString()}`);
|
|
62
|
+
},
|
|
31
63
|
/** Most recent threads (default 50). */
|
|
32
64
|
threads(limit = 50) {
|
|
33
65
|
return http(`/threads?limit=${limit}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-client.js","sourceRoot":"","sources":["../../src/client/agent-client.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,uGAAuG;AACvG,gFAAgF;
|
|
1
|
+
{"version":3,"file":"agent-client.js","sourceRoot":"","sources":["../../src/client/agent-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { RunErrorBreakdownRow } from './agent-client';
|
|
2
|
+
import type { DonutSegment } from './spend-summary';
|
|
3
|
+
/**
|
|
4
|
+
* Build donut segments from an error-code breakdown, reusing the spend donut's `DonutSegment` shape
|
|
5
|
+
* (its `modelId` field carries the `errorCode` here — the `Donut` component only ever treats it as an
|
|
6
|
+
* opaque segment key/label). Sorted by count descending; zero-count rows are dropped.
|
|
7
|
+
*/
|
|
8
|
+
export declare function errorSegments(rows: RunErrorBreakdownRow[]): DonutSegment[];
|
|
9
|
+
//# sourceMappingURL=error-breakdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-breakdown.d.ts","sourceRoot":"","sources":["../../src/client/error-breakdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,oBAAoB,EAAE,GAAG,YAAY,EAAE,CAY1E"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build donut segments from an error-code breakdown, reusing the spend donut's `DonutSegment` shape
|
|
3
|
+
* (its `modelId` field carries the `errorCode` here — the `Donut` component only ever treats it as an
|
|
4
|
+
* opaque segment key/label). Sorted by count descending; zero-count rows are dropped.
|
|
5
|
+
*/
|
|
6
|
+
export function errorSegments(rows) {
|
|
7
|
+
const total = rows.reduce((sum, row) => sum + row.count, 0);
|
|
8
|
+
const sorted = [...rows].sort((a, b) => b.count - a.count);
|
|
9
|
+
const segments = [];
|
|
10
|
+
let offset = 0;
|
|
11
|
+
for (const row of sorted) {
|
|
12
|
+
if (total <= 0 || row.count <= 0)
|
|
13
|
+
continue;
|
|
14
|
+
const fraction = row.count / total;
|
|
15
|
+
segments.push({ modelId: row.errorCode, value: row.count, fraction, offset });
|
|
16
|
+
offset += fraction;
|
|
17
|
+
}
|
|
18
|
+
return segments;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=error-breakdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-breakdown.js","sourceRoot":"","sources":["../../src/client/error-breakdown.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAA4B;IACxD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,IAAI,CAAC;YAAE,SAAS;QAC3C,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;QACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9E,MAAM,IAAI,QAAQ,CAAC;IACrB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -5,4 +5,6 @@ export declare function formatUsd(amount: number): string;
|
|
|
5
5
|
export declare function formatCount(value: number): string;
|
|
6
6
|
/** Format a 0..1 ratio as an integer percent (`0.1234` -> `12%`). */
|
|
7
7
|
export declare function formatPercent(ratio: number): string;
|
|
8
|
+
/** Format a duration in ms (`420ms`, `1.8s`, `2m 5s`); `null`/non-finite reads as `—` (no data). */
|
|
9
|
+
export declare function formatDurationMs(ms: number | null): string;
|
|
8
10
|
//# sourceMappingURL=format-usd.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-usd.d.ts","sourceRoot":"","sources":["../../src/client/format-usd.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAE/E,oGAAoG;AACpG,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOhD;AAED,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOjD;AAED,qEAAqE;AACrE,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGnD"}
|
|
1
|
+
{"version":3,"file":"format-usd.d.ts","sourceRoot":"","sources":["../../src/client/format-usd.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAE/E,oGAAoG;AACpG,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOhD;AAED,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOjD;AAED,qEAAqE;AACrE,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,oGAAoG;AACpG,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAQ1D"}
|
|
@@ -31,4 +31,17 @@ export function formatPercent(ratio) {
|
|
|
31
31
|
return '0%';
|
|
32
32
|
return `${Math.round(ratio * 100)}%`;
|
|
33
33
|
}
|
|
34
|
+
/** Format a duration in ms (`420ms`, `1.8s`, `2m 5s`); `null`/non-finite reads as `—` (no data). */
|
|
35
|
+
export function formatDurationMs(ms) {
|
|
36
|
+
if (ms === null || !Number.isFinite(ms))
|
|
37
|
+
return '—';
|
|
38
|
+
const abs = Math.abs(ms);
|
|
39
|
+
if (abs < 1000)
|
|
40
|
+
return `${Math.round(ms)}ms`;
|
|
41
|
+
if (abs < 60_000)
|
|
42
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
43
|
+
const minutes = Math.floor(abs / 60_000);
|
|
44
|
+
const seconds = Math.round((abs % 60_000) / 1000);
|
|
45
|
+
return `${minutes}m ${seconds}s`;
|
|
46
|
+
}
|
|
34
47
|
//# sourceMappingURL=format-usd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-usd.js","sourceRoot":"","sources":["../../src/client/format-usd.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAE/E,oGAAoG;AACpG,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,OAAO,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,IAAI,GAAG,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACpE,IAAI,GAAG,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5D,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI;QAAE,OAAO,QAAQ,CAAC;IAC3C,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AACjC,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,GAAG,IAAI,aAAa;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1E,IAAI,GAAG,IAAI,SAAS;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAClE,IAAI,GAAG,IAAI,KAAK;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1D,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;AAChC,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC;AACvC,CAAC"}
|
|
1
|
+
{"version":3,"file":"format-usd.js","sourceRoot":"","sources":["../../src/client/format-usd.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAE/E,oGAAoG;AACpG,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,OAAO,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,IAAI,GAAG,IAAI,SAAS;QAAE,OAAO,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACpE,IAAI,GAAG,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5D,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI;QAAE,OAAO,QAAQ,CAAC;IAC3C,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AACjC,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,GAAG,IAAI,aAAa;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1E,IAAI,GAAG,IAAI,SAAS;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAClE,IAAI,GAAG,IAAI,KAAK;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1D,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;AAChC,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC;AACvC,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,gBAAgB,CAAC,EAAiB;IAChD,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAE,OAAO,GAAG,CAAC;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACzB,IAAI,GAAG,GAAG,IAAI;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC;IAC7C,IAAI,GAAG,GAAG,MAAM;QAAE,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACtD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IAClD,OAAO,GAAG,OAAO,KAAK,OAAO,GAAG,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { RunTrendPoint } from './agent-client';
|
|
2
|
+
/** A plotted day, carrying both series' y-coordinates so a chart can draw them overlaid. */
|
|
3
|
+
export interface RunTrendVertex {
|
|
4
|
+
day: string;
|
|
5
|
+
runs: number;
|
|
6
|
+
failed: number;
|
|
7
|
+
x: number;
|
|
8
|
+
runsY: number;
|
|
9
|
+
failedY: number;
|
|
10
|
+
}
|
|
11
|
+
/** Everything an SVG needs to draw the run/failure trend inside `width`x`height`. */
|
|
12
|
+
export interface RunTrendGeometry {
|
|
13
|
+
/** `M..L..` polyline through the `runs` series (empty when there is nothing to plot). */
|
|
14
|
+
runsLine: string;
|
|
15
|
+
/** Closed area path (runs line + baseline) for a filled gradient; empty when nothing to plot. */
|
|
16
|
+
runsArea: string;
|
|
17
|
+
/** `M..L..` polyline through the `failed` series (empty when there is nothing to plot). */
|
|
18
|
+
failedLine: string;
|
|
19
|
+
vertices: RunTrendVertex[];
|
|
20
|
+
/** The shared series max used to normalize the y-axis (never 0 — floored to 1). */
|
|
21
|
+
max: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Project the daily run/failure trend into SVG geometry. Mirrors `buildTrendGeometry`'s x-spread/
|
|
25
|
+
* single-point/empty-series rules, but plots TWO series (`runs`, `failed`) against ONE shared y-axis
|
|
26
|
+
* scale — so the failed line reads as a fraction of the runs line, not its own independent scale.
|
|
27
|
+
* Pure — no DOM.
|
|
28
|
+
*/
|
|
29
|
+
export declare function buildRunTrendGeometry(points: RunTrendPoint[], width: number, height: number): RunTrendGeometry;
|
|
30
|
+
//# sourceMappingURL=run-trend-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-trend-path.d.ts","sourceRoot":"","sources":["../../src/client/run-trend-path.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,4FAA4F;AAC5F,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qFAAqF;AACrF,MAAM,WAAW,gBAAgB;IAC/B,yFAAyF;IACzF,QAAQ,EAAE,MAAM,CAAC;IACjB,iGAAiG;IACjG,QAAQ,EAAE,MAAM,CAAC;IACjB,2FAA2F;IAC3F,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,mFAAmF;IACnF,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,aAAa,EAAE,EACvB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,gBAAgB,CAwClB"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project the daily run/failure trend into SVG geometry. Mirrors `buildTrendGeometry`'s x-spread/
|
|
3
|
+
* single-point/empty-series rules, but plots TWO series (`runs`, `failed`) against ONE shared y-axis
|
|
4
|
+
* scale — so the failed line reads as a fraction of the runs line, not its own independent scale.
|
|
5
|
+
* Pure — no DOM.
|
|
6
|
+
*/
|
|
7
|
+
export function buildRunTrendGeometry(points, width, height) {
|
|
8
|
+
if (points.length === 0) {
|
|
9
|
+
return { runsLine: '', runsArea: '', failedLine: '', vertices: [], max: 1 };
|
|
10
|
+
}
|
|
11
|
+
const max = Math.max(1, ...points.map((point) => point.runs), ...points.map((point) => point.failed));
|
|
12
|
+
const lastIndex = Math.max(1, points.length - 1);
|
|
13
|
+
const vertices = points.map((point, index) => ({
|
|
14
|
+
day: point.day,
|
|
15
|
+
runs: point.runs,
|
|
16
|
+
failed: point.failed,
|
|
17
|
+
x: points.length === 1 ? width / 2 : (index / lastIndex) * width,
|
|
18
|
+
runsY: height - (point.runs / max) * height,
|
|
19
|
+
failedY: height - (point.failed / max) * height,
|
|
20
|
+
}));
|
|
21
|
+
const polyline = (pickY) => vertices
|
|
22
|
+
.map((vertex, index) => `${index === 0 ? 'M' : 'L'}${vertex.x.toFixed(2)},${pickY(vertex).toFixed(2)}`)
|
|
23
|
+
.join(' ');
|
|
24
|
+
const runsLine = polyline((vertex) => vertex.runsY);
|
|
25
|
+
const firstX = vertices[0]?.x ?? 0;
|
|
26
|
+
const lastX = vertices[vertices.length - 1]?.x ?? width;
|
|
27
|
+
const runsArea = `${runsLine} L${lastX.toFixed(2)},${height} L${firstX.toFixed(2)},${height} Z`;
|
|
28
|
+
return {
|
|
29
|
+
runsLine,
|
|
30
|
+
runsArea,
|
|
31
|
+
failedLine: polyline((vertex) => vertex.failedY),
|
|
32
|
+
vertices,
|
|
33
|
+
max,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=run-trend-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-trend-path.js","sourceRoot":"","sources":["../../src/client/run-trend-path.ts"],"names":[],"mappings":"AAyBA;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAuB,EACvB,KAAa,EACb,MAAc;IAEd,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;IAC9E,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAClB,CAAC,EACD,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EACpC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CACvC,CAAC;IACF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAqB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAC/D,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,CAAC,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,KAAK;QAChE,KAAK,EAAE,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,MAAM;QAC3C,OAAO,EAAE,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,MAAM;KAChD,CAAC,CAAC,CAAC;IAEJ,MAAM,QAAQ,GAAG,CAAC,KAAyC,EAAU,EAAE,CACrE,QAAQ;SACL,GAAG,CACF,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAChB,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CACjF;SACA,IAAI,CAAC,GAAG,CAAC,CAAC;IAEf,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC;IACxD,MAAM,QAAQ,GAAG,GAAG,QAAQ,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,MAAM,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC;IAEhG,OAAO;QACL,QAAQ;QACR,QAAQ;QACR,UAAU,EAAE,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;QAChD,QAAQ;QACR,GAAG;KACJ,CAAC;AACJ,CAAC"}
|