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,336 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AgentMemory — Multi-layer memory system for agents.
|
|
4
|
+
*
|
|
5
|
+
* Three memory layers:
|
|
6
|
+
* - **Episodic**: per-run short-term memory with time-based decay
|
|
7
|
+
* - **Procedural**: persistent skill/chain patterns (e.g. SkillComposer recipes)
|
|
8
|
+
* - **Shared long-term**: cross-agent knowledge base with relevance scoring
|
|
9
|
+
*
|
|
10
|
+
* @module AgentMemory
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.AgentMemory = exports.SharedLongTermMemory = exports.ProceduralMemory = exports.EpisodicMemory = void 0;
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// EPISODIC MEMORY
|
|
16
|
+
// ============================================================================
|
|
17
|
+
/**
|
|
18
|
+
* Short-term, per-run memory with exponential time decay.
|
|
19
|
+
* Entries lose relevance over time; stale entries are pruned.
|
|
20
|
+
*/
|
|
21
|
+
class EpisodicMemory {
|
|
22
|
+
entries = new Map();
|
|
23
|
+
maxEntries;
|
|
24
|
+
defaultHalfLifeMs;
|
|
25
|
+
constructor(options = {}) {
|
|
26
|
+
this.maxEntries = options.maxEntries ?? 500;
|
|
27
|
+
this.defaultHalfLifeMs = options.defaultHalfLifeMs ?? 600_000; // 10 minutes
|
|
28
|
+
}
|
|
29
|
+
/** Store a new episodic memory */
|
|
30
|
+
store(content, tags = [], metadata = {}, halfLifeMs) {
|
|
31
|
+
const id = `ep_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
32
|
+
const now = Date.now();
|
|
33
|
+
this.entries.set(id, {
|
|
34
|
+
id,
|
|
35
|
+
content,
|
|
36
|
+
tags,
|
|
37
|
+
createdAt: now,
|
|
38
|
+
lastAccessed: now,
|
|
39
|
+
accessCount: 0,
|
|
40
|
+
score: 1.0,
|
|
41
|
+
metadata,
|
|
42
|
+
halfLifeMs: halfLifeMs ?? this.defaultHalfLifeMs,
|
|
43
|
+
});
|
|
44
|
+
this.evict();
|
|
45
|
+
return id;
|
|
46
|
+
}
|
|
47
|
+
/** Recall entries matching criteria, scored by recency and decay */
|
|
48
|
+
recall(options = {}) {
|
|
49
|
+
const now = Date.now();
|
|
50
|
+
const results = [];
|
|
51
|
+
for (const entry of this.entries.values()) {
|
|
52
|
+
// Apply decay
|
|
53
|
+
const elapsed = now - entry.createdAt;
|
|
54
|
+
const decayFactor = Math.pow(0.5, elapsed / entry.halfLifeMs);
|
|
55
|
+
entry.score = decayFactor;
|
|
56
|
+
if (options.minScore !== undefined && entry.score < options.minScore)
|
|
57
|
+
continue;
|
|
58
|
+
if (options.since !== undefined && entry.createdAt < options.since)
|
|
59
|
+
continue;
|
|
60
|
+
if (options.tags && options.tags.length > 0) {
|
|
61
|
+
const matches = options.tags.some(t => entry.tags.includes(t));
|
|
62
|
+
if (!matches)
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
entry.lastAccessed = now;
|
|
66
|
+
entry.accessCount++;
|
|
67
|
+
results.push(entry);
|
|
68
|
+
}
|
|
69
|
+
results.sort((a, b) => b.score - a.score);
|
|
70
|
+
return results.slice(0, options.maxResults ?? 20);
|
|
71
|
+
}
|
|
72
|
+
/** Remove a specific entry */
|
|
73
|
+
remove(id) {
|
|
74
|
+
return this.entries.delete(id);
|
|
75
|
+
}
|
|
76
|
+
/** Clear all entries */
|
|
77
|
+
clear() {
|
|
78
|
+
this.entries.clear();
|
|
79
|
+
}
|
|
80
|
+
/** Number of stored entries */
|
|
81
|
+
size() {
|
|
82
|
+
return this.entries.size;
|
|
83
|
+
}
|
|
84
|
+
/** Prune entries below a score threshold */
|
|
85
|
+
prune(minScore = 0.01) {
|
|
86
|
+
const now = Date.now();
|
|
87
|
+
let pruned = 0;
|
|
88
|
+
for (const [id, entry] of this.entries) {
|
|
89
|
+
const elapsed = now - entry.createdAt;
|
|
90
|
+
const decayFactor = Math.pow(0.5, elapsed / entry.halfLifeMs);
|
|
91
|
+
if (decayFactor < minScore) {
|
|
92
|
+
this.entries.delete(id);
|
|
93
|
+
pruned++;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return pruned;
|
|
97
|
+
}
|
|
98
|
+
evict() {
|
|
99
|
+
if (this.entries.size <= this.maxEntries)
|
|
100
|
+
return;
|
|
101
|
+
// Remove oldest entries
|
|
102
|
+
const sorted = [...this.entries.entries()].sort((a, b) => a[1].createdAt - b[1].createdAt);
|
|
103
|
+
const toRemove = sorted.slice(0, this.entries.size - this.maxEntries);
|
|
104
|
+
for (const [id] of toRemove)
|
|
105
|
+
this.entries.delete(id);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
exports.EpisodicMemory = EpisodicMemory;
|
|
109
|
+
// ============================================================================
|
|
110
|
+
// PROCEDURAL MEMORY
|
|
111
|
+
// ============================================================================
|
|
112
|
+
/**
|
|
113
|
+
* Persistent memory for successful skill/chain patterns.
|
|
114
|
+
* Agents learn which patterns work and prefer them in future.
|
|
115
|
+
*/
|
|
116
|
+
class ProceduralMemory {
|
|
117
|
+
entries = new Map();
|
|
118
|
+
maxEntries;
|
|
119
|
+
constructor(options = {}) {
|
|
120
|
+
this.maxEntries = options.maxEntries ?? 1000;
|
|
121
|
+
}
|
|
122
|
+
/** Register a pattern (chain/batch/loop/verify) */
|
|
123
|
+
register(id, content, patternType, tags = [], metadata = {}) {
|
|
124
|
+
const now = Date.now();
|
|
125
|
+
const existing = this.entries.get(id);
|
|
126
|
+
if (existing) {
|
|
127
|
+
existing.lastAccessed = now;
|
|
128
|
+
existing.accessCount++;
|
|
129
|
+
return existing;
|
|
130
|
+
}
|
|
131
|
+
const entry = {
|
|
132
|
+
id,
|
|
133
|
+
content,
|
|
134
|
+
tags,
|
|
135
|
+
patternType,
|
|
136
|
+
createdAt: now,
|
|
137
|
+
lastAccessed: now,
|
|
138
|
+
accessCount: 0,
|
|
139
|
+
score: 0.5,
|
|
140
|
+
metadata,
|
|
141
|
+
successCount: 0,
|
|
142
|
+
failureCount: 0,
|
|
143
|
+
};
|
|
144
|
+
this.entries.set(id, entry);
|
|
145
|
+
this.evict();
|
|
146
|
+
return entry;
|
|
147
|
+
}
|
|
148
|
+
/** Record success for a pattern — increases its score */
|
|
149
|
+
recordSuccess(id) {
|
|
150
|
+
const entry = this.entries.get(id);
|
|
151
|
+
if (!entry)
|
|
152
|
+
return;
|
|
153
|
+
entry.successCount++;
|
|
154
|
+
entry.score = entry.successCount / (entry.successCount + entry.failureCount);
|
|
155
|
+
entry.lastAccessed = Date.now();
|
|
156
|
+
}
|
|
157
|
+
/** Record failure for a pattern — decreases its score */
|
|
158
|
+
recordFailure(id) {
|
|
159
|
+
const entry = this.entries.get(id);
|
|
160
|
+
if (!entry)
|
|
161
|
+
return;
|
|
162
|
+
entry.failureCount++;
|
|
163
|
+
entry.score = entry.successCount / (entry.successCount + entry.failureCount);
|
|
164
|
+
entry.lastAccessed = Date.now();
|
|
165
|
+
}
|
|
166
|
+
/** Recall top-scoring patterns matching criteria */
|
|
167
|
+
recall(options = {}) {
|
|
168
|
+
const results = [];
|
|
169
|
+
for (const entry of this.entries.values()) {
|
|
170
|
+
if (options.patternType && entry.patternType !== options.patternType)
|
|
171
|
+
continue;
|
|
172
|
+
if (options.minScore !== undefined && entry.score < options.minScore)
|
|
173
|
+
continue;
|
|
174
|
+
if (options.tags && options.tags.length > 0) {
|
|
175
|
+
const matches = options.tags.some(t => entry.tags.includes(t));
|
|
176
|
+
if (!matches)
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
entry.lastAccessed = Date.now();
|
|
180
|
+
entry.accessCount++;
|
|
181
|
+
results.push(entry);
|
|
182
|
+
}
|
|
183
|
+
results.sort((a, b) => b.score - a.score);
|
|
184
|
+
return results.slice(0, options.maxResults ?? 20);
|
|
185
|
+
}
|
|
186
|
+
/** Get a specific pattern by ID */
|
|
187
|
+
get(id) {
|
|
188
|
+
return this.entries.get(id);
|
|
189
|
+
}
|
|
190
|
+
/** Number of stored patterns */
|
|
191
|
+
size() {
|
|
192
|
+
return this.entries.size;
|
|
193
|
+
}
|
|
194
|
+
/** Clear all patterns */
|
|
195
|
+
clear() {
|
|
196
|
+
this.entries.clear();
|
|
197
|
+
}
|
|
198
|
+
evict() {
|
|
199
|
+
if (this.entries.size <= this.maxEntries)
|
|
200
|
+
return;
|
|
201
|
+
const sorted = [...this.entries.entries()].sort((a, b) => a[1].score - b[1].score);
|
|
202
|
+
const toRemove = sorted.slice(0, this.entries.size - this.maxEntries);
|
|
203
|
+
for (const [id] of toRemove)
|
|
204
|
+
this.entries.delete(id);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
exports.ProceduralMemory = ProceduralMemory;
|
|
208
|
+
// ============================================================================
|
|
209
|
+
// SHARED LONG-TERM MEMORY
|
|
210
|
+
// ============================================================================
|
|
211
|
+
/**
|
|
212
|
+
* Cross-agent shared knowledge base.
|
|
213
|
+
* Any agent can contribute; all agents can query.
|
|
214
|
+
* Relevance scored by tag overlap and access frequency.
|
|
215
|
+
*/
|
|
216
|
+
class SharedLongTermMemory {
|
|
217
|
+
entries = new Map();
|
|
218
|
+
maxEntries;
|
|
219
|
+
constructor(options = {}) {
|
|
220
|
+
this.maxEntries = options.maxEntries ?? 5000;
|
|
221
|
+
}
|
|
222
|
+
/** Contribute knowledge to the shared store */
|
|
223
|
+
contribute(sourceAgent, content, tags = [], metadata = {}) {
|
|
224
|
+
const id = `shared_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
225
|
+
const now = Date.now();
|
|
226
|
+
this.entries.set(id, {
|
|
227
|
+
id,
|
|
228
|
+
content,
|
|
229
|
+
tags,
|
|
230
|
+
createdAt: now,
|
|
231
|
+
lastAccessed: now,
|
|
232
|
+
accessCount: 0,
|
|
233
|
+
score: 0.5,
|
|
234
|
+
metadata,
|
|
235
|
+
sourceAgent,
|
|
236
|
+
accessedBy: new Set(),
|
|
237
|
+
});
|
|
238
|
+
this.evict();
|
|
239
|
+
return id;
|
|
240
|
+
}
|
|
241
|
+
/** Query shared memory, scored by tag overlap and recency */
|
|
242
|
+
query(agentId, options = {}) {
|
|
243
|
+
const results = [];
|
|
244
|
+
const queryTags = options.tags ?? [];
|
|
245
|
+
for (const entry of this.entries.values()) {
|
|
246
|
+
if (options.since !== undefined && entry.createdAt < options.since)
|
|
247
|
+
continue;
|
|
248
|
+
// Score by tag overlap
|
|
249
|
+
let tagScore = 0;
|
|
250
|
+
if (queryTags.length > 0) {
|
|
251
|
+
const overlap = queryTags.filter(t => entry.tags.includes(t)).length;
|
|
252
|
+
tagScore = overlap / queryTags.length;
|
|
253
|
+
if (overlap === 0)
|
|
254
|
+
continue; // no tag overlap = skip
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
tagScore = 0.5; // no filter = moderate relevance
|
|
258
|
+
}
|
|
259
|
+
// Boost by access frequency
|
|
260
|
+
const freqBoost = Math.min(entry.accessCount / 10, 1.0) * 0.3;
|
|
261
|
+
entry.score = tagScore * 0.7 + freqBoost;
|
|
262
|
+
if (options.minScore !== undefined && entry.score < options.minScore)
|
|
263
|
+
continue;
|
|
264
|
+
entry.lastAccessed = Date.now();
|
|
265
|
+
entry.accessCount++;
|
|
266
|
+
entry.accessedBy.add(agentId);
|
|
267
|
+
results.push(entry);
|
|
268
|
+
}
|
|
269
|
+
results.sort((a, b) => b.score - a.score);
|
|
270
|
+
return results.slice(0, options.maxResults ?? 20);
|
|
271
|
+
}
|
|
272
|
+
/** Get all entries contributed by a specific agent */
|
|
273
|
+
getByAgent(sourceAgent) {
|
|
274
|
+
return [...this.entries.values()].filter(e => e.sourceAgent === sourceAgent);
|
|
275
|
+
}
|
|
276
|
+
/** Number of stored entries */
|
|
277
|
+
size() {
|
|
278
|
+
return this.entries.size;
|
|
279
|
+
}
|
|
280
|
+
/** Clear all entries */
|
|
281
|
+
clear() {
|
|
282
|
+
this.entries.clear();
|
|
283
|
+
}
|
|
284
|
+
evict() {
|
|
285
|
+
if (this.entries.size <= this.maxEntries)
|
|
286
|
+
return;
|
|
287
|
+
const sorted = [...this.entries.entries()].sort((a, b) => a[1].score - b[1].score);
|
|
288
|
+
const toRemove = sorted.slice(0, this.entries.size - this.maxEntries);
|
|
289
|
+
for (const [id] of toRemove)
|
|
290
|
+
this.entries.delete(id);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
exports.SharedLongTermMemory = SharedLongTermMemory;
|
|
294
|
+
// ============================================================================
|
|
295
|
+
// UNIFIED AGENT MEMORY
|
|
296
|
+
// ============================================================================
|
|
297
|
+
/**
|
|
298
|
+
* Unified memory system combining all three layers.
|
|
299
|
+
* Instantiate per-agent for episodic, share ProceduralMemory and
|
|
300
|
+
* SharedLongTermMemory across agents.
|
|
301
|
+
*
|
|
302
|
+
* @example
|
|
303
|
+
* ```ts
|
|
304
|
+
* const procedural = new ProceduralMemory();
|
|
305
|
+
* const shared = new SharedLongTermMemory();
|
|
306
|
+
*
|
|
307
|
+
* const agentMemory = new AgentMemory('agent-1', { procedural, shared });
|
|
308
|
+
* agentMemory.episodic.store('Completed code review', ['review', 'code']);
|
|
309
|
+
* agentMemory.procedural.recordSuccess('chain-review-fix');
|
|
310
|
+
* agentMemory.shared.contribute('agent-1', 'Auth service uses JWT', ['auth']);
|
|
311
|
+
* ```
|
|
312
|
+
*/
|
|
313
|
+
class AgentMemory {
|
|
314
|
+
agentId;
|
|
315
|
+
episodic;
|
|
316
|
+
procedural;
|
|
317
|
+
shared;
|
|
318
|
+
constructor(agentId, options = {}) {
|
|
319
|
+
this.agentId = agentId;
|
|
320
|
+
this.episodic = options.episodic ?? new EpisodicMemory();
|
|
321
|
+
this.procedural = options.procedural ?? new ProceduralMemory();
|
|
322
|
+
this.shared = options.shared ?? new SharedLongTermMemory();
|
|
323
|
+
}
|
|
324
|
+
/** Recall across all layers, merged and ranked by score */
|
|
325
|
+
recallAll(options = {}) {
|
|
326
|
+
const results = [
|
|
327
|
+
...this.episodic.recall(options),
|
|
328
|
+
...this.procedural.recall(options),
|
|
329
|
+
...this.shared.query(this.agentId, options),
|
|
330
|
+
];
|
|
331
|
+
results.sort((a, b) => b.score - a.score);
|
|
332
|
+
return results.slice(0, options.maxResults ?? 30);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
exports.AgentMemory = AgentMemory;
|
|
336
|
+
//# sourceMappingURL=agent-memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-memory.js","sourceRoot":"","sources":["../../lib/agent-memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VCR — Record and replay LLM/agent interactions for testing
|
|
3
|
+
*
|
|
4
|
+
* Provides a VCR (Video Cassette Recorder) pattern for capturing
|
|
5
|
+
* agent execution calls and replaying them deterministically in tests.
|
|
6
|
+
*
|
|
7
|
+
* Modes:
|
|
8
|
+
* - `record` — Intercepts calls, forwards to real handler, saves cassette
|
|
9
|
+
* - `replay` — Matches calls to recorded cassettes, returns saved results
|
|
10
|
+
* - `passthrough` — Disabled, all calls go to real handler
|
|
11
|
+
*
|
|
12
|
+
* Features:
|
|
13
|
+
* - Cassettes stored as JSON files
|
|
14
|
+
* - Request matching by agent ID + action + params hash
|
|
15
|
+
* - Configurable matching strictness
|
|
16
|
+
* - Call ordering enforcement (optional)
|
|
17
|
+
* - Missing cassette detection with helpful errors
|
|
18
|
+
*
|
|
19
|
+
* Usage:
|
|
20
|
+
* const vcr = new AgentVCR({ mode: 'record', cassettePath: './fixtures' });
|
|
21
|
+
* const result = await vcr.execute('agent-1', payload, realHandler);
|
|
22
|
+
* await vcr.save('my-test'); // Saves cassette to ./fixtures/my-test.json
|
|
23
|
+
*
|
|
24
|
+
* // Later in tests:
|
|
25
|
+
* const vcr2 = new AgentVCR({ mode: 'replay', cassettePath: './fixtures' });
|
|
26
|
+
* await vcr2.load('my-test');
|
|
27
|
+
* const result2 = await vcr2.execute('agent-1', payload); // Returns recorded result
|
|
28
|
+
*
|
|
29
|
+
* @module AgentVCR
|
|
30
|
+
* @version 1.0.0
|
|
31
|
+
*/
|
|
32
|
+
/** VCR operating mode */
|
|
33
|
+
export type VCRMode = 'record' | 'replay' | 'passthrough';
|
|
34
|
+
/** A single recorded interaction */
|
|
35
|
+
export interface VCRInteraction {
|
|
36
|
+
/** Request fingerprint for matching */
|
|
37
|
+
fingerprint: string;
|
|
38
|
+
/** Agent ID */
|
|
39
|
+
agentId: string;
|
|
40
|
+
/** Action/instruction */
|
|
41
|
+
action: string;
|
|
42
|
+
/** Params hash (for matching) */
|
|
43
|
+
paramsHash: string;
|
|
44
|
+
/** Full request payload (for debugging) */
|
|
45
|
+
request: Record<string, unknown>;
|
|
46
|
+
/** Recorded response */
|
|
47
|
+
response: Record<string, unknown>;
|
|
48
|
+
/** When this was recorded */
|
|
49
|
+
recordedAt: number;
|
|
50
|
+
/** Execution duration in ms */
|
|
51
|
+
durationMs: number;
|
|
52
|
+
}
|
|
53
|
+
/** A cassette file — collection of recorded interactions */
|
|
54
|
+
export interface VCRCassette {
|
|
55
|
+
/** Cassette name */
|
|
56
|
+
name: string;
|
|
57
|
+
/** When the cassette was created */
|
|
58
|
+
createdAt: number;
|
|
59
|
+
/** Recorded interactions */
|
|
60
|
+
interactions: VCRInteraction[];
|
|
61
|
+
/** Metadata */
|
|
62
|
+
metadata?: Record<string, unknown>;
|
|
63
|
+
}
|
|
64
|
+
/** VCR configuration */
|
|
65
|
+
export interface VCRConfig {
|
|
66
|
+
/** Operating mode */
|
|
67
|
+
mode: VCRMode;
|
|
68
|
+
/** Directory for cassette files */
|
|
69
|
+
cassettePath: string;
|
|
70
|
+
/** Match strictness: 'exact' matches full params, 'fuzzy' matches agent+action only */
|
|
71
|
+
matchMode?: 'exact' | 'fuzzy';
|
|
72
|
+
/** Whether to enforce call ordering in replay (default: false) */
|
|
73
|
+
ordered?: boolean;
|
|
74
|
+
/** Whether to throw on missing cassette in replay (default: true) */
|
|
75
|
+
throwOnMissing?: boolean;
|
|
76
|
+
}
|
|
77
|
+
/** Real execution handler — wraps the actual agent call */
|
|
78
|
+
export type VCRHandler = (agentId: string, payload: Record<string, unknown>) => Promise<Record<string, unknown>>;
|
|
79
|
+
/** Match result for debugging */
|
|
80
|
+
export interface VCRMatchResult {
|
|
81
|
+
matched: boolean;
|
|
82
|
+
fingerprint: string;
|
|
83
|
+
candidates: number;
|
|
84
|
+
bestMatch?: VCRInteraction;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Agent VCR — Record and replay agent execution calls.
|
|
88
|
+
*
|
|
89
|
+
* In `record` mode, calls are forwarded to the real handler and saved.
|
|
90
|
+
* In `replay` mode, calls are matched to saved cassettes.
|
|
91
|
+
*/
|
|
92
|
+
export declare class AgentVCR {
|
|
93
|
+
private cassette;
|
|
94
|
+
private replayIndex;
|
|
95
|
+
private readonly config;
|
|
96
|
+
constructor(config: VCRConfig);
|
|
97
|
+
/** Get current mode */
|
|
98
|
+
get mode(): VCRMode;
|
|
99
|
+
/** Set mode at runtime */
|
|
100
|
+
setMode(mode: VCRMode): void;
|
|
101
|
+
/**
|
|
102
|
+
* Execute an agent call through the VCR.
|
|
103
|
+
*
|
|
104
|
+
* @param agentId - The agent to call
|
|
105
|
+
* @param payload - The request payload
|
|
106
|
+
* @param handler - Real handler (required in record/passthrough mode)
|
|
107
|
+
*/
|
|
108
|
+
execute(agentId: string, payload: Record<string, unknown>, handler?: VCRHandler): Promise<Record<string, unknown>>;
|
|
109
|
+
/**
|
|
110
|
+
* Load a cassette from disk.
|
|
111
|
+
*/
|
|
112
|
+
load(name: string): Promise<VCRCassette>;
|
|
113
|
+
/**
|
|
114
|
+
* Save the current recording as a named cassette.
|
|
115
|
+
*/
|
|
116
|
+
save(name: string): Promise<void>;
|
|
117
|
+
/** Get the current cassette */
|
|
118
|
+
getCassette(): VCRCassette | null;
|
|
119
|
+
/** Reset the VCR (clear cassette and replay index) */
|
|
120
|
+
reset(): void;
|
|
121
|
+
/** Get number of recorded interactions */
|
|
122
|
+
get interactionCount(): number;
|
|
123
|
+
/**
|
|
124
|
+
* Try to match a request to a recorded interaction.
|
|
125
|
+
* Useful for debugging match failures.
|
|
126
|
+
*/
|
|
127
|
+
findMatch(agentId: string, payload: Record<string, unknown>): VCRMatchResult;
|
|
128
|
+
private recordExecution;
|
|
129
|
+
private replayExecution;
|
|
130
|
+
private computeFingerprint;
|
|
131
|
+
private hashParams;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=agent-vcr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-vcr.d.ts","sourceRoot":"","sources":["../../lib/agent-vcr.ts"],"names":[],"mappings":"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"}
|