agentfootprint 2.2.0 → 2.3.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.
Files changed (154) hide show
  1. package/AGENTS.md +52 -0
  2. package/CLAUDE.md +52 -0
  3. package/README.md +49 -0
  4. package/README.proposed.md +258 -0
  5. package/ai-instructions/claude-code/SKILL.md +24 -5
  6. package/ai-instructions/clinerules +22 -5
  7. package/ai-instructions/copilot-instructions.md +22 -5
  8. package/ai-instructions/cursor/agentfootprint.md +22 -5
  9. package/ai-instructions/kiro/agentfootprint.md +22 -5
  10. package/ai-instructions/windsurfrules +22 -5
  11. package/dist/adapters/llm/AnthropicProvider.js +0 -31
  12. package/dist/adapters/llm/AnthropicProvider.js.map +1 -1
  13. package/dist/adapters/llm/BedrockProvider.js +2 -28
  14. package/dist/adapters/llm/BedrockProvider.js.map +1 -1
  15. package/dist/adapters/llm/BrowserAnthropicProvider.js +1 -31
  16. package/dist/adapters/llm/BrowserAnthropicProvider.js.map +1 -1
  17. package/dist/adapters/llm/BrowserOpenAIProvider.js +1 -11
  18. package/dist/adapters/llm/BrowserOpenAIProvider.js.map +1 -1
  19. package/dist/adapters/llm/MockProvider.js +35 -1
  20. package/dist/adapters/llm/MockProvider.js.map +1 -1
  21. package/dist/adapters/llm/OpenAIProvider.js +3 -29
  22. package/dist/adapters/llm/OpenAIProvider.js.map +1 -1
  23. package/dist/adapters/memory/agentcore.js +305 -0
  24. package/dist/adapters/memory/agentcore.js.map +1 -0
  25. package/dist/adapters/memory/redis.js +287 -0
  26. package/dist/adapters/memory/redis.js.map +1 -0
  27. package/dist/esm/adapters/llm/AnthropicProvider.js +0 -31
  28. package/dist/esm/adapters/llm/AnthropicProvider.js.map +1 -1
  29. package/dist/esm/adapters/llm/BedrockProvider.js +2 -28
  30. package/dist/esm/adapters/llm/BedrockProvider.js.map +1 -1
  31. package/dist/esm/adapters/llm/BrowserAnthropicProvider.js +1 -31
  32. package/dist/esm/adapters/llm/BrowserAnthropicProvider.js.map +1 -1
  33. package/dist/esm/adapters/llm/BrowserOpenAIProvider.js +1 -11
  34. package/dist/esm/adapters/llm/BrowserOpenAIProvider.js.map +1 -1
  35. package/dist/esm/adapters/llm/MockProvider.js +35 -1
  36. package/dist/esm/adapters/llm/MockProvider.js.map +1 -1
  37. package/dist/esm/adapters/llm/OpenAIProvider.js +3 -29
  38. package/dist/esm/adapters/llm/OpenAIProvider.js.map +1 -1
  39. package/dist/esm/adapters/memory/agentcore.js +301 -0
  40. package/dist/esm/adapters/memory/agentcore.js.map +1 -0
  41. package/dist/esm/adapters/memory/redis.js +283 -0
  42. package/dist/esm/adapters/memory/redis.js.map +1 -0
  43. package/dist/esm/index.js +2 -2
  44. package/dist/esm/index.js.map +1 -1
  45. package/dist/esm/lib/injection-engine/index.js +0 -54
  46. package/dist/esm/lib/injection-engine/index.js.map +1 -1
  47. package/dist/esm/lib/mcp/index.js +1 -0
  48. package/dist/esm/lib/mcp/index.js.map +1 -1
  49. package/dist/esm/lib/mcp/mcpClient.js +29 -24
  50. package/dist/esm/lib/mcp/mcpClient.js.map +1 -1
  51. package/dist/esm/lib/mcp/mockMcpClient.js +97 -0
  52. package/dist/esm/lib/mcp/mockMcpClient.js.map +1 -0
  53. package/dist/esm/lib/rag/defineRAG.js +0 -18
  54. package/dist/esm/lib/rag/defineRAG.js.map +1 -1
  55. package/dist/esm/lib/rag/indexDocuments.js +39 -4
  56. package/dist/esm/lib/rag/indexDocuments.js.map +1 -1
  57. package/dist/esm/memory/causal/loadSnapshot.js +1 -1
  58. package/dist/esm/memory/define.js +0 -14
  59. package/dist/esm/memory/define.js.map +1 -1
  60. package/dist/esm/memory/define.types.js +0 -10
  61. package/dist/esm/memory/define.types.js.map +1 -1
  62. package/dist/esm/resilience/index.js +0 -44
  63. package/dist/esm/resilience/index.js.map +1 -1
  64. package/dist/esm/stream.js +0 -29
  65. package/dist/esm/stream.js.map +1 -1
  66. package/dist/index.js +2 -1
  67. package/dist/index.js.map +1 -1
  68. package/dist/instructions.js +21 -0
  69. package/dist/instructions.js.map +1 -0
  70. package/dist/lib/injection-engine/index.js +0 -54
  71. package/dist/lib/injection-engine/index.js.map +1 -1
  72. package/dist/lib/instructions/defineInstruction.js +35 -0
  73. package/dist/lib/instructions/defineInstruction.js.map +1 -0
  74. package/dist/lib/instructions/evaluator.js +38 -0
  75. package/dist/lib/instructions/evaluator.js.map +1 -0
  76. package/dist/lib/instructions/index.js +48 -0
  77. package/dist/lib/instructions/index.js.map +1 -0
  78. package/dist/lib/instructions/types.js +22 -0
  79. package/dist/lib/instructions/types.js.map +1 -0
  80. package/dist/lib/mcp/index.js +3 -1
  81. package/dist/lib/mcp/index.js.map +1 -1
  82. package/dist/lib/mcp/mcpClient.js +29 -24
  83. package/dist/lib/mcp/mcpClient.js.map +1 -1
  84. package/dist/lib/mcp/mockMcpClient.js +101 -0
  85. package/dist/lib/mcp/mockMcpClient.js.map +1 -0
  86. package/dist/lib/rag/defineRAG.js +0 -18
  87. package/dist/lib/rag/defineRAG.js.map +1 -1
  88. package/dist/lib/rag/indexDocuments.js +39 -4
  89. package/dist/lib/rag/indexDocuments.js.map +1 -1
  90. package/dist/memory/causal/loadSnapshot.js +1 -1
  91. package/dist/memory/conversationHelpers.js +39 -0
  92. package/dist/memory/conversationHelpers.js.map +1 -0
  93. package/dist/memory/define.js +0 -14
  94. package/dist/memory/define.js.map +1 -1
  95. package/dist/memory/define.types.js +0 -10
  96. package/dist/memory/define.types.js.map +1 -1
  97. package/dist/resilience/index.js +0 -44
  98. package/dist/resilience/index.js.map +1 -1
  99. package/dist/stream.js +0 -29
  100. package/dist/stream.js.map +1 -1
  101. package/dist/types/adapters/llm/AnthropicProvider.d.ts +0 -31
  102. package/dist/types/adapters/llm/AnthropicProvider.d.ts.map +1 -1
  103. package/dist/types/adapters/llm/BedrockProvider.d.ts +2 -28
  104. package/dist/types/adapters/llm/BedrockProvider.d.ts.map +1 -1
  105. package/dist/types/adapters/llm/BrowserAnthropicProvider.d.ts +1 -31
  106. package/dist/types/adapters/llm/BrowserAnthropicProvider.d.ts.map +1 -1
  107. package/dist/types/adapters/llm/BrowserOpenAIProvider.d.ts +1 -11
  108. package/dist/types/adapters/llm/BrowserOpenAIProvider.d.ts.map +1 -1
  109. package/dist/types/adapters/llm/MockProvider.d.ts +45 -0
  110. package/dist/types/adapters/llm/MockProvider.d.ts.map +1 -1
  111. package/dist/types/adapters/llm/OpenAIProvider.d.ts +3 -29
  112. package/dist/types/adapters/llm/OpenAIProvider.d.ts.map +1 -1
  113. package/dist/types/adapters/memory/agentcore.d.ts +157 -0
  114. package/dist/types/adapters/memory/agentcore.d.ts.map +1 -0
  115. package/dist/types/adapters/memory/redis.d.ts +126 -0
  116. package/dist/types/adapters/memory/redis.d.ts.map +1 -0
  117. package/dist/types/index.d.ts +2 -2
  118. package/dist/types/index.d.ts.map +1 -1
  119. package/dist/types/instructions.d.ts +5 -0
  120. package/dist/types/instructions.d.ts.map +1 -0
  121. package/dist/types/lib/injection-engine/index.d.ts +0 -54
  122. package/dist/types/lib/injection-engine/index.d.ts.map +1 -1
  123. package/dist/types/lib/instructions/defineInstruction.d.ts +22 -0
  124. package/dist/types/lib/instructions/defineInstruction.d.ts.map +1 -0
  125. package/dist/types/lib/instructions/evaluator.d.ts +11 -0
  126. package/dist/types/lib/instructions/evaluator.d.ts.map +1 -0
  127. package/dist/types/lib/instructions/index.d.ts +44 -0
  128. package/dist/types/lib/instructions/index.d.ts.map +1 -0
  129. package/dist/types/lib/instructions/types.d.ts +100 -0
  130. package/dist/types/lib/instructions/types.d.ts.map +1 -0
  131. package/dist/types/lib/mcp/index.d.ts +1 -0
  132. package/dist/types/lib/mcp/index.d.ts.map +1 -1
  133. package/dist/types/lib/mcp/mcpClient.d.ts +0 -17
  134. package/dist/types/lib/mcp/mcpClient.d.ts.map +1 -1
  135. package/dist/types/lib/mcp/mockMcpClient.d.ts +66 -0
  136. package/dist/types/lib/mcp/mockMcpClient.d.ts.map +1 -0
  137. package/dist/types/lib/mcp/types.d.ts +2 -0
  138. package/dist/types/lib/mcp/types.d.ts.map +1 -1
  139. package/dist/types/lib/rag/defineRAG.d.ts +18 -21
  140. package/dist/types/lib/rag/defineRAG.d.ts.map +1 -1
  141. package/dist/types/lib/rag/indexDocuments.d.ts +30 -1
  142. package/dist/types/lib/rag/indexDocuments.d.ts.map +1 -1
  143. package/dist/types/memory/causal/loadSnapshot.d.ts +1 -1
  144. package/dist/types/memory/conversationHelpers.d.ts +19 -0
  145. package/dist/types/memory/conversationHelpers.d.ts.map +1 -0
  146. package/dist/types/memory/define.d.ts +0 -14
  147. package/dist/types/memory/define.d.ts.map +1 -1
  148. package/dist/types/memory/define.types.d.ts +2 -12
  149. package/dist/types/memory/define.types.d.ts.map +1 -1
  150. package/dist/types/resilience/index.d.ts +0 -44
  151. package/dist/types/resilience/index.d.ts.map +1 -1
  152. package/dist/types/stream.d.ts +0 -29
  153. package/dist/types/stream.d.ts.map +1 -1
  154. package/package.json +20 -1
@@ -0,0 +1,301 @@
1
+ /**
2
+ * AgentCoreStore — AWS Bedrock AgentCore Memory adapter (peer-dep
3
+ * `@aws-sdk/client-bedrock-agent-runtime`).
4
+ *
5
+ * Subpath import: `agentfootprint/memory-agentcore`.
6
+ *
7
+ * import { AgentCoreStore } from 'agentfootprint/memory-agentcore';
8
+ * const store = new AgentCoreStore({
9
+ * memoryId: 'arn:aws:bedrock:us-east-1:...:memory/my-mem',
10
+ * region: 'us-east-1',
11
+ * });
12
+ *
13
+ * Pattern: Adapter (GoF) — translates the `MemoryStore` interface onto
14
+ * AgentCore Memory's session/event model:
15
+ * MemoryIdentity ↔ AgentCore session (sessionId derived
16
+ * from the identity tuple)
17
+ * MemoryEntry ↔ AgentCore event payload (JSON
18
+ * envelope keyed by entry id)
19
+ * putIfVersion ↔ unsupported by AgentCore natively;
20
+ * emulated via list+CAS at adapter level
21
+ * seen / signatures ↔ in-process LRU shadow (AgentCore has
22
+ * no built-in dedup primitive)
23
+ * feedback ↔ in-process accumulator (AgentCore
24
+ * doesn't expose a feedback metric API)
25
+ * search ↔ NOT exposed in v2.3 — AgentCore's
26
+ * retrieve API is opaque (server-side
27
+ * retrieval pipeline). Will land as
28
+ * `agentcoreRetrieve()` in a later release.
29
+ *
30
+ * Role: Outer ring. Lazy-requires the AWS SDK; no runtime cost when
31
+ * another adapter is in use.
32
+ * Emits: N/A (storage adapters don't emit; recorders observe the
33
+ * memory pipeline that calls them).
34
+ *
35
+ * **Caveats** — call out before adopting:
36
+ * 1. AgentCore is session/event-based with built-in summarization.
37
+ * Mixing `defineMemory({ strategy: SUMMARIZE })` on top will
38
+ * double-compress. Pick one summarizer.
39
+ * 2. Optimistic-concurrency `putIfVersion` is emulated; under high
40
+ * concurrent write rates the CAS window is wider than RedisStore.
41
+ * Single-writer scenarios (one server process per session) are
42
+ * fine.
43
+ * 3. seen/feedback are in-process — they don't survive process restart.
44
+ * For durable recognition, implement at a higher layer or use Redis.
45
+ * 4. AWS rate limits apply. Production deployments should wrap with
46
+ * `withRetry` and budget calls per session.
47
+ */
48
+ import { identityNamespace } from '../../memory/identity/index.js';
49
+ /**
50
+ * AgentCore Memory-backed `MemoryStore`. Implements every method
51
+ * except `search()`. Vector retrieval via AgentCore's native API
52
+ * lands as a separate read-side helper in a later release.
53
+ *
54
+ * @throws when `@aws-sdk/client-bedrock-agent-runtime` is not
55
+ * installed and no `_client` is supplied.
56
+ */
57
+ export class AgentCoreStore {
58
+ client;
59
+ memoryId;
60
+ pageSize;
61
+ closed = false;
62
+ // In-process shadow state for things AgentCore doesn't surface
63
+ // natively — see file-level docstring for caveats.
64
+ signatures = new Map();
65
+ feedbackBag = new Map();
66
+ constructor(options) {
67
+ if (!options.memoryId) {
68
+ throw new Error('AgentCoreStore requires `memoryId`.');
69
+ }
70
+ this.memoryId = options.memoryId;
71
+ this.pageSize = options.pageSize ?? 50;
72
+ if (options._client) {
73
+ this.client = options._client;
74
+ }
75
+ else if (options.client) {
76
+ this.client = options.client;
77
+ }
78
+ else {
79
+ this.client = createAgentCoreClient(options.region);
80
+ }
81
+ }
82
+ // Identity → AgentCore session id. Stable, deterministic, isolating.
83
+ sessionId(identity) {
84
+ return `afp:${identityNamespace(identity)}`;
85
+ }
86
+ // Shadow-state keys (in-process Maps)
87
+ shadowKey(identity) {
88
+ return identityNamespace(identity);
89
+ }
90
+ feedbackKey(identity, id) {
91
+ return `${identityNamespace(identity)}::${id}`;
92
+ }
93
+ // ── MemoryStore implementation ──────────────────────────────────
94
+ async get(identity, id) {
95
+ this.ensureOpen('get');
96
+ const r = await this.client.getEvent({
97
+ memoryId: this.memoryId,
98
+ sessionId: this.sessionId(identity),
99
+ eventId: id,
100
+ });
101
+ if (!r || !r.payload)
102
+ return null;
103
+ const entry = parseEntry(r.payload);
104
+ if (!entry)
105
+ return null;
106
+ if (entry.ttl !== undefined && entry.ttl <= Date.now())
107
+ return null;
108
+ return entry;
109
+ }
110
+ async put(identity, entry) {
111
+ this.ensureOpen('put');
112
+ if (entry.ttl !== undefined && entry.ttl <= Date.now())
113
+ return;
114
+ await this.client.putEvent({
115
+ memoryId: this.memoryId,
116
+ sessionId: this.sessionId(identity),
117
+ eventId: entry.id,
118
+ payload: JSON.stringify(entry),
119
+ });
120
+ }
121
+ async putMany(identity, entries) {
122
+ this.ensureOpen('putMany');
123
+ if (entries.length === 0)
124
+ return;
125
+ // AgentCore has no batch-write API; sequentialize and let AWS SDK
126
+ // retry policy handle backoff. Production callers should set a
127
+ // sane `maxConcurrency` upstream rather than parallelizing here
128
+ // (per-session events are conceptually ordered).
129
+ for (const entry of entries) {
130
+ await this.put(identity, entry);
131
+ }
132
+ }
133
+ /**
134
+ * Emulated optimistic concurrency. AgentCore's PutEvent overwrites
135
+ * unconditionally. We read-then-write inside a JS critical section
136
+ * — adequate for single-writer-per-session deployments. For multi-
137
+ * writer correctness on AgentCore, layer your own coordination.
138
+ */
139
+ async putIfVersion(identity, entry, expectedVersion) {
140
+ this.ensureOpen('putIfVersion');
141
+ const current = await this.get(identity, entry.id);
142
+ if (current === null) {
143
+ if (expectedVersion !== 0)
144
+ return { applied: false };
145
+ }
146
+ else if (current.version !== expectedVersion) {
147
+ return { applied: false, currentVersion: current.version };
148
+ }
149
+ await this.put(identity, entry);
150
+ return { applied: true };
151
+ }
152
+ async list(identity, options = {}) {
153
+ this.ensureOpen('list');
154
+ const page = await this.client.listEvents({
155
+ memoryId: this.memoryId,
156
+ sessionId: this.sessionId(identity),
157
+ ...(options.cursor !== undefined && { nextToken: options.cursor }),
158
+ maxResults: options.limit ?? this.pageSize,
159
+ });
160
+ const out = [];
161
+ for (const ev of page.events) {
162
+ const entry = parseEntry(ev.payload);
163
+ if (!entry)
164
+ continue;
165
+ if (entry.ttl !== undefined && entry.ttl <= Date.now())
166
+ continue;
167
+ if (options.tiers && (!entry.tier || !options.tiers.includes(entry.tier)))
168
+ continue;
169
+ out.push(entry);
170
+ }
171
+ return page.nextToken ? { entries: out, cursor: page.nextToken } : { entries: out };
172
+ }
173
+ async delete(identity, id) {
174
+ this.ensureOpen('delete');
175
+ await this.client.deleteEvent({
176
+ memoryId: this.memoryId,
177
+ sessionId: this.sessionId(identity),
178
+ eventId: id,
179
+ });
180
+ this.feedbackBag.delete(this.feedbackKey(identity, id));
181
+ }
182
+ async seen(identity, signature) {
183
+ this.ensureOpen('seen');
184
+ return this.signatures.get(this.shadowKey(identity))?.has(signature) ?? false;
185
+ }
186
+ async recordSignature(identity, signature) {
187
+ this.ensureOpen('recordSignature');
188
+ const key = this.shadowKey(identity);
189
+ const set = this.signatures.get(key) ?? new Set();
190
+ set.add(signature);
191
+ this.signatures.set(key, set);
192
+ }
193
+ async feedback(identity, id, usefulness) {
194
+ this.ensureOpen('feedback');
195
+ if (!Number.isFinite(usefulness))
196
+ return;
197
+ const clamped = Math.max(-1, Math.min(1, usefulness));
198
+ const key = this.feedbackKey(identity, id);
199
+ const cur = this.feedbackBag.get(key) ?? { sum: 0, count: 0 };
200
+ this.feedbackBag.set(key, { sum: cur.sum + clamped, count: cur.count + 1 });
201
+ }
202
+ async getFeedback(identity, id) {
203
+ this.ensureOpen('getFeedback');
204
+ const cur = this.feedbackBag.get(this.feedbackKey(identity, id));
205
+ if (!cur || cur.count === 0)
206
+ return null;
207
+ return { average: cur.sum / cur.count, count: cur.count };
208
+ }
209
+ async forget(identity) {
210
+ this.ensureOpen('forget');
211
+ await this.client.deleteSession({
212
+ memoryId: this.memoryId,
213
+ sessionId: this.sessionId(identity),
214
+ });
215
+ // Drop shadow state too — the GDPR contract is "everything for
216
+ // this identity, gone."
217
+ const shadowKey = this.shadowKey(identity);
218
+ this.signatures.delete(shadowKey);
219
+ for (const key of [...this.feedbackBag.keys()]) {
220
+ if (key.startsWith(`${shadowKey}::`))
221
+ this.feedbackBag.delete(key);
222
+ }
223
+ }
224
+ /**
225
+ * Mark the store closed. Subsequent calls throw cleanly. Idempotent.
226
+ * AgentCore is stateless from the client perspective so there's no
227
+ * connection to tear down — the close gate is purely defensive.
228
+ */
229
+ async close() {
230
+ if (this.closed)
231
+ return;
232
+ this.closed = true;
233
+ }
234
+ ensureOpen(op) {
235
+ if (this.closed) {
236
+ throw new Error(`AgentCoreStore.${op}() called after close().`);
237
+ }
238
+ }
239
+ }
240
+ // Helpers
241
+ function parseEntry(raw) {
242
+ try {
243
+ return JSON.parse(raw);
244
+ }
245
+ catch {
246
+ return null;
247
+ }
248
+ }
249
+ /**
250
+ * Build a thin shim over the AWS SDK that conforms to AgentCoreLikeClient.
251
+ *
252
+ * Note on SDK API stability: AgentCore Memory's command names may
253
+ * evolve. The shim depends only on the request/response shapes our
254
+ * adapter needs; if AWS renames commands, only this function needs
255
+ * an update.
256
+ */
257
+ function createAgentCoreClient(region) {
258
+ let mod;
259
+ try {
260
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
261
+ mod = require('@aws-sdk/client-bedrock-agent-runtime');
262
+ }
263
+ catch {
264
+ throw new Error('AgentCoreStore requires the `@aws-sdk/client-bedrock-agent-runtime` peer dependency.\n' +
265
+ ' Install: npm install @aws-sdk/client-bedrock-agent-runtime\n' +
266
+ ' Or pass `_client` for test injection.');
267
+ }
268
+ if (!mod.BedrockAgentRuntimeClient) {
269
+ throw new Error('AgentCoreStore: `@aws-sdk/client-bedrock-agent-runtime` is installed but ' +
270
+ '`BedrockAgentRuntimeClient` was not found. Update the SDK to a version that ' +
271
+ 'exports the AgentCore Memory commands.');
272
+ }
273
+ const sdkClient = new mod.BedrockAgentRuntimeClient({ ...(region && { region }) });
274
+ const dispatch = async (CommandCtor, input) => {
275
+ if (!CommandCtor) {
276
+ throw new Error('AgentCoreStore: this version of `@aws-sdk/client-bedrock-agent-runtime` ' +
277
+ 'does not expose the required Memory command. Upgrade the SDK.');
278
+ }
279
+ const cmd = new CommandCtor(input);
280
+ return await sdkClient.send(cmd);
281
+ };
282
+ return {
283
+ async putEvent(input) {
284
+ await dispatch(mod.PutMemoryEventCommand, input);
285
+ },
286
+ async getEvent(input) {
287
+ const r = (await dispatch(mod.GetMemoryEventCommand, input));
288
+ return r ?? null;
289
+ },
290
+ async listEvents(input) {
291
+ return (await dispatch(mod.ListMemoryEventsCommand, input));
292
+ },
293
+ async deleteEvent(input) {
294
+ await dispatch(mod.DeleteMemoryEventCommand, input);
295
+ },
296
+ async deleteSession(input) {
297
+ await dispatch(mod.DeleteMemorySessionCommand, input);
298
+ },
299
+ };
300
+ }
301
+ //# sourceMappingURL=agentcore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentcore.js","sourceRoot":"","sources":["../../../../src/adapters/memory/agentcore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,283 @@
1
+ /**
2
+ * RedisStore — Redis-backed `MemoryStore` adapter (peer-dep `ioredis`).
3
+ *
4
+ * Subpath import: `agentfootprint/memory-redis`.
5
+ *
6
+ * import { RedisStore } from 'agentfootprint/memory-redis';
7
+ * const store = new RedisStore({ url: 'redis://localhost:6379' });
8
+ *
9
+ * Pattern: Adapter (GoF) — translates the `MemoryStore` interface onto
10
+ * Redis primitives (key/value for entries, set for signatures,
11
+ * hash for feedback aggregates).
12
+ * Role: Outer ring. Lazy-requires `ioredis`; no runtime cost when
13
+ * another adapter is in use.
14
+ * Emits: N/A (storage adapters don't emit; recorders observe the
15
+ * memory pipeline that calls them).
16
+ *
17
+ * Vector search (`search()`) is NOT implemented in this adapter — RedisSearch
18
+ * is a separate Redis module with its own API surface. A `RedisSearchStore`
19
+ * may ship in a future release. RAG users with v2.3 should use
20
+ * `InMemoryStore` until the search-capable adapter lands.
21
+ *
22
+ * Concurrency model:
23
+ * - `put` / `putMany` use simple SET / pipelined SET (last-write-wins).
24
+ * - `putIfVersion` uses a small Lua script for atomic version compare-and-swap.
25
+ * - Multi-writer correctness ⇒ prefer `putIfVersion` in stage code.
26
+ */
27
+ import { identityNamespace } from '../../memory/identity/index.js';
28
+ /**
29
+ * Redis-backed `MemoryStore`. Implements every method except `search()`.
30
+ *
31
+ * @throws when `ioredis` is not installed and no `_client` is supplied.
32
+ */
33
+ export class RedisStore {
34
+ client;
35
+ prefix;
36
+ scanCount;
37
+ ownsClient;
38
+ closed = false;
39
+ constructor(options = {}) {
40
+ this.prefix = options.prefix ?? 'agentfootprint';
41
+ this.scanCount = options.scanCount ?? 100;
42
+ if (options._client) {
43
+ this.client = options._client;
44
+ this.ownsClient = false;
45
+ }
46
+ else if (options.client) {
47
+ this.client = options.client;
48
+ this.ownsClient = false;
49
+ }
50
+ else if (options.url) {
51
+ this.client = createIoredis(options.url);
52
+ this.ownsClient = true;
53
+ }
54
+ else {
55
+ throw new Error('RedisStore requires `url` or `client` (or `_client` for tests).');
56
+ }
57
+ }
58
+ // Key helpers
59
+ nsKey(identity, suffix) {
60
+ return `${this.prefix}:${identityNamespace(identity)}:${suffix}`;
61
+ }
62
+ entryKey(identity, id) {
63
+ return this.nsKey(identity, `e:${id}`);
64
+ }
65
+ indexKey(identity) {
66
+ return this.nsKey(identity, 'idx');
67
+ }
68
+ sigKey(identity) {
69
+ return this.nsKey(identity, 'sig');
70
+ }
71
+ feedbackKey(identity, id) {
72
+ return this.nsKey(identity, `fb:${id}`);
73
+ }
74
+ // MemoryStore implementation
75
+ async get(identity, id) {
76
+ this.ensureOpen('get');
77
+ const raw = await this.client.get(this.entryKey(identity, id));
78
+ if (raw === null)
79
+ return null;
80
+ const entry = parseEntry(raw);
81
+ if (!entry)
82
+ return null;
83
+ if (entry.ttl !== undefined && entry.ttl <= Date.now())
84
+ return null;
85
+ return entry;
86
+ }
87
+ async put(identity, entry) {
88
+ this.ensureOpen('put');
89
+ const payload = JSON.stringify(entry);
90
+ const eKey = this.entryKey(identity, entry.id);
91
+ if (entry.ttl !== undefined) {
92
+ const pxMs = Math.max(0, entry.ttl - Date.now());
93
+ if (pxMs <= 0)
94
+ return;
95
+ await this.client.set(eKey, payload, 'PX', pxMs);
96
+ }
97
+ else {
98
+ await this.client.set(eKey, payload);
99
+ }
100
+ await this.client.sadd(this.indexKey(identity), entry.id);
101
+ }
102
+ async putMany(identity, entries) {
103
+ this.ensureOpen('putMany');
104
+ if (entries.length === 0)
105
+ return;
106
+ const pipeline = this.client.pipeline();
107
+ const ids = [];
108
+ const now = Date.now();
109
+ for (const entry of entries) {
110
+ const payload = JSON.stringify(entry);
111
+ const eKey = this.entryKey(identity, entry.id);
112
+ if (entry.ttl !== undefined) {
113
+ const pxMs = Math.max(0, entry.ttl - now);
114
+ if (pxMs <= 0)
115
+ continue;
116
+ pipeline.set(eKey, payload, 'PX', pxMs);
117
+ }
118
+ else {
119
+ pipeline.set(eKey, payload);
120
+ }
121
+ ids.push(entry.id);
122
+ }
123
+ if (ids.length > 0)
124
+ pipeline.sadd(this.indexKey(identity), ...ids);
125
+ await pipeline.exec();
126
+ }
127
+ /**
128
+ * Optimistic concurrency via a small Lua script — atomic
129
+ * compare-and-swap on the JSON-encoded `version` field.
130
+ */
131
+ async putIfVersion(identity, entry, expectedVersion) {
132
+ this.ensureOpen('putIfVersion');
133
+ const eKey = this.entryKey(identity, entry.id);
134
+ const idxKey = this.indexKey(identity);
135
+ const payload = JSON.stringify(entry);
136
+ const px = entry.ttl !== undefined ? Math.max(0, entry.ttl - Date.now()).toString() : '';
137
+ const result = (await this.client.eval(PUT_IF_VERSION_LUA, 2, eKey, idxKey, String(expectedVersion), payload, entry.id, px));
138
+ const applied = result[0] === 1;
139
+ if (applied)
140
+ return { applied: true };
141
+ return result[1] !== undefined
142
+ ? { applied: false, currentVersion: result[1] }
143
+ : { applied: false };
144
+ }
145
+ async list(identity, options = {}) {
146
+ this.ensureOpen('list');
147
+ const idxKey = this.indexKey(identity);
148
+ const ids = await this.client.smembers(idxKey);
149
+ if (ids.length === 0)
150
+ return { entries: [] };
151
+ const entries = [];
152
+ for (const id of ids) {
153
+ const raw = await this.client.get(this.entryKey(identity, id));
154
+ if (raw === null)
155
+ continue;
156
+ const entry = parseEntry(raw);
157
+ if (!entry)
158
+ continue;
159
+ if (entry.ttl !== undefined && entry.ttl <= Date.now())
160
+ continue;
161
+ if (options.tiers && (!entry.tier || !options.tiers.includes(entry.tier)))
162
+ continue;
163
+ entries.push(entry);
164
+ }
165
+ const start = options.cursor ? parseInt(options.cursor, 10) : 0;
166
+ const limit = options.limit ?? entries.length;
167
+ const page = entries.slice(start, start + limit);
168
+ const next = start + limit;
169
+ return next < entries.length ? { entries: page, cursor: String(next) } : { entries: page };
170
+ }
171
+ async delete(identity, id) {
172
+ this.ensureOpen('delete');
173
+ await this.client.del(this.entryKey(identity, id), this.feedbackKey(identity, id));
174
+ await this.client.srem(this.indexKey(identity), id);
175
+ }
176
+ async seen(identity, signature) {
177
+ this.ensureOpen('seen');
178
+ const result = await this.client.sismember(this.sigKey(identity), signature);
179
+ return result === 1;
180
+ }
181
+ async recordSignature(identity, signature) {
182
+ this.ensureOpen('recordSignature');
183
+ await this.client.sadd(this.sigKey(identity), signature);
184
+ }
185
+ async feedback(identity, id, usefulness) {
186
+ this.ensureOpen('feedback');
187
+ if (!Number.isFinite(usefulness))
188
+ return;
189
+ const clamped = Math.max(-1, Math.min(1, usefulness));
190
+ const fbKey = this.feedbackKey(identity, id);
191
+ await this.client.eval(FEEDBACK_LUA, 1, fbKey, String(clamped));
192
+ }
193
+ async getFeedback(identity, id) {
194
+ this.ensureOpen('getFeedback');
195
+ const fb = await this.client.hgetall(this.feedbackKey(identity, id));
196
+ if (!fb || !fb.count || parseInt(fb.count, 10) === 0)
197
+ return null;
198
+ const count = parseInt(fb.count, 10);
199
+ const sum = parseFloat(fb.sum ?? '0');
200
+ return { average: sum / count, count };
201
+ }
202
+ /**
203
+ * GDPR — drop every key under this identity's namespace.
204
+ */
205
+ async forget(identity) {
206
+ this.ensureOpen('forget');
207
+ const pattern = `${this.prefix}:${identityNamespace(identity)}:*`;
208
+ let cursor = '0';
209
+ do {
210
+ const [next, keys] = await this.client.scan(cursor, 'MATCH', pattern, 'COUNT', this.scanCount);
211
+ cursor = next;
212
+ if (keys.length > 0)
213
+ await this.client.del(...keys);
214
+ } while (cursor !== '0');
215
+ }
216
+ /**
217
+ * Close the underlying Redis connection — only when this adapter
218
+ * owns it. Borrowed clients (passed via `client` option) are left to
219
+ * the caller. Idempotent.
220
+ */
221
+ async close() {
222
+ if (this.closed)
223
+ return;
224
+ this.closed = true;
225
+ if (this.ownsClient)
226
+ await this.client.quit();
227
+ }
228
+ ensureOpen(op) {
229
+ if (this.closed) {
230
+ throw new Error(`RedisStore.${op}() called after close().`);
231
+ }
232
+ }
233
+ }
234
+ // Helpers
235
+ function parseEntry(raw) {
236
+ try {
237
+ return JSON.parse(raw);
238
+ }
239
+ catch {
240
+ return null;
241
+ }
242
+ }
243
+ const PUT_IF_VERSION_LUA = `
244
+ local current = redis.call('GET', KEYS[1])
245
+ local expected = tonumber(ARGV[1])
246
+ if current == false then
247
+ if expected ~= 0 then
248
+ return {0}
249
+ end
250
+ else
251
+ local cur_version = tonumber(string.match(current, '"version":(%d+)'))
252
+ if cur_version ~= expected then
253
+ return {0, cur_version}
254
+ end
255
+ end
256
+ if ARGV[4] ~= '' then
257
+ redis.call('SET', KEYS[1], ARGV[2], 'PX', tonumber(ARGV[4]))
258
+ else
259
+ redis.call('SET', KEYS[1], ARGV[2])
260
+ end
261
+ redis.call('SADD', KEYS[2], ARGV[3])
262
+ return {1}
263
+ `;
264
+ const FEEDBACK_LUA = `
265
+ redis.call('HINCRBYFLOAT', KEYS[1], 'sum', ARGV[1])
266
+ redis.call('HINCRBY', KEYS[1], 'count', 1)
267
+ return 1
268
+ `;
269
+ function createIoredis(url) {
270
+ let mod;
271
+ try {
272
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
273
+ mod = require('ioredis');
274
+ }
275
+ catch {
276
+ throw new Error('RedisStore requires the `ioredis` peer dependency.\n' +
277
+ ' Install: npm install ioredis\n' +
278
+ ' Or pass `_client` for test injection.');
279
+ }
280
+ const Ctor = mod.default ?? mod;
281
+ return new Ctor(url);
282
+ }
283
+ //# sourceMappingURL=redis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.js","sourceRoot":"","sources":["../../../../src/adapters/memory/redis.ts"],"names":[],"mappings":"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"}
package/dist/esm/index.js CHANGED
@@ -79,7 +79,7 @@ export { Loop, LoopBuilder, } from './core-flow/Loop.js';
79
79
  // Adapters — LLM providers
80
80
  // `mock(...)` is the lowercase factory equivalent to `new MockProvider(...)`.
81
81
  // `anthropic(...)` is the real Claude provider via `@anthropic-ai/sdk`.
82
- export { MockProvider, mock } from './adapters/llm/MockProvider.js';
82
+ export { MockProvider, mock, } from './adapters/llm/MockProvider.js';
83
83
  export { anthropic, AnthropicProvider, } from './adapters/llm/AnthropicProvider.js';
84
84
  export { openai, OpenAIProvider, ollama, } from './adapters/llm/OpenAIProvider.js';
85
85
  export { bedrock, BedrockProvider, } from './adapters/llm/BedrockProvider.js';
@@ -127,5 +127,5 @@ export { defineRAG, indexDocuments, } from './lib/rag/index.js';
127
127
  // expose their tools as agentfootprint Tool[] for `agent.tools(...)`.
128
128
  // `@modelcontextprotocol/sdk` is a lazy-required peer-dep (no runtime
129
129
  // cost when MCP isn't used).
130
- export { mcpClient, } from './lib/mcp/index.js';
130
+ export { mcpClient, mockMcpClient, } from './lib/mcp/index.js';
131
131
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}