network-ai 4.15.2 → 5.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/INTEGRATION_GUIDE.md +11 -4
- package/QUICKSTART.md +31 -4
- package/README.md +37 -15
- package/bin/dashboard.ts +146 -0
- package/bin/mcp-server.ts +3 -2
- package/dist/adapters/adapter-registry.d.ts +33 -1
- package/dist/adapters/adapter-registry.d.ts.map +1 -1
- package/dist/adapters/adapter-registry.js +49 -0
- package/dist/adapters/adapter-registry.js.map +1 -1
- package/dist/adapters/anthropic-computer-use-adapter.d.ts +132 -0
- package/dist/adapters/anthropic-computer-use-adapter.d.ts.map +1 -0
- package/dist/adapters/anthropic-computer-use-adapter.js +180 -0
- package/dist/adapters/anthropic-computer-use-adapter.js.map +1 -0
- package/dist/adapters/browser-agent-adapter.d.ts +121 -0
- package/dist/adapters/browser-agent-adapter.d.ts.map +1 -0
- package/dist/adapters/browser-agent-adapter.js +219 -0
- package/dist/adapters/browser-agent-adapter.js.map +1 -0
- package/dist/adapters/copilot-adapter.d.ts +59 -0
- package/dist/adapters/copilot-adapter.d.ts.map +1 -0
- package/dist/adapters/copilot-adapter.js +132 -0
- package/dist/adapters/copilot-adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +15 -1
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +22 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/langgraph-adapter.d.ts +70 -0
- package/dist/adapters/langgraph-adapter.d.ts.map +1 -0
- package/dist/adapters/langgraph-adapter.js +119 -0
- package/dist/adapters/langgraph-adapter.js.map +1 -0
- package/dist/adapters/openai-agents-adapter.d.ts +100 -0
- package/dist/adapters/openai-agents-adapter.d.ts.map +1 -0
- package/dist/adapters/openai-agents-adapter.js +118 -0
- package/dist/adapters/openai-agents-adapter.js.map +1 -0
- package/dist/adapters/pydantic-ai-adapter.d.ts +104 -0
- package/dist/adapters/pydantic-ai-adapter.d.ts.map +1 -0
- package/dist/adapters/pydantic-ai-adapter.js +163 -0
- package/dist/adapters/pydantic-ai-adapter.js.map +1 -0
- package/dist/adapters/vertex-ai-adapter.d.ts +122 -0
- package/dist/adapters/vertex-ai-adapter.d.ts.map +1 -0
- package/dist/adapters/vertex-ai-adapter.js +166 -0
- package/dist/adapters/vertex-ai-adapter.js.map +1 -0
- package/dist/bin/dashboard.d.ts +11 -0
- package/dist/bin/dashboard.d.ts.map +1 -0
- package/dist/bin/dashboard.js +135 -0
- package/dist/bin/dashboard.js.map +1 -0
- package/dist/bin/mcp-server.js +3 -2
- package/dist/bin/mcp-server.js.map +1 -1
- package/dist/index.d.ts +103 -559
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +295 -1074
- package/dist/index.js.map +1 -1
- package/dist/lib/adapter-test-harness.d.ts +88 -0
- package/dist/lib/adapter-test-harness.d.ts.map +1 -0
- package/dist/lib/adapter-test-harness.js +118 -0
- package/dist/lib/adapter-test-harness.js.map +1 -0
- package/dist/lib/agent-conversation.d.ts +115 -0
- package/dist/lib/agent-conversation.d.ts.map +1 -0
- package/dist/lib/agent-conversation.js +155 -0
- package/dist/lib/agent-conversation.js.map +1 -0
- package/dist/lib/agent-debate.d.ts +115 -0
- package/dist/lib/agent-debate.d.ts.map +1 -0
- package/dist/lib/agent-debate.js +146 -0
- package/dist/lib/agent-debate.js.map +1 -0
- package/dist/lib/agent-memory.d.ts +157 -0
- package/dist/lib/agent-memory.d.ts.map +1 -0
- package/dist/lib/agent-memory.js +336 -0
- package/dist/lib/agent-memory.js.map +1 -0
- package/dist/lib/agent-vcr.d.ts +133 -0
- package/dist/lib/agent-vcr.d.ts.map +1 -0
- package/dist/lib/agent-vcr.js +218 -0
- package/dist/lib/agent-vcr.js.map +1 -0
- package/dist/lib/anomaly-detector.d.ts +112 -0
- package/dist/lib/anomaly-detector.d.ts.map +1 -0
- package/dist/lib/anomaly-detector.js +178 -0
- package/dist/lib/anomaly-detector.js.map +1 -0
- package/dist/lib/approval-inbox.d.ts +147 -0
- package/dist/lib/approval-inbox.d.ts.map +1 -0
- package/dist/lib/approval-inbox.js +385 -0
- package/dist/lib/approval-inbox.js.map +1 -0
- package/dist/lib/auth-guardian.d.ts +170 -0
- package/dist/lib/auth-guardian.d.ts.map +1 -0
- package/dist/lib/auth-guardian.js +604 -0
- package/dist/lib/auth-guardian.js.map +1 -0
- package/dist/lib/auth-validator.d.ts +70 -0
- package/dist/lib/auth-validator.d.ts.map +1 -0
- package/dist/lib/auth-validator.js +32 -0
- package/dist/lib/auth-validator.js.map +1 -0
- package/dist/lib/blackboard-validator.d.ts +56 -0
- package/dist/lib/blackboard-validator.d.ts.map +1 -1
- package/dist/lib/blackboard-validator.js +181 -4
- package/dist/lib/blackboard-validator.js.map +1 -1
- package/dist/lib/comparison-runner.d.ts +99 -0
- package/dist/lib/comparison-runner.d.ts.map +1 -0
- package/dist/lib/comparison-runner.js +138 -0
- package/dist/lib/comparison-runner.js.map +1 -0
- package/dist/lib/config-watcher.d.ts +109 -0
- package/dist/lib/config-watcher.d.ts.map +1 -0
- package/dist/lib/config-watcher.js +215 -0
- package/dist/lib/config-watcher.js.map +1 -0
- package/dist/lib/cost-governor.d.ts +105 -0
- package/dist/lib/cost-governor.d.ts.map +1 -0
- package/dist/lib/cost-governor.js +128 -0
- package/dist/lib/cost-governor.js.map +1 -0
- package/dist/lib/cost-heatmap.d.ts +104 -0
- package/dist/lib/cost-heatmap.d.ts.map +1 -0
- package/dist/lib/cost-heatmap.js +161 -0
- package/dist/lib/cost-heatmap.js.map +1 -0
- package/dist/lib/coverage-reporter.d.ts +92 -0
- package/dist/lib/coverage-reporter.d.ts.map +1 -0
- package/dist/lib/coverage-reporter.js +177 -0
- package/dist/lib/coverage-reporter.js.map +1 -0
- package/dist/lib/dashboard-server.d.ts +71 -0
- package/dist/lib/dashboard-server.d.ts.map +1 -0
- package/dist/lib/dashboard-server.js +403 -0
- package/dist/lib/dashboard-server.js.map +1 -0
- package/dist/lib/dry-run.d.ts +73 -0
- package/dist/lib/dry-run.d.ts.map +1 -0
- package/dist/lib/dry-run.js +130 -0
- package/dist/lib/dry-run.js.map +1 -0
- package/dist/lib/errors.d.ts +15 -0
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +38 -0
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/event-bus.d.ts +167 -0
- package/dist/lib/event-bus.d.ts.map +1 -0
- package/dist/lib/event-bus.js +229 -0
- package/dist/lib/event-bus.js.map +1 -0
- package/dist/lib/explainability.d.ts +85 -0
- package/dist/lib/explainability.d.ts.map +1 -0
- package/dist/lib/explainability.js +102 -0
- package/dist/lib/explainability.js.map +1 -0
- package/dist/lib/goal-dsl.d.ts +157 -0
- package/dist/lib/goal-dsl.d.ts.map +1 -0
- package/dist/lib/goal-dsl.js +392 -0
- package/dist/lib/goal-dsl.js.map +1 -0
- package/dist/lib/job-queue.d.ts +183 -0
- package/dist/lib/job-queue.d.ts.map +1 -0
- package/dist/lib/job-queue.js +310 -0
- package/dist/lib/job-queue.js.map +1 -0
- package/dist/lib/learning-loop.d.ts +113 -0
- package/dist/lib/learning-loop.d.ts.map +1 -0
- package/dist/lib/learning-loop.js +181 -0
- package/dist/lib/learning-loop.js.map +1 -0
- package/dist/lib/lifecycle-hooks.d.ts +116 -0
- package/dist/lib/lifecycle-hooks.d.ts.map +1 -0
- package/dist/lib/lifecycle-hooks.js +148 -0
- package/dist/lib/lifecycle-hooks.js.map +1 -0
- package/dist/lib/locked-blackboard.d.ts.map +1 -1
- package/dist/lib/locked-blackboard.js +9 -5
- package/dist/lib/locked-blackboard.js.map +1 -1
- package/dist/lib/mcp-tool-consumer.d.ts +153 -0
- package/dist/lib/mcp-tool-consumer.d.ts.map +1 -0
- package/dist/lib/mcp-tool-consumer.js +320 -0
- package/dist/lib/mcp-tool-consumer.js.map +1 -0
- package/dist/lib/metrics.d.ts +119 -0
- package/dist/lib/metrics.d.ts.map +1 -0
- package/dist/lib/metrics.js +284 -0
- package/dist/lib/metrics.js.map +1 -0
- package/dist/lib/orchestrator-types.d.ts +309 -0
- package/dist/lib/orchestrator-types.d.ts.map +1 -0
- package/dist/lib/orchestrator-types.js +61 -0
- package/dist/lib/orchestrator-types.js.map +1 -0
- package/dist/lib/otel-bridge.d.ts +74 -0
- package/dist/lib/otel-bridge.d.ts.map +1 -0
- package/dist/lib/otel-bridge.js +167 -0
- package/dist/lib/otel-bridge.js.map +1 -0
- package/dist/lib/playground.d.ts +76 -0
- package/dist/lib/playground.d.ts.map +1 -0
- package/dist/lib/playground.js +224 -0
- package/dist/lib/playground.js.map +1 -0
- package/dist/lib/quadtree.d.ts +114 -0
- package/dist/lib/quadtree.d.ts.map +1 -0
- package/dist/lib/quadtree.js +259 -0
- package/dist/lib/quadtree.js.map +1 -0
- package/dist/lib/shared-blackboard.d.ts +101 -0
- package/dist/lib/shared-blackboard.d.ts.map +1 -0
- package/dist/lib/shared-blackboard.js +249 -0
- package/dist/lib/shared-blackboard.js.map +1 -0
- package/dist/lib/speculative-executor.d.ts +89 -0
- package/dist/lib/speculative-executor.d.ts.map +1 -0
- package/dist/lib/speculative-executor.js +107 -0
- package/dist/lib/speculative-executor.js.map +1 -0
- package/dist/lib/swarm-transport.d.ts +150 -0
- package/dist/lib/swarm-transport.d.ts.map +1 -0
- package/dist/lib/swarm-transport.js +307 -0
- package/dist/lib/swarm-transport.js.map +1 -0
- package/dist/lib/task-decomposer.d.ts +41 -0
- package/dist/lib/task-decomposer.d.ts.map +1 -0
- package/dist/lib/task-decomposer.js +272 -0
- package/dist/lib/task-decomposer.js.map +1 -0
- package/dist/lib/timeline-scrubber.d.ts +84 -0
- package/dist/lib/timeline-scrubber.d.ts.map +1 -0
- package/dist/lib/timeline-scrubber.js +173 -0
- package/dist/lib/timeline-scrubber.js.map +1 -0
- package/dist/lib/topology.d.ts +361 -0
- package/dist/lib/topology.d.ts.map +1 -0
- package/dist/lib/topology.js +591 -0
- package/dist/lib/topology.js.map +1 -0
- package/dist/security.d.ts +95 -0
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +267 -5
- package/dist/security.js.map +1 -1
- package/package.json +7 -5
- package/types/agent-adapter.d.ts +5 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CostGovernor — Pre-flight budget prediction for task DAGs.
|
|
4
|
+
*
|
|
5
|
+
* Walks a TaskDAG, estimates per-node token spend using a pluggable cost
|
|
6
|
+
* model, and checks the total against FederatedBudget before execution.
|
|
7
|
+
*
|
|
8
|
+
* @module CostGovernor
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.CostGovernor = exports.LookupCostModel = void 0;
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// DEFAULT COST MODEL
|
|
14
|
+
// ============================================================================
|
|
15
|
+
/**
|
|
16
|
+
* Lookup-based cost model. Register per-agent or per-action token estimates.
|
|
17
|
+
* Falls back to a configurable default.
|
|
18
|
+
*/
|
|
19
|
+
class LookupCostModel {
|
|
20
|
+
agentDefaults = new Map();
|
|
21
|
+
actionOverrides = new Map();
|
|
22
|
+
defaultTokens;
|
|
23
|
+
constructor(defaultTokens = 500) {
|
|
24
|
+
this.defaultTokens = defaultTokens;
|
|
25
|
+
}
|
|
26
|
+
/** Set default token estimate for an agent */
|
|
27
|
+
setAgentDefault(agent, tokens) {
|
|
28
|
+
this.agentDefaults.set(agent, tokens);
|
|
29
|
+
}
|
|
30
|
+
/** Set token estimate for a specific agent:action pair */
|
|
31
|
+
setActionEstimate(agent, action, tokens) {
|
|
32
|
+
this.actionOverrides.set(`${agent}:${action}`, tokens);
|
|
33
|
+
}
|
|
34
|
+
estimate(agent, action, _params) {
|
|
35
|
+
const key = `${agent}:${action}`;
|
|
36
|
+
if (this.actionOverrides.has(key)) {
|
|
37
|
+
return { tokens: this.actionOverrides.get(key), confidence: 0.8 };
|
|
38
|
+
}
|
|
39
|
+
if (this.agentDefaults.has(agent)) {
|
|
40
|
+
return { tokens: this.agentDefaults.get(agent), confidence: 0.6 };
|
|
41
|
+
}
|
|
42
|
+
return { tokens: this.defaultTokens, confidence: 0.3 };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.LookupCostModel = LookupCostModel;
|
|
46
|
+
// ============================================================================
|
|
47
|
+
// COST GOVERNOR
|
|
48
|
+
// ============================================================================
|
|
49
|
+
/**
|
|
50
|
+
* Pre-flight budget check for task DAGs.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```ts
|
|
54
|
+
* const governor = new CostGovernor(budget, new LookupCostModel(1000));
|
|
55
|
+
* const prediction = governor.predict(dag.nodes);
|
|
56
|
+
* if (!prediction.withinBudget) {
|
|
57
|
+
* console.log('DAG would exceed budget by', -prediction.budgetRemaining, 'tokens');
|
|
58
|
+
* }
|
|
59
|
+
*
|
|
60
|
+
* // As approval callback:
|
|
61
|
+
* const options = { approvalCallback: (dag) => governor.approve(dag.nodes) };
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
class CostGovernor {
|
|
65
|
+
budget;
|
|
66
|
+
model;
|
|
67
|
+
constructor(budget, model) {
|
|
68
|
+
this.budget = budget;
|
|
69
|
+
this.model = model ?? new LookupCostModel();
|
|
70
|
+
}
|
|
71
|
+
/** Replace the cost model */
|
|
72
|
+
setCostModel(model) {
|
|
73
|
+
this.model = model;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Predict the total cost of a DAG and check against budget.
|
|
77
|
+
*/
|
|
78
|
+
predict(nodes) {
|
|
79
|
+
const estimates = [];
|
|
80
|
+
const perAgent = {};
|
|
81
|
+
for (const node of nodes) {
|
|
82
|
+
const { tokens, confidence } = this.model.estimate(node.agent, node.action, node.params);
|
|
83
|
+
estimates.push({
|
|
84
|
+
taskId: node.id,
|
|
85
|
+
agent: node.agent,
|
|
86
|
+
action: node.action,
|
|
87
|
+
estimatedTokens: tokens,
|
|
88
|
+
confidence,
|
|
89
|
+
});
|
|
90
|
+
perAgent[node.agent] = (perAgent[node.agent] ?? 0) + tokens;
|
|
91
|
+
}
|
|
92
|
+
const totalTokens = estimates.reduce((sum, e) => sum + e.estimatedTokens, 0);
|
|
93
|
+
const budgetRemaining = this.budget.remaining() - totalTokens;
|
|
94
|
+
const budgetCeiling = this.budget.getCeiling();
|
|
95
|
+
const perAgentCeiling = this.budget.getPerAgentCeiling();
|
|
96
|
+
// Check per-agent overruns
|
|
97
|
+
const overBudgetAgents = [];
|
|
98
|
+
if (perAgentCeiling !== undefined) {
|
|
99
|
+
for (const [agent, predicted] of Object.entries(perAgent)) {
|
|
100
|
+
const alreadySpent = this.budget.getAgentSpent(agent);
|
|
101
|
+
if (alreadySpent + predicted > perAgentCeiling) {
|
|
102
|
+
overBudgetAgents.push(agent);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const avgConfidence = estimates.length > 0
|
|
107
|
+
? estimates.reduce((s, e) => s + e.confidence, 0) / estimates.length
|
|
108
|
+
: 0;
|
|
109
|
+
return {
|
|
110
|
+
totalTokens,
|
|
111
|
+
nodes: estimates,
|
|
112
|
+
withinBudget: budgetRemaining >= 0 && overBudgetAgents.length === 0,
|
|
113
|
+
budgetRemaining,
|
|
114
|
+
budgetCeiling,
|
|
115
|
+
perAgent,
|
|
116
|
+
overBudgetAgents,
|
|
117
|
+
averageConfidence: avgConfidence,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Approval callback for TeamRunner — returns true if DAG fits budget.
|
|
122
|
+
*/
|
|
123
|
+
async approve(nodes) {
|
|
124
|
+
return this.predict(nodes).withinBudget;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
exports.CostGovernor = CostGovernor;
|
|
128
|
+
//# sourceMappingURL=cost-governor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-governor.js","sourceRoot":"","sources":["../../lib/cost-governor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CostHeatmap — Per-agent cost & performance overlay for the topology graph.
|
|
3
|
+
*
|
|
4
|
+
* Tracks token spend (with configurable USD-per-token rates), latency
|
|
5
|
+
* percentiles, throughput, and error rates per agent so the dashboard can
|
|
6
|
+
* render a cost/performance heatmap on top of the topology view.
|
|
7
|
+
*
|
|
8
|
+
* @module CostHeatmap
|
|
9
|
+
*/
|
|
10
|
+
/** Per-model cost rates (USD per 1K tokens) */
|
|
11
|
+
export interface CostRate {
|
|
12
|
+
inputPer1k: number;
|
|
13
|
+
outputPer1k: number;
|
|
14
|
+
}
|
|
15
|
+
/** Recorded data point for one agent execution */
|
|
16
|
+
export interface ExecutionSample {
|
|
17
|
+
timestamp: number;
|
|
18
|
+
durationMs: number;
|
|
19
|
+
inputTokens: number;
|
|
20
|
+
outputTokens: number;
|
|
21
|
+
success: boolean;
|
|
22
|
+
}
|
|
23
|
+
/** Heatmap cell for a single agent */
|
|
24
|
+
export interface HeatmapCell {
|
|
25
|
+
agentId: string;
|
|
26
|
+
/** Total estimated cost in USD */
|
|
27
|
+
costUsd: number;
|
|
28
|
+
/** Total tokens consumed (input + output) */
|
|
29
|
+
totalTokens: number;
|
|
30
|
+
/** Number of executions */
|
|
31
|
+
executions: number;
|
|
32
|
+
/** Error count */
|
|
33
|
+
errors: number;
|
|
34
|
+
/** Error rate (0-1) */
|
|
35
|
+
errorRate: number;
|
|
36
|
+
/** Average latency in ms */
|
|
37
|
+
avgLatencyMs: number;
|
|
38
|
+
/** p50 latency ms */
|
|
39
|
+
p50LatencyMs: number;
|
|
40
|
+
/** p95 latency ms */
|
|
41
|
+
p95LatencyMs: number;
|
|
42
|
+
/** p99 latency ms */
|
|
43
|
+
p99LatencyMs: number;
|
|
44
|
+
/** Throughput: executions per minute (over the window) */
|
|
45
|
+
throughputPerMin: number;
|
|
46
|
+
/** Normalized heat value 0-1 (higher = more expensive/slow) */
|
|
47
|
+
heat: number;
|
|
48
|
+
}
|
|
49
|
+
/** Full heatmap snapshot */
|
|
50
|
+
export interface HeatmapSnapshot {
|
|
51
|
+
timestamp: string;
|
|
52
|
+
cells: HeatmapCell[];
|
|
53
|
+
totalCostUsd: number;
|
|
54
|
+
totalTokens: number;
|
|
55
|
+
hottestAgent: string | null;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Tracks per-agent cost and performance for heatmap rendering.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```ts
|
|
62
|
+
* const heatmap = new CostHeatmap();
|
|
63
|
+
* heatmap.setCostRate('gpt-4', { inputPer1k: 0.03, outputPer1k: 0.06 });
|
|
64
|
+
* heatmap.record('agent-1', { durationMs: 200, inputTokens: 500, outputTokens: 100, success: true });
|
|
65
|
+
* const snap = heatmap.getSnapshot();
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
export declare class CostHeatmap {
|
|
69
|
+
private samples;
|
|
70
|
+
private costRates;
|
|
71
|
+
private agentModels;
|
|
72
|
+
private defaultRate;
|
|
73
|
+
private maxSamplesPerAgent;
|
|
74
|
+
private windowMs;
|
|
75
|
+
constructor(options?: {
|
|
76
|
+
/** Max samples to keep per agent. Default 1000 */
|
|
77
|
+
maxSamplesPerAgent?: number;
|
|
78
|
+
/** Time window for throughput calculation (ms). Default 60_000 (1 min) */
|
|
79
|
+
windowMs?: number;
|
|
80
|
+
/** Default cost rate if no model-specific rate set */
|
|
81
|
+
defaultRate?: CostRate;
|
|
82
|
+
});
|
|
83
|
+
/** Set the cost rate for a model */
|
|
84
|
+
setCostRate(model: string, rate: CostRate): void;
|
|
85
|
+
/** Associate an agent with a model (for cost lookups) */
|
|
86
|
+
setAgentModel(agentId: string, model: string): void;
|
|
87
|
+
/** Record an execution sample for an agent */
|
|
88
|
+
record(agentId: string, sample: Omit<ExecutionSample, 'timestamp'> & {
|
|
89
|
+
timestamp?: number;
|
|
90
|
+
}): void;
|
|
91
|
+
/** Get the heatmap cell for a single agent */
|
|
92
|
+
getCell(agentId: string): HeatmapCell | null;
|
|
93
|
+
/** Get the full heatmap snapshot */
|
|
94
|
+
getSnapshot(): HeatmapSnapshot;
|
|
95
|
+
/** List all tracked agent IDs */
|
|
96
|
+
listAgents(): string[];
|
|
97
|
+
/** Clear all data */
|
|
98
|
+
clear(): void;
|
|
99
|
+
/** Clear data for a specific agent */
|
|
100
|
+
clearAgent(agentId: string): void;
|
|
101
|
+
private computeCell;
|
|
102
|
+
private percentile;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=cost-heatmap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-heatmap.d.ts","sourceRoot":"","sources":["../../lib/cost-heatmap.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,+CAA+C;AAC/C,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,kDAAkD;AAClD,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,sCAAsC;AACtC,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,gBAAgB,EAAE,MAAM,CAAC;IACzB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,4BAA4B;AAC5B,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAMD;;;;;;;;;;GAUG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA6C;IAC5D,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,WAAW,CAAkC;IACrD,OAAO,CAAC,WAAW,CAAqD;IACxE,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,CAAC,EAAE;QACpB,kDAAkD;QAClD,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,0EAA0E;QAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,sDAAsD;QACtD,WAAW,CAAC,EAAE,QAAQ,CAAC;KACxB;IAMD,oCAAoC;IACpC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI;IAIhD,yDAAyD;IACzD,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAInD,8CAA8C;IAC9C,MAAM,CACJ,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,GAAG;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAClE,IAAI;IAqBP,8CAA8C;IAC9C,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAM5C,oCAAoC;IACpC,WAAW,IAAI,eAAe;IAgC9B,iCAAiC;IACjC,UAAU,IAAI,MAAM,EAAE;IAItB,qBAAqB;IACrB,KAAK,IAAI,IAAI;IAIb,sCAAsC;IACtC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIjC,OAAO,CAAC,WAAW;IAyCnB,OAAO,CAAC,UAAU;CAKnB"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CostHeatmap — Per-agent cost & performance overlay for the topology graph.
|
|
4
|
+
*
|
|
5
|
+
* Tracks token spend (with configurable USD-per-token rates), latency
|
|
6
|
+
* percentiles, throughput, and error rates per agent so the dashboard can
|
|
7
|
+
* render a cost/performance heatmap on top of the topology view.
|
|
8
|
+
*
|
|
9
|
+
* @module CostHeatmap
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.CostHeatmap = void 0;
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// HEATMAP
|
|
15
|
+
// ============================================================================
|
|
16
|
+
/**
|
|
17
|
+
* Tracks per-agent cost and performance for heatmap rendering.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* const heatmap = new CostHeatmap();
|
|
22
|
+
* heatmap.setCostRate('gpt-4', { inputPer1k: 0.03, outputPer1k: 0.06 });
|
|
23
|
+
* heatmap.record('agent-1', { durationMs: 200, inputTokens: 500, outputTokens: 100, success: true });
|
|
24
|
+
* const snap = heatmap.getSnapshot();
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
class CostHeatmap {
|
|
28
|
+
samples = new Map();
|
|
29
|
+
costRates = new Map();
|
|
30
|
+
agentModels = new Map();
|
|
31
|
+
defaultRate = { inputPer1k: 0.01, outputPer1k: 0.03 };
|
|
32
|
+
maxSamplesPerAgent;
|
|
33
|
+
windowMs;
|
|
34
|
+
constructor(options) {
|
|
35
|
+
this.maxSamplesPerAgent = options?.maxSamplesPerAgent ?? 1000;
|
|
36
|
+
this.windowMs = options?.windowMs ?? 60_000;
|
|
37
|
+
if (options?.defaultRate)
|
|
38
|
+
this.defaultRate = options.defaultRate;
|
|
39
|
+
}
|
|
40
|
+
/** Set the cost rate for a model */
|
|
41
|
+
setCostRate(model, rate) {
|
|
42
|
+
this.costRates.set(model, rate);
|
|
43
|
+
}
|
|
44
|
+
/** Associate an agent with a model (for cost lookups) */
|
|
45
|
+
setAgentModel(agentId, model) {
|
|
46
|
+
this.agentModels.set(agentId, model);
|
|
47
|
+
}
|
|
48
|
+
/** Record an execution sample for an agent */
|
|
49
|
+
record(agentId, sample) {
|
|
50
|
+
let list = this.samples.get(agentId);
|
|
51
|
+
if (!list) {
|
|
52
|
+
list = [];
|
|
53
|
+
this.samples.set(agentId, list);
|
|
54
|
+
}
|
|
55
|
+
list.push({
|
|
56
|
+
timestamp: sample.timestamp ?? Date.now(),
|
|
57
|
+
durationMs: sample.durationMs,
|
|
58
|
+
inputTokens: sample.inputTokens,
|
|
59
|
+
outputTokens: sample.outputTokens,
|
|
60
|
+
success: sample.success,
|
|
61
|
+
});
|
|
62
|
+
// Evict oldest
|
|
63
|
+
if (list.length > this.maxSamplesPerAgent) {
|
|
64
|
+
list.splice(0, list.length - this.maxSamplesPerAgent);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/** Get the heatmap cell for a single agent */
|
|
68
|
+
getCell(agentId) {
|
|
69
|
+
const list = this.samples.get(agentId);
|
|
70
|
+
if (!list || list.length === 0)
|
|
71
|
+
return null;
|
|
72
|
+
return this.computeCell(agentId, list);
|
|
73
|
+
}
|
|
74
|
+
/** Get the full heatmap snapshot */
|
|
75
|
+
getSnapshot() {
|
|
76
|
+
const cells = [];
|
|
77
|
+
let totalCostUsd = 0;
|
|
78
|
+
let totalTokens = 0;
|
|
79
|
+
for (const [agentId, list] of this.samples) {
|
|
80
|
+
if (list.length === 0)
|
|
81
|
+
continue;
|
|
82
|
+
const cell = this.computeCell(agentId, list);
|
|
83
|
+
cells.push(cell);
|
|
84
|
+
totalCostUsd += cell.costUsd;
|
|
85
|
+
totalTokens += cell.totalTokens;
|
|
86
|
+
}
|
|
87
|
+
// Normalize heat values (relative to max cost in this snapshot)
|
|
88
|
+
const maxCost = Math.max(...cells.map(c => c.costUsd), 0.001);
|
|
89
|
+
const maxLatency = Math.max(...cells.map(c => c.p95LatencyMs), 1);
|
|
90
|
+
for (const cell of cells) {
|
|
91
|
+
// Heat = 60% cost weight + 40% latency weight
|
|
92
|
+
cell.heat = Math.min(1, 0.6 * (cell.costUsd / maxCost) + 0.4 * (cell.p95LatencyMs / maxLatency));
|
|
93
|
+
}
|
|
94
|
+
cells.sort((a, b) => b.heat - a.heat);
|
|
95
|
+
return {
|
|
96
|
+
timestamp: new Date().toISOString(),
|
|
97
|
+
cells,
|
|
98
|
+
totalCostUsd,
|
|
99
|
+
totalTokens,
|
|
100
|
+
hottestAgent: cells.length > 0 ? cells[0].agentId : null,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/** List all tracked agent IDs */
|
|
104
|
+
listAgents() {
|
|
105
|
+
return [...this.samples.keys()];
|
|
106
|
+
}
|
|
107
|
+
/** Clear all data */
|
|
108
|
+
clear() {
|
|
109
|
+
this.samples.clear();
|
|
110
|
+
}
|
|
111
|
+
/** Clear data for a specific agent */
|
|
112
|
+
clearAgent(agentId) {
|
|
113
|
+
this.samples.delete(agentId);
|
|
114
|
+
}
|
|
115
|
+
computeCell(agentId, list) {
|
|
116
|
+
const model = this.agentModels.get(agentId);
|
|
117
|
+
const rate = model ? (this.costRates.get(model) ?? this.defaultRate) : this.defaultRate;
|
|
118
|
+
let totalInputTokens = 0;
|
|
119
|
+
let totalOutputTokens = 0;
|
|
120
|
+
let totalDurationMs = 0;
|
|
121
|
+
let errors = 0;
|
|
122
|
+
const durations = [];
|
|
123
|
+
const now = Date.now();
|
|
124
|
+
let recentCount = 0;
|
|
125
|
+
for (const s of list) {
|
|
126
|
+
totalInputTokens += s.inputTokens;
|
|
127
|
+
totalOutputTokens += s.outputTokens;
|
|
128
|
+
totalDurationMs += s.durationMs;
|
|
129
|
+
durations.push(s.durationMs);
|
|
130
|
+
if (!s.success)
|
|
131
|
+
errors++;
|
|
132
|
+
if (now - s.timestamp <= this.windowMs)
|
|
133
|
+
recentCount++;
|
|
134
|
+
}
|
|
135
|
+
durations.sort((a, b) => a - b);
|
|
136
|
+
const totalTokens = totalInputTokens + totalOutputTokens;
|
|
137
|
+
const costUsd = (totalInputTokens / 1000) * rate.inputPer1k + (totalOutputTokens / 1000) * rate.outputPer1k;
|
|
138
|
+
return {
|
|
139
|
+
agentId,
|
|
140
|
+
costUsd,
|
|
141
|
+
totalTokens,
|
|
142
|
+
executions: list.length,
|
|
143
|
+
errors,
|
|
144
|
+
errorRate: list.length > 0 ? errors / list.length : 0,
|
|
145
|
+
avgLatencyMs: list.length > 0 ? totalDurationMs / list.length : 0,
|
|
146
|
+
p50LatencyMs: this.percentile(durations, 0.50),
|
|
147
|
+
p95LatencyMs: this.percentile(durations, 0.95),
|
|
148
|
+
p99LatencyMs: this.percentile(durations, 0.99),
|
|
149
|
+
throughputPerMin: this.windowMs > 0 ? (recentCount / this.windowMs) * 60_000 : 0,
|
|
150
|
+
heat: 0, // Will be normalized in getSnapshot()
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
percentile(sorted, p) {
|
|
154
|
+
if (sorted.length === 0)
|
|
155
|
+
return 0;
|
|
156
|
+
const idx = Math.ceil(p * sorted.length) - 1;
|
|
157
|
+
return sorted[Math.max(0, idx)];
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
exports.CostHeatmap = CostHeatmap;
|
|
161
|
+
//# sourceMappingURL=cost-heatmap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-heatmap.js","sourceRoot":"","sources":["../../lib/cost-heatmap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CoverageReporter — Lightweight code coverage reporting without external deps
|
|
3
|
+
*
|
|
4
|
+
* Integrates with Node.js built-in V8 coverage (`NODE_V8_COVERAGE`).
|
|
5
|
+
* Parses V8 coverage JSON output into a structured report with file-level
|
|
6
|
+
* line and function coverage metrics. Supports thresholds and reporters.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* // Run tests with V8 coverage:
|
|
10
|
+
* // NODE_V8_COVERAGE=./coverage npx ts-node test.ts
|
|
11
|
+
*
|
|
12
|
+
* const reporter = new CoverageReporter({ coverageDir: './coverage' });
|
|
13
|
+
* const report = await reporter.collect();
|
|
14
|
+
* reporter.printSummary(report);
|
|
15
|
+
* reporter.enforce(report, { linePct: 80, branchPct: 70 });
|
|
16
|
+
*
|
|
17
|
+
* @module CoverageReporter
|
|
18
|
+
* @version 1.0.0
|
|
19
|
+
*/
|
|
20
|
+
/** Coverage stats for a single file */
|
|
21
|
+
export interface FileCoverage {
|
|
22
|
+
/** File path (relative to project root) */
|
|
23
|
+
file: string;
|
|
24
|
+
/** Total functions found */
|
|
25
|
+
totalFunctions: number;
|
|
26
|
+
/** Functions with at least one call */
|
|
27
|
+
coveredFunctions: number;
|
|
28
|
+
/** Function coverage percentage (0-100) */
|
|
29
|
+
functionPct: number;
|
|
30
|
+
/** Total byte ranges */
|
|
31
|
+
totalRanges: number;
|
|
32
|
+
/** Ranges with count > 0 */
|
|
33
|
+
coveredRanges: number;
|
|
34
|
+
/** Range coverage percentage (0-100) */
|
|
35
|
+
rangePct: number;
|
|
36
|
+
}
|
|
37
|
+
/** Aggregate coverage report */
|
|
38
|
+
export interface CoverageReport {
|
|
39
|
+
/** Individual file coverage */
|
|
40
|
+
files: FileCoverage[];
|
|
41
|
+
/** Aggregate function coverage % */
|
|
42
|
+
totalFunctionPct: number;
|
|
43
|
+
/** Aggregate range coverage % */
|
|
44
|
+
totalRangePct: number;
|
|
45
|
+
/** Total files analyzed */
|
|
46
|
+
fileCount: number;
|
|
47
|
+
/** Timestamp */
|
|
48
|
+
generatedAt: number;
|
|
49
|
+
}
|
|
50
|
+
/** Coverage thresholds */
|
|
51
|
+
export interface CoverageThresholds {
|
|
52
|
+
/** Minimum function coverage % (0-100) */
|
|
53
|
+
functionPct?: number;
|
|
54
|
+
/** Minimum range/branch coverage % (0-100) */
|
|
55
|
+
rangePct?: number;
|
|
56
|
+
/** Per-file minimum function coverage % */
|
|
57
|
+
perFileFunctionPct?: number;
|
|
58
|
+
}
|
|
59
|
+
/** Coverage reporter configuration */
|
|
60
|
+
export interface CoverageReporterConfig {
|
|
61
|
+
/** Directory containing V8 coverage JSON files */
|
|
62
|
+
coverageDir: string;
|
|
63
|
+
/** Project root for relative path computation */
|
|
64
|
+
projectRoot?: string;
|
|
65
|
+
/** File patterns to include (substring match) */
|
|
66
|
+
include?: string[];
|
|
67
|
+
/** File patterns to exclude (substring match) */
|
|
68
|
+
exclude?: string[];
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* CoverageReporter — Collects and reports V8 code coverage data.
|
|
72
|
+
*/
|
|
73
|
+
export declare class CoverageReporter {
|
|
74
|
+
private readonly config;
|
|
75
|
+
constructor(config: CoverageReporterConfig);
|
|
76
|
+
/**
|
|
77
|
+
* Collect coverage data from V8 coverage directory.
|
|
78
|
+
*/
|
|
79
|
+
collect(): Promise<CoverageReport>;
|
|
80
|
+
/**
|
|
81
|
+
* Print a summary table to console.
|
|
82
|
+
*/
|
|
83
|
+
printSummary(report: CoverageReport): void;
|
|
84
|
+
/**
|
|
85
|
+
* Enforce coverage thresholds. Throws if below threshold.
|
|
86
|
+
*/
|
|
87
|
+
enforce(report: CoverageReport, thresholds: CoverageThresholds): void;
|
|
88
|
+
private findCoverageFiles;
|
|
89
|
+
private shouldInclude;
|
|
90
|
+
private toRelativePath;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=coverage-reporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-reporter.d.ts","sourceRoot":"","sources":["../../lib/coverage-reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAgCH,uCAAuC;AACvC,MAAM,WAAW,YAAY;IAC3B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,gBAAgB,EAAE,MAAM,CAAC;IACzB,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,gCAAgC;AAChC,MAAM,WAAW,cAAc;IAC7B,+BAA+B;IAC/B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,oCAAoC;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,iCAAiC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,0BAA0B;AAC1B,MAAM,WAAW,kBAAkB;IACjC,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,sCAAsC;AACtC,MAAM,WAAW,sBAAsB;IACrC,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAMD;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;gBAE9C,MAAM,EAAE,sBAAsB;IAS1C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,cAAc,CAAC;IAyDxC;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAsB1C;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,kBAAkB,GAAG,IAAI;YAkCvD,iBAAiB;IAe/B,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,cAAc;CAYvB"}
|