@lumenflow/metrics 1.0.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/LICENSE +190 -0
- package/README.md +161 -0
- package/dist/dora/calculate-dora-metrics.d.ts +34 -0
- package/dist/dora/calculate-dora-metrics.d.ts.map +1 -0
- package/dist/dora/calculate-dora-metrics.js +178 -0
- package/dist/dora/calculate-dora-metrics.js.map +1 -0
- package/dist/dora/constants.d.ts +61 -0
- package/dist/dora/constants.d.ts.map +1 -0
- package/dist/dora/constants.js +65 -0
- package/dist/dora/constants.js.map +1 -0
- package/dist/dora/index.d.ts +11 -0
- package/dist/dora/index.d.ts.map +1 -0
- package/dist/dora/index.js +11 -0
- package/dist/dora/index.js.map +1 -0
- package/dist/flow/analyze-bottlenecks.d.ts +51 -0
- package/dist/flow/analyze-bottlenecks.d.ts.map +1 -0
- package/dist/flow/analyze-bottlenecks.js +253 -0
- package/dist/flow/analyze-bottlenecks.js.map +1 -0
- package/dist/flow/calculate-flow-state.d.ts +13 -0
- package/dist/flow/calculate-flow-state.d.ts.map +1 -0
- package/dist/flow/calculate-flow-state.js +27 -0
- package/dist/flow/calculate-flow-state.js.map +1 -0
- package/dist/flow/capture-metrics-snapshot.d.ts +13 -0
- package/dist/flow/capture-metrics-snapshot.d.ts.map +1 -0
- package/dist/flow/capture-metrics-snapshot.js +126 -0
- package/dist/flow/capture-metrics-snapshot.js.map +1 -0
- package/dist/flow/generate-flow-report.d.ts +13 -0
- package/dist/flow/generate-flow-report.d.ts.map +1 -0
- package/dist/flow/generate-flow-report.js +254 -0
- package/dist/flow/generate-flow-report.js.map +1 -0
- package/dist/flow/index.d.ts +12 -0
- package/dist/flow/index.d.ts.map +1 -0
- package/dist/flow/index.js +12 -0
- package/dist/flow/index.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/telemetry/emit-telemetry.d.ts +31 -0
- package/dist/telemetry/emit-telemetry.d.ts.map +1 -0
- package/dist/telemetry/emit-telemetry.js +103 -0
- package/dist/telemetry/emit-telemetry.js.map +1 -0
- package/dist/telemetry/index.d.ts +9 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +9 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/types.d.ts +332 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flow Report Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates DORA/SPACE metrics flow reports from telemetry and WU data.
|
|
5
|
+
*
|
|
6
|
+
* @module @lumenflow/metrics/flow
|
|
7
|
+
*/
|
|
8
|
+
import { quantile } from 'simple-statistics';
|
|
9
|
+
import { STATISTICS } from '../dora/constants.js';
|
|
10
|
+
const PERCENTAGE_PRECISION = 1;
|
|
11
|
+
/**
|
|
12
|
+
* Round to specified decimal places
|
|
13
|
+
*/
|
|
14
|
+
function round(value, precision = PERCENTAGE_PRECISION) {
|
|
15
|
+
return value.toFixed(precision);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Calculate gate pass rate
|
|
19
|
+
*/
|
|
20
|
+
function calculateGatePassRate(events) {
|
|
21
|
+
const total = events.length;
|
|
22
|
+
const passed = events.filter((e) => e.passed).length;
|
|
23
|
+
const failed = total - passed;
|
|
24
|
+
const passRate = total > 0 ? round((passed / total) * STATISTICS.PERCENTAGE_MULTIPLIER) : '0.0';
|
|
25
|
+
return { passRate, total, passed, failed };
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Calculate gate P95 duration
|
|
29
|
+
*/
|
|
30
|
+
function calculateGateP95(events) {
|
|
31
|
+
if (events.length === 0)
|
|
32
|
+
return 0;
|
|
33
|
+
const durations = events.map((e) => e.durationMs).sort((a, b) => a - b);
|
|
34
|
+
return quantile(durations, STATISTICS.P95_PERCENTILE);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Initialize gate statistics for a gate name
|
|
38
|
+
*/
|
|
39
|
+
function initGateStats() {
|
|
40
|
+
return { total: 0, passed: 0, failed: 0, passRate: '0.0' };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Update gate stats with event data
|
|
44
|
+
*/
|
|
45
|
+
function updateGateStats(stats, passed) {
|
|
46
|
+
stats.total++;
|
|
47
|
+
if (passed) {
|
|
48
|
+
stats.passed++;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
stats.failed++;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Calculate pass rate for gate stats
|
|
56
|
+
*/
|
|
57
|
+
function calculatePassRate(stats) {
|
|
58
|
+
if (stats.total > 0) {
|
|
59
|
+
stats.passRate = round((stats.passed / stats.total) * STATISTICS.PERCENTAGE_MULTIPLIER);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Convert Map to plain object (safe conversion avoiding object injection)
|
|
64
|
+
*/
|
|
65
|
+
function mapToObject(map) {
|
|
66
|
+
const result = {};
|
|
67
|
+
for (const [key, value] of map.entries()) {
|
|
68
|
+
Object.defineProperty(result, key, {
|
|
69
|
+
value,
|
|
70
|
+
writable: true,
|
|
71
|
+
enumerable: true,
|
|
72
|
+
configurable: true,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Group gates by name with statistics
|
|
79
|
+
*/
|
|
80
|
+
function groupGatesByName(events) {
|
|
81
|
+
const byNameMap = new Map();
|
|
82
|
+
for (const event of events) {
|
|
83
|
+
const name = event.gateName;
|
|
84
|
+
if (!byNameMap.has(name)) {
|
|
85
|
+
byNameMap.set(name, initGateStats());
|
|
86
|
+
}
|
|
87
|
+
const stats = byNameMap.get(name);
|
|
88
|
+
if (stats) {
|
|
89
|
+
updateGateStats(stats, event.passed);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Calculate pass rates
|
|
93
|
+
for (const stats of byNameMap.values()) {
|
|
94
|
+
calculatePassRate(stats);
|
|
95
|
+
}
|
|
96
|
+
return mapToObject(byNameMap);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Calculate LLM error and fallback rates
|
|
100
|
+
*/
|
|
101
|
+
function calculateLLMRates(completeEvents, errorCount) {
|
|
102
|
+
const total = completeEvents.length + errorCount;
|
|
103
|
+
const errorRate = total > 0 ? round((errorCount / total) * STATISTICS.PERCENTAGE_MULTIPLIER) : '0.0';
|
|
104
|
+
const fallbackCount = completeEvents.filter((e) => e.fallbackUsed).length;
|
|
105
|
+
const fallbackRate = completeEvents.length > 0
|
|
106
|
+
? round((fallbackCount / completeEvents.length) * STATISTICS.PERCENTAGE_MULTIPLIER)
|
|
107
|
+
: '0.0';
|
|
108
|
+
return { errorRate, fallbackRate };
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Calculate LLM latency percentiles
|
|
112
|
+
*/
|
|
113
|
+
function calculateLLMLatencies(completeEvents) {
|
|
114
|
+
const durations = completeEvents
|
|
115
|
+
.map((e) => e.durationMs)
|
|
116
|
+
.filter((d) => d !== undefined)
|
|
117
|
+
.sort((a, b) => a - b);
|
|
118
|
+
if (durations.length === 0) {
|
|
119
|
+
return { avgLatencyMs: 0, p50LatencyMs: 0, p95LatencyMs: 0, p99LatencyMs: 0 };
|
|
120
|
+
}
|
|
121
|
+
const avgLatencyMs = Math.round(durations.reduce((sum, d) => sum + d, 0) / durations.length);
|
|
122
|
+
const p50LatencyMs = quantile(durations, STATISTICS.MEDIAN_PERCENTILE);
|
|
123
|
+
const p95LatencyMs = quantile(durations, STATISTICS.P95_PERCENTILE);
|
|
124
|
+
const p99LatencyMs = quantile(durations, STATISTICS.P99_PERCENTILE);
|
|
125
|
+
return { avgLatencyMs, p50LatencyMs, p95LatencyMs, p99LatencyMs };
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Calculate LLM token and cost totals
|
|
129
|
+
*/
|
|
130
|
+
function calculateLLMCosts(completeEvents) {
|
|
131
|
+
const totalTokens = completeEvents.reduce((sum, e) => sum + (e.tokensUsed ?? 0), 0);
|
|
132
|
+
const totalCostUsd = completeEvents.reduce((sum, e) => sum + (e.estimatedCostUsd ?? 0), 0);
|
|
133
|
+
const confidences = completeEvents
|
|
134
|
+
.map((e) => e.confidence)
|
|
135
|
+
.filter((c) => c !== undefined);
|
|
136
|
+
const avgConfidence = confidences.length > 0
|
|
137
|
+
? (confidences.reduce((sum, c) => sum + c, 0) / confidences.length).toFixed(2)
|
|
138
|
+
: '0.00';
|
|
139
|
+
return { totalTokens, totalCostUsd, avgConfidence };
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Initialize LLM type stats
|
|
143
|
+
*/
|
|
144
|
+
function initLLMTypeStats() {
|
|
145
|
+
return {
|
|
146
|
+
count: 0,
|
|
147
|
+
avgLatencyMs: 0,
|
|
148
|
+
totalCostUsd: 0,
|
|
149
|
+
fallbackRate: '0.0',
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Update LLM type stats with event data
|
|
154
|
+
*/
|
|
155
|
+
function updateLLMTypeStats(stats, event) {
|
|
156
|
+
stats.count++;
|
|
157
|
+
stats.avgLatencyMs += event.durationMs ?? 0;
|
|
158
|
+
stats.totalCostUsd += event.estimatedCostUsd ?? 0;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Calculate averages for LLM type stats
|
|
162
|
+
*/
|
|
163
|
+
function calculateLLMTypeAverages(stats, type, completeEvents) {
|
|
164
|
+
if (stats.count > 0) {
|
|
165
|
+
stats.avgLatencyMs = Math.round(stats.avgLatencyMs / stats.count);
|
|
166
|
+
const typeFallbacks = completeEvents.filter((e) => e.classificationType === type && e.fallbackUsed).length;
|
|
167
|
+
stats.fallbackRate = round((typeFallbacks / stats.count) * STATISTICS.PERCENTAGE_MULTIPLIER);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Group LLM events by classification type
|
|
172
|
+
*/
|
|
173
|
+
function groupLLMByType(completeEvents) {
|
|
174
|
+
const byTypeMap = new Map();
|
|
175
|
+
for (const event of completeEvents) {
|
|
176
|
+
const type = event.classificationType;
|
|
177
|
+
if (!byTypeMap.has(type)) {
|
|
178
|
+
byTypeMap.set(type, initLLMTypeStats());
|
|
179
|
+
}
|
|
180
|
+
const stats = byTypeMap.get(type);
|
|
181
|
+
if (stats) {
|
|
182
|
+
updateLLMTypeStats(stats, event);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Calculate averages and fallback rates
|
|
186
|
+
for (const [type, stats] of byTypeMap.entries()) {
|
|
187
|
+
calculateLLMTypeAverages(stats, type, completeEvents);
|
|
188
|
+
}
|
|
189
|
+
return mapToObject(byTypeMap);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Calculate LLM classification metrics
|
|
193
|
+
*/
|
|
194
|
+
function calculateLLMMetrics(events) {
|
|
195
|
+
const completeEvents = events.filter((e) => e.eventType === 'llm.classification.complete');
|
|
196
|
+
const errorEvents = events.filter((e) => e.eventType === 'llm.classification.error');
|
|
197
|
+
if (completeEvents.length === 0) {
|
|
198
|
+
return {
|
|
199
|
+
totalClassifications: 0,
|
|
200
|
+
errorRate: '0.0',
|
|
201
|
+
fallbackRate: '0.0',
|
|
202
|
+
avgLatencyMs: 0,
|
|
203
|
+
p50LatencyMs: 0,
|
|
204
|
+
p95LatencyMs: 0,
|
|
205
|
+
p99LatencyMs: 0,
|
|
206
|
+
totalTokens: 0,
|
|
207
|
+
totalCostUsd: 0,
|
|
208
|
+
avgConfidence: '0.00',
|
|
209
|
+
byType: {},
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
const { errorRate, fallbackRate } = calculateLLMRates(completeEvents, errorEvents.length);
|
|
213
|
+
const latencies = calculateLLMLatencies(completeEvents);
|
|
214
|
+
const costs = calculateLLMCosts(completeEvents);
|
|
215
|
+
const byType = groupLLMByType(completeEvents);
|
|
216
|
+
return {
|
|
217
|
+
totalClassifications: completeEvents.length,
|
|
218
|
+
errorRate,
|
|
219
|
+
fallbackRate,
|
|
220
|
+
...latencies,
|
|
221
|
+
...costs,
|
|
222
|
+
byType,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Generate flow report from input data
|
|
227
|
+
*/
|
|
228
|
+
export function generateFlowReport(input) {
|
|
229
|
+
const { gateEvents, llmEvents, completedWUs, dateRange } = input;
|
|
230
|
+
const gateStats = calculateGatePassRate(gateEvents);
|
|
231
|
+
const gateP95 = calculateGateP95(gateEvents);
|
|
232
|
+
const byName = groupGatesByName(gateEvents);
|
|
233
|
+
const llmMetrics = calculateLLMMetrics(llmEvents);
|
|
234
|
+
const wuList = completedWUs.map((wu) => ({
|
|
235
|
+
wuId: wu.id,
|
|
236
|
+
completedDate: wu.completedAt?.toISOString().split('T')[0] ?? '',
|
|
237
|
+
lane: wu.lane,
|
|
238
|
+
title: wu.title,
|
|
239
|
+
}));
|
|
240
|
+
return {
|
|
241
|
+
range: dateRange,
|
|
242
|
+
gates: {
|
|
243
|
+
...gateStats,
|
|
244
|
+
p95: gateP95,
|
|
245
|
+
byName,
|
|
246
|
+
},
|
|
247
|
+
wus: {
|
|
248
|
+
completed: completedWUs.length,
|
|
249
|
+
list: wuList,
|
|
250
|
+
},
|
|
251
|
+
llm: llmMetrics,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=generate-flow-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-flow-report.js","sourceRoot":"","sources":["../../src/flow/generate-flow-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flow Metrics Module
|
|
3
|
+
*
|
|
4
|
+
* Flow state calculation, bottleneck analysis, and report generation.
|
|
5
|
+
*
|
|
6
|
+
* @module @lumenflow/metrics/flow
|
|
7
|
+
*/
|
|
8
|
+
export { calculateFlowState } from './calculate-flow-state.js';
|
|
9
|
+
export { analyzeBottlenecks, criticalPath, impactScore, topologicalSort, getBottleneckAnalysis, type DependencyGraph, } from './analyze-bottlenecks.js';
|
|
10
|
+
export { generateFlowReport } from './generate-flow-report.js';
|
|
11
|
+
export { captureMetricsSnapshot } from './capture-metrics-snapshot.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/flow/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,eAAe,EACf,qBAAqB,EACrB,KAAK,eAAe,GACrB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Flow Metrics Module
|
|
3
|
+
*
|
|
4
|
+
* Flow state calculation, bottleneck analysis, and report generation.
|
|
5
|
+
*
|
|
6
|
+
* @module @lumenflow/metrics/flow
|
|
7
|
+
*/
|
|
8
|
+
export { calculateFlowState } from './calculate-flow-state.js';
|
|
9
|
+
export { analyzeBottlenecks, criticalPath, impactScore, topologicalSort, getBottleneckAnalysis, } from './analyze-bottlenecks.js';
|
|
10
|
+
export { generateFlowReport } from './generate-flow-report.js';
|
|
11
|
+
export { captureMetricsSnapshot } from './capture-metrics-snapshot.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/flow/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,eAAe,EACf,qBAAqB,GAEtB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @lumenflow/metrics
|
|
3
|
+
*
|
|
4
|
+
* DORA/SPACE analytics and flow metrics for LumenFlow workflow framework.
|
|
5
|
+
*
|
|
6
|
+
* @module @lumenflow/metrics
|
|
7
|
+
*/
|
|
8
|
+
export declare const METRICS_VERSION = "0.1.0";
|
|
9
|
+
export type { DORAStatusTier, WUMetrics, GitCommit, SkipGatesEntry, DeploymentFrequencyMetrics, LeadTimeMetrics, ChangeFailureRateMetrics, MTTRMetrics, DORAMetrics, LaneHealth, FlowState, GateTelemetryEvent, LLMTelemetryEvent, GateMetricsByName, LLMMetrics, FlowReportData, BottleneckResult, CriticalPathResult, BottleneckAnalysis, DependencyGraphNode, MetricsSnapshotType, MetricsSnapshot, TelemetryEmitFn, GateEventInput, LLMClassificationStartInput, LLMClassificationCompleteInput, LLMClassificationErrorInput, WUFlowEventInput, FlowReportInput, MetricsSnapshotInput, } from './types.js';
|
|
10
|
+
export { calculateDeploymentFrequency, calculateLeadTime, calculateCFR, calculateMTTR, calculateDORAMetrics, identifyEmergencyFixes, DEPLOYMENT_FREQUENCY, LEAD_TIME_HOURS, CFR_PERCENT, MTTR_HOURS, STATISTICS, } from './dora/index.js';
|
|
11
|
+
export { calculateFlowState, analyzeBottlenecks, criticalPath, impactScore, topologicalSort, getBottleneckAnalysis, generateFlowReport, captureMetricsSnapshot, type DependencyGraph, } from './flow/index.js';
|
|
12
|
+
export { createTelemetryEmitter, TELEMETRY_PATHS, type TelemetryEmitter, } from './telemetry/index.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,eAAe,UAAU,CAAC;AAGvC,YAAY,EACV,cAAc,EACd,SAAS,EACT,SAAS,EACT,cAAc,EACd,0BAA0B,EAC1B,eAAe,EACf,wBAAwB,EACxB,WAAW,EACX,WAAW,EACX,UAAU,EACV,SAAS,EACT,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,cAAc,EACd,2BAA2B,EAC3B,8BAA8B,EAC9B,2BAA2B,EAC3B,gBAAgB,EAChB,eAAe,EACf,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,4BAA4B,EAC5B,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,EACf,WAAW,EACX,UAAU,EACV,UAAU,GACX,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,KAAK,eAAe,GACrB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,KAAK,gBAAgB,GACtB,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @lumenflow/metrics
|
|
3
|
+
*
|
|
4
|
+
* DORA/SPACE analytics and flow metrics for LumenFlow workflow framework.
|
|
5
|
+
*
|
|
6
|
+
* @module @lumenflow/metrics
|
|
7
|
+
*/
|
|
8
|
+
export const METRICS_VERSION = '0.1.0';
|
|
9
|
+
// DORA metrics
|
|
10
|
+
export { calculateDeploymentFrequency, calculateLeadTime, calculateCFR, calculateMTTR, calculateDORAMetrics, identifyEmergencyFixes, DEPLOYMENT_FREQUENCY, LEAD_TIME_HOURS, CFR_PERCENT, MTTR_HOURS, STATISTICS, } from './dora/index.js';
|
|
11
|
+
// Flow metrics
|
|
12
|
+
export { calculateFlowState, analyzeBottlenecks, criticalPath, impactScore, topologicalSort, getBottleneckAnalysis, generateFlowReport, captureMetricsSnapshot, } from './flow/index.js';
|
|
13
|
+
// Telemetry
|
|
14
|
+
export { createTelemetryEmitter, TELEMETRY_PATHS, } from './telemetry/index.js';
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC;AAoCvC,eAAe;AACf,OAAO,EACL,4BAA4B,EAC5B,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,EACf,WAAW,EACX,UAAU,EACV,UAAU,GACX,MAAM,iBAAiB,CAAC;AAEzB,eAAe;AACf,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,GAEvB,MAAM,iBAAiB,CAAC;AAEzB,YAAY;AACZ,OAAO,EACL,sBAAsB,EACtB,eAAe,GAEhB,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry Emission Module
|
|
3
|
+
*
|
|
4
|
+
* Emits structured NDJSON telemetry for gates execution, LLM classification,
|
|
5
|
+
* and WU flow metrics.
|
|
6
|
+
*
|
|
7
|
+
* @module @lumenflow/metrics/telemetry
|
|
8
|
+
*/
|
|
9
|
+
import type { TelemetryEmitFn, GateEventInput, LLMClassificationStartInput, LLMClassificationCompleteInput, LLMClassificationErrorInput, WUFlowEventInput } from '../types.js';
|
|
10
|
+
/** Default telemetry paths */
|
|
11
|
+
export declare const TELEMETRY_PATHS: {
|
|
12
|
+
readonly GATES: ".beacon/telemetry/gates.ndjson";
|
|
13
|
+
readonly LLM_CLASSIFICATION: ".beacon/telemetry/llm-classification.ndjson";
|
|
14
|
+
readonly FLOW_LOG: ".beacon/flow.log";
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Telemetry emitter interface
|
|
18
|
+
*/
|
|
19
|
+
export interface TelemetryEmitter {
|
|
20
|
+
emitGateEvent(data: GateEventInput, logPath?: string): void;
|
|
21
|
+
emitLLMClassificationStart(data: LLMClassificationStartInput, logPath?: string): void;
|
|
22
|
+
emitLLMClassificationComplete(data: LLMClassificationCompleteInput, logPath?: string): void;
|
|
23
|
+
emitLLMClassificationError(data: LLMClassificationErrorInput, logPath?: string): void;
|
|
24
|
+
emitWUFlowEvent(data: WUFlowEventInput, logPath?: string): void;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create a telemetry emitter with the given emit function.
|
|
28
|
+
* This allows consumers to provide their own filesystem implementation.
|
|
29
|
+
*/
|
|
30
|
+
export declare function createTelemetryEmitter(emit: TelemetryEmitFn): TelemetryEmitter;
|
|
31
|
+
//# sourceMappingURL=emit-telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-telemetry.d.ts","sourceRoot":"","sources":["../../src/telemetry/emit-telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,2BAA2B,EAC3B,8BAA8B,EAC9B,2BAA2B,EAC3B,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAErB,8BAA8B;AAC9B,eAAO,MAAM,eAAe;;;;CAIlB,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5D,0BAA0B,CAAC,IAAI,EAAE,2BAA2B,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtF,6BAA6B,CAAC,IAAI,EAAE,8BAA8B,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5F,0BAA0B,CAAC,IAAI,EAAE,2BAA2B,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtF,eAAe,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,eAAe,GAAG,gBAAgB,CAqG9E"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry Emission Module
|
|
3
|
+
*
|
|
4
|
+
* Emits structured NDJSON telemetry for gates execution, LLM classification,
|
|
5
|
+
* and WU flow metrics.
|
|
6
|
+
*
|
|
7
|
+
* @module @lumenflow/metrics/telemetry
|
|
8
|
+
*/
|
|
9
|
+
/** Default telemetry paths */
|
|
10
|
+
export const TELEMETRY_PATHS = {
|
|
11
|
+
GATES: '.beacon/telemetry/gates.ndjson',
|
|
12
|
+
LLM_CLASSIFICATION: '.beacon/telemetry/llm-classification.ndjson',
|
|
13
|
+
FLOW_LOG: '.beacon/flow.log',
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Create a telemetry emitter with the given emit function.
|
|
17
|
+
* This allows consumers to provide their own filesystem implementation.
|
|
18
|
+
*/
|
|
19
|
+
export function createTelemetryEmitter(emit) {
|
|
20
|
+
return {
|
|
21
|
+
/**
|
|
22
|
+
* Emit a gates execution event
|
|
23
|
+
*/
|
|
24
|
+
emitGateEvent(data, logPath = TELEMETRY_PATHS.GATES) {
|
|
25
|
+
const event = {
|
|
26
|
+
timestamp: new Date().toISOString(),
|
|
27
|
+
wu_id: data.wuId ?? null,
|
|
28
|
+
lane: data.lane ?? null,
|
|
29
|
+
gate_name: data.gateName,
|
|
30
|
+
passed: data.passed,
|
|
31
|
+
duration_ms: data.durationMs,
|
|
32
|
+
};
|
|
33
|
+
emit(logPath, event);
|
|
34
|
+
},
|
|
35
|
+
/**
|
|
36
|
+
* Emit LLM classification start event
|
|
37
|
+
*/
|
|
38
|
+
emitLLMClassificationStart(data, logPath = TELEMETRY_PATHS.LLM_CLASSIFICATION) {
|
|
39
|
+
const event = {
|
|
40
|
+
timestamp: new Date().toISOString(),
|
|
41
|
+
event_type: 'llm.classification.start',
|
|
42
|
+
classification_type: data.classificationType,
|
|
43
|
+
has_context: data.hasContext ?? false,
|
|
44
|
+
wu_id: data.wuId ?? null,
|
|
45
|
+
lane: data.lane ?? null,
|
|
46
|
+
};
|
|
47
|
+
emit(logPath, event);
|
|
48
|
+
},
|
|
49
|
+
/**
|
|
50
|
+
* Emit LLM classification complete event
|
|
51
|
+
*/
|
|
52
|
+
emitLLMClassificationComplete(data, logPath = TELEMETRY_PATHS.LLM_CLASSIFICATION) {
|
|
53
|
+
const event = {
|
|
54
|
+
timestamp: new Date().toISOString(),
|
|
55
|
+
event_type: 'llm.classification.complete',
|
|
56
|
+
classification_type: data.classificationType,
|
|
57
|
+
duration_ms: data.durationMs,
|
|
58
|
+
tokens_used: data.tokensUsed,
|
|
59
|
+
estimated_cost_usd: data.estimatedCostUsd,
|
|
60
|
+
confidence: data.confidence,
|
|
61
|
+
fallback_used: data.fallbackUsed,
|
|
62
|
+
wu_id: data.wuId ?? null,
|
|
63
|
+
lane: data.lane ?? null,
|
|
64
|
+
};
|
|
65
|
+
if (data.fallbackUsed && data.fallbackReason) {
|
|
66
|
+
event['fallback_reason'] = data.fallbackReason;
|
|
67
|
+
}
|
|
68
|
+
emit(logPath, event);
|
|
69
|
+
},
|
|
70
|
+
/**
|
|
71
|
+
* Emit LLM classification error event
|
|
72
|
+
*/
|
|
73
|
+
emitLLMClassificationError(data, logPath = TELEMETRY_PATHS.LLM_CLASSIFICATION) {
|
|
74
|
+
const event = {
|
|
75
|
+
timestamp: new Date().toISOString(),
|
|
76
|
+
event_type: 'llm.classification.error',
|
|
77
|
+
classification_type: data.classificationType,
|
|
78
|
+
error_type: data.errorType,
|
|
79
|
+
error_message: data.errorMessage,
|
|
80
|
+
wu_id: data.wuId ?? null,
|
|
81
|
+
lane: data.lane ?? null,
|
|
82
|
+
};
|
|
83
|
+
if (data.durationMs !== undefined) {
|
|
84
|
+
event['duration_ms'] = data.durationMs;
|
|
85
|
+
}
|
|
86
|
+
if (data.inputTextPreview) {
|
|
87
|
+
event['input_text_preview'] = '[REDACTED]';
|
|
88
|
+
}
|
|
89
|
+
emit(logPath, event);
|
|
90
|
+
},
|
|
91
|
+
/**
|
|
92
|
+
* Emit WU flow telemetry event
|
|
93
|
+
*/
|
|
94
|
+
emitWUFlowEvent(data, logPath = TELEMETRY_PATHS.FLOW_LOG) {
|
|
95
|
+
const event = {
|
|
96
|
+
timestamp: new Date().toISOString(),
|
|
97
|
+
...data,
|
|
98
|
+
};
|
|
99
|
+
emit(logPath, event);
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=emit-telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-telemetry.js","sourceRoot":"","sources":["../../src/telemetry/emit-telemetry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry Module
|
|
3
|
+
*
|
|
4
|
+
* Structured telemetry emission for gates, LLM classification, and WU flow events.
|
|
5
|
+
*
|
|
6
|
+
* @module @lumenflow/metrics/telemetry
|
|
7
|
+
*/
|
|
8
|
+
export { createTelemetryEmitter, TELEMETRY_PATHS, type TelemetryEmitter, } from './emit-telemetry.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,KAAK,gBAAgB,GACtB,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry Module
|
|
3
|
+
*
|
|
4
|
+
* Structured telemetry emission for gates, LLM classification, and WU flow events.
|
|
5
|
+
*
|
|
6
|
+
* @module @lumenflow/metrics/telemetry
|
|
7
|
+
*/
|
|
8
|
+
export { createTelemetryEmitter, TELEMETRY_PATHS, } from './emit-telemetry.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,sBAAsB,EACtB,eAAe,GAEhB,MAAM,qBAAqB,CAAC"}
|