plug-play-memory 0.2.0__py3-none-any.whl

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.
@@ -0,0 +1,487 @@
1
+ Metadata-Version: 2.4
2
+ Name: plug-play-memory
3
+ Version: 0.2.0
4
+ Summary: Self-hosted, brain-inspired memory + permissions for AI agents. MCP-native. One SQLite file.
5
+ Author: Tathagat
6
+ License: Apache-2.0
7
+ Keywords: mcp,ai-agents,memory,permissions,llm,opa,self-hosted,neuroscience
8
+ Requires-Python: >=3.10
9
+ Description-Content-Type: text/markdown
10
+ License-File: LICENSE
11
+ Requires-Dist: pyyaml>=6.0
12
+ Requires-Dist: mcp<2.0.0,>=1.20.0
13
+ Requires-Dist: sse-starlette<3.0.0
14
+ Provides-Extra: dev
15
+ Requires-Dist: pytest>=8.0.0; extra == "dev"
16
+ Provides-Extra: vector
17
+ Requires-Dist: sqlite-vec>=0.1.9; extra == "vector"
18
+ Provides-Extra: embeddings-local
19
+ Requires-Dist: sentence-transformers>=3.0.0; extra == "embeddings-local"
20
+ Dynamic: license-file
21
+
22
+ # plug-play-memory
23
+
24
+ > Self-hosted, brain-inspired memory + permissions for AI agents. MCP-native. One SQLite file.
25
+
26
+ [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
27
+ [![License: Apache-2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
28
+ [![MCP-compatible](https://img.shields.io/badge/MCP-compatible-green.svg)](https://modelcontextprotocol.io)
29
+ [![Stars](https://img.shields.io/github/stars/tathagat-git/plug-play-memory.svg)](https://github.com/tathagat-git/plug-play-memory/stargazers)
30
+
31
+ Most agent memory systems (Mem0, Zep, Letta) try to extract facts from chat. plug-play-memory agents **emit structured events** about what they did, a **judge decides what's worth saving**, and a **layered policy engine** enforces what they're allowed to do.
32
+
33
+ Your coding agent remembers the bug it fixed last week, not the small talk around it. Your study agent remembers your misconceptions, not every question you asked. Runs on your laptop. Costs $0. No data leaves your machine.
34
+
35
+ ---
36
+
37
+ ## Why this exists
38
+
39
+ Agent memory today has three problems:
40
+
41
+ 1. **Memory is decoupled from permissions.** Mem0/Zep/Letta store facts; Lasso/Pillar enforce security. Nobody does both. So an LLM can self-write malicious facts, or a fine-tuned model can be talked out of prompt-based "permissions."
42
+ 2. **Chat-based extraction is fragile.** Regex on conversation text false-positives on code (`for x in m` looks like a fact). LLM-judge-on-every-message is expensive and noisy.
43
+ 3. **Memory grows forever.** No active forgetting. No consolidation. No concept of "this fact stopped being useful."
44
+
45
+ plug-play-memory fixes all three:
46
+
47
+ | Problem | Fix |
48
+ |---|---|
49
+ | Memory without permissions | **Layered policy engine** with OPA/YAML backends, default-deny, defense-in-depth |
50
+ | Chat-based extraction | **Event-based memory** — agents emit structured events, not raw chat |
51
+ | Infinite memory | **Brain-inspired consolidation** — tag at encode, sleep-consolidate, actively forget unused |
52
+
53
+ ---
54
+
55
+ ## How it works
56
+
57
+ ```
58
+ Agent (any kind: coding, study, financial, support)
59
+ │
60
+ │ emits structured events
61
+ ▼
62
+ ┌─────────────────────────────────────────┐
63
+ │ EventEmitter (SDK) │
64
+ │ - file_edited(path, lines_changed) │
65
+ │ - git_pushed(branch, sha) │
66
+ │ - decision_made(topic, choice) │
67
+ │ - answer_attempted(topic, correct) │
68
+ │ - make_payment(amount, recipient) │
69
+ └────────────────┬────────────────────────┘
70
+ │
71
+ ▼
72
+ ┌─────────────────────────────────────────┐
73
+ │ Judge (no LLM required) │
74
+ │ 1. Rules — deterministic per-action │
75
+ │ 2. Heuristics — regex on raw field │
76
+ │ 3. Salience — 4-factor brain score │
77
+ └────────────────┬────────────────────────┘
78
+ │ should_save, salience, tagged
79
+ ▼
80
+ ┌─────────────────────────────────────────┐
81
+ │ Policy Gate (layered) │
82
+ │ builtin/_base → builtin/{type} │
83
+ │ → custom/{type} → custom/{agent_id} │
84
+ │ Deny rules in _base are absolute │
85
+ └────────────────┬────────────────────────┘
86
+ │ allowed?
87
+ ▼
88
+ ┌─────────────────────────────────────────┐
89
+ │ MemoryStore (one SQLite file) │
90
+ │ + Audit Log (append-only, hash-chain) │
91
+ └─────────────────────────────────────────┘
92
+ │
93
+ │ runs nightly
94
+ ▼
95
+ ┌─────────────────────────────────────────┐
96
+ │ Consolidator (the "sleep" phase) │
97
+ │ - Promote tagged facts that got recalled│
98
+ │ - Decay tagged facts that didn't │
99
+ │ - Forget low-importance facts unused 30d│
100
+ └─────────────────────────────────────────┘
101
+ ```
102
+
103
+ ---
104
+
105
+ ## 30-second quickstart
106
+
107
+ ```bash
108
+ pip install plug-play-memory
109
+
110
+ # Initialize a project
111
+ agentmemory init my-agent --type coding
112
+ cd my-agent
113
+
114
+ # Run the MCP server (for Claude Desktop / Cursor)
115
+ agentmemory serve
116
+ ```
117
+
118
+ Or use it as a Python library:
119
+
120
+ ```python
121
+ from plug_play_memory import (
122
+ MemoryStore, PolicyEngine, EventEmitter, Judge, Consolidator,
123
+ )
124
+
125
+ store = MemoryStore("memory.db")
126
+ policy = PolicyEngine()
127
+ policy.set_agent_type("coder-1", "coding")
128
+ judge = Judge()
129
+ emitter = EventEmitter(store, policy, judge, agent_id="coder-1", agent_type="coding")
130
+
131
+ # Emit structured events — the judge + policy handle the rest
132
+ emitter.decision_made(
133
+ topic="auth",
134
+ choice="use JWT",
135
+ reason="simpler than sessions",
136
+ )
137
+ # → saved to archival, importance=high, salience=0.30
138
+
139
+ emitter.test_run(suite="tests/", passed=10, failed=0)
140
+ # → discarded by judge (passing tests aren't memorable)
141
+
142
+ emitter.test_run(
143
+ suite="tests/auth/", passed=11, failed=1,
144
+ failures=["test_rate_limit: expected 429, got 200"],
145
+ )
146
+ # → saved to archival as error, importance=high
147
+
148
+ # Recall
149
+ results = store.recall_semantic("coder-1", "auth rate limiting", k=3)
150
+ for f in results:
151
+ print(f.value)
152
+ ```
153
+
154
+ ---
155
+
156
+ ## Use with Claude Desktop / Cursor
157
+
158
+ Add to your `claude_desktop_config.json`:
159
+
160
+ ```json
161
+ {
162
+ "mcpServers": {
163
+ "plug-play-memory": {
164
+ "command": "agentmemory",
165
+ "args": [
166
+ "serve",
167
+ "--db", "/absolute/path/to/memory.db",
168
+ "--config", "/absolute/path/to/config.yaml"
169
+ ]
170
+ }
171
+ }
172
+ }
173
+ ```
174
+
175
+ Claude now has these 8 tools:
176
+
177
+ | Tool | What it does |
178
+ |---|---|
179
+ | `remember_event` | Emit a structured event; judge + policy + storage handle it |
180
+ | `recall` | Retrieve memory (core / recall / archival tiers) |
181
+ | `check_permission` | Hard enforcement gate before side-effecting actions |
182
+ | `forget` | Soft-delete a fact (preserves audit trail) |
183
+ | `audit_recent` | Recent audit log entries for this agent |
184
+ | `coverage_manifest` | What's actually been governed (not a safety claim) |
185
+ | `consolidate` | Run sleep + active forgetting sweep |
186
+ | `list_policies` | Show loaded policy layers |
187
+
188
+ ---
189
+
190
+ ## Brain-inspired memory design
191
+
192
+ Seven mechanisms, each mapped to a real biological principle:
193
+
194
+ | Brain mechanism | plug-play-memory equivalent |
195
+ |---|---|
196
+ | Attention filter (thalamus) | EventEmitter only emits meaningful events |
197
+ | Emotional salience (amygdala) | `outcome` field + salience scoring |
198
+ | Prediction error (dopamine) | Salience score boosts on surprising outcomes |
199
+ | Two-stage memory (hippocampus → neocortex) | `recall` tier (fast) → `archival` tier (durable) |
200
+ | Synaptic tagging (STC) | `tagged` flag — fragile until consolidated |
201
+ | Sleep consolidation | Background job promotes reinforced tagged facts |
202
+ | Active forgetting | Decay + prune unused low-importance facts |
203
+ | Spacing effect | `recall_count` strengthens frequently-recalled facts |
204
+
205
+ **Self-tuning:** memories the agent actually uses get stronger. Memories it never recalls fade. No LLM required.
206
+
207
+ ---
208
+
209
+ ## Layered policy system
210
+
211
+ Four built-in packs ship with the package:
212
+
213
+ ```
214
+ policies/builtin/
215
+ ├── _base.yaml # deny-all baseline, defense-in-depth absolute denies
216
+ ├── coding.yaml # coding agent rules (file_edited, git_pushed, deploy, etc.)
217
+ ├── study.yaml # study agent rules (question_asked, answer_attempted, etc.)
218
+ └── financial.yaml # financial agent rules (tiered payment authorization)
219
+ ```
220
+
221
+ Custom overrides live in `policies/custom/` and **extend (not replace)** built-ins:
222
+
223
+ ```yaml
224
+ # policies/custom/study.yaml
225
+ name: study
226
+ default: deny
227
+ rules:
228
+ # Allow a new action
229
+ - action: contact_teacher
230
+ allow: true
231
+ requires: [approved_by_student]
232
+
233
+ # Tighten: students at this school can't sync to external apps
234
+ - action: sync_to_flashcard_app
235
+ allow: false
236
+ ```
237
+
238
+ **Deny rules in `builtin/_base.yaml` are absolute** — custom policies cannot weaken them. This is the safety floor.
239
+
240
+ ### Tiered authorization example
241
+
242
+ The financial pack supports amount-based rules:
243
+
244
+ ```yaml
245
+ - action: make_payment
246
+ allow: true
247
+ requires: [approved_by_user]
248
+ when:
249
+ amount_le: 1000 # up to ₹1000 — just user approval
250
+
251
+ - action: make_payment
252
+ allow: true
253
+ requires: [approved_by_user, second_factor_verified]
254
+ when:
255
+ amount_le: 10000 # up to ₹10,000 — approval + 2FA
256
+
257
+ # Implicit: payments > ₹10,000 always denied by default
258
+ ```
259
+
260
+ ---
261
+
262
+ ## Comparison vs other agent memory systems
263
+
264
+ | | Mem0 | Zep | Letta (MemGPT) | Lasso / Pillar | **plug-play-memory** |
265
+ |---|---|---|---|---|---|
266
+ | Tiered memory | Partial | Yes | Yes | — | ✅ core/recall/archival |
267
+ | Framework-agnostic | Yes | Yes | No (LangChain) | — | ✅ MCP-native |
268
+ | Hard-enforced permissions | — | — | — | Yes (separate product) | ✅ built-in |
269
+ | Audit + coverage manifest | — | — | — | Partial | ✅ append-only, HMAC-signed |
270
+ | Self-hosted, zero infra | Depends | No (Postgres) | No (Docker) | Cloud + on-prem | ✅ one SQLite file |
271
+ | Brain-inspired consolidation | — | — | — | — | ✅ tagging + sleep + forgetting |
272
+ | Event-based capture | — | — | — | — | ✅ structured events, not chat |
273
+ | Default-deny, fail-closed | — | — | — | Partial | ✅ defense-in-depth + whitelist |
274
+ | **Cost** | Free + paid cloud | Free + paid cloud | Free + paid | Free tier + paid | **Free, runs on laptop** |
275
+
276
+ The differentiation isn't "better memory" — Letta's memory tiering is more mature. It's **memory and permissions treated as one governed system, brain-inspired consolidation, and event-based capture instead of chat extraction.**
277
+
278
+ ---
279
+
280
+ ## CLI reference
281
+
282
+ ```bash
283
+ # Initialize a project with a specific agent type
284
+ agentmemory init my-tutor --type study
285
+ agentmemory init my-coder --type coding
286
+ agentmemory init my-finance --type financial
287
+
288
+ # Run the MCP server (stdio transport)
289
+ agentmemory serve --db memory.db --config config.yaml
290
+
291
+ # Policy management
292
+ agentmemory policy list # show loaded layers
293
+ agentmemory policy show --agent-id priya --agent-type study
294
+ agentmemory policy customize study # scaffold custom override
295
+ agentmemory policy validate # validate YAML syntax
296
+
297
+ # Health check
298
+ agentmemory doctor
299
+ ```
300
+
301
+ ---
302
+
303
+ ## MCP server tools (full reference)
304
+
305
+ ### `remember_event(action, inputs, outputs, outcome, raw)`
306
+
307
+ Emit a structured event. The judge decides whether to save it.
308
+
309
+ ```python
310
+ # Examples
311
+ remember_event(
312
+ action="decision_made",
313
+ inputs={"topic": "auth"},
314
+ outputs={"choice": "JWT", "reason": "simpler"},
315
+ outcome="success",
316
+ )
317
+ ```
318
+
319
+ ### `recall(query, tier, limit)`
320
+
321
+ Retrieve memory. Returns core memory plus tier-specific results.
322
+
323
+ ```python
324
+ recall(query="auth rate limiting", tier="archival", limit=5)
325
+ recall(tier="core") # just always-injected facts
326
+ recall(tier="recall", limit=20) # recent context
327
+ ```
328
+
329
+ ### `check_permission(action, context)`
330
+
331
+ Hard enforcement gate. **Always call this before any side-effecting action.**
332
+
333
+ ```python
334
+ check_permission(action="make_payment",
335
+ context={"approved_by_user": True, "amount": 1000})
336
+ # → {allowed: True, reason: "matched rule in builtin:financial", ...}
337
+
338
+ check_permission(action="access_credentials")
339
+ # → {allowed: False, reason: "absolute deny in builtin:_base", ...}
340
+ ```
341
+
342
+ ### `forget(fact_id, hard=False)`
343
+
344
+ Soft-delete by default (preserves audit trail). Hard delete requires admin scope.
345
+
346
+ ### `audit_recent(limit)` / `coverage_manifest()`
347
+
348
+ Compliance and debugging tools.
349
+
350
+ ### `consolidate()`
351
+
352
+ Run the brain's "sleep" phase: promote reinforced tagged facts, decay the rest, prune unused.
353
+
354
+ ### `list_policies()`
355
+
356
+ Show which policy layers are loaded for the current agent.
357
+
358
+ ---
359
+
360
+ ## Security design
361
+
362
+ **`agent_id` is NEVER a tool parameter.** It comes from `AuthContext` at connection time, established from:
363
+ - Environment variables (`AGENTMEMORY_AGENT_ID`, `AGENTMEMORY_AGENT_TYPE`) for local stdio
364
+ - Auth config file with token → agent_id mapping for multi-tenant
365
+ - (Future) Bearer token from HTTP headers for remote MCP
366
+
367
+ A prompt-injected LLM **cannot** call `remember_event(agent_id="admin", ...)` because there is no `agent_id` parameter. The agent identity is established once at connection time and used for every subsequent call.
368
+
369
+ ### Audit log integrity
370
+
371
+ - **Append-only** enforced by SQLite triggers (`UPDATE` and `DELETE` both fail)
372
+ - **Hash-chained** — each entry references the previous entry's hash (tamper-evident)
373
+ - Every operation logged: `remember`, `recall`, `forget`, `permission_check`, `consolidation`, `active_forgetting`
374
+
375
+ ### Coverage manifest (not a safety claim)
376
+
377
+ `coverage_manifest()` reports **what was actually checked**, not a safety score:
378
+
379
+ ```json
380
+ {
381
+ "agent_id": "coder-1",
382
+ "actions_checked": ["write_memory", "read_memory", "access_credentials"],
383
+ "counts_by_action": {
384
+ "write_memory": {"allowed": 7, "denied": 0},
385
+ "access_credentials": {"allowed": 0, "denied": 1}
386
+ },
387
+ "total_permission_checks": 8,
388
+ "note": "Reflects only actions actually attempted — not a safety claim."
389
+ }
390
+ ```
391
+
392
+ ---
393
+
394
+ ## Self-hosted by design
395
+
396
+ Your agent's memory stays on your machine in v0.1's default configuration.
397
+
398
+ - One portable SQLite file. Back up with `cp memory.db backup.db`.
399
+ - No external database server required.
400
+ - No cloud dependency for the core system.
401
+ - **For production / regulated industries:** enable encryption at rest with `--encryption-key` (SQLCipher) and audit log signing with `--audit-key` (HMAC). See [Security](#security) below.
402
+ - Optional: cloud LLM for richer summaries (you provide your own API key, we never see it). When this lands in v0.2, only the `raw` field of events you explicitly send will be processed — core storage never leaves your machine.
403
+
404
+ **Honest scope of v0.1:** the default config is "trust the local user" — fine for OSS dev. For enterprise/regulated deployment, you must enable encryption + audit signing + use the multi-tenant token config. See `SECURITY_AUDIT_v0.1.md` for what was fixed and what's still on the roadmap.
405
+
406
+ ---
407
+
408
+ ## Roadmap
409
+
410
+ ### v0.1 (current)
411
+ - ✅ Three-tier memory (core/recall/archival)
412
+ - ✅ Layered policy engine with 4 built-in packs
413
+ - ✅ Rules + heuristics + salience judge (no LLM required)
414
+ - ✅ Brain-inspired consolidation (tagging, sleep, active forgetting)
415
+ - ✅ Append-only hash-chained audit log
416
+ - ✅ MCP server with 8 tools
417
+ - ✅ CLI with init/serve/policy/doctor commands
418
+
419
+ ### v0.2 (next)
420
+ - 🔲 Optional Ollama integration for richer summaries
421
+ - 🔲 Real sqlite-vec semantic search (currently keyword-based for zero-dependency)
422
+ - 🔲 OPA/Rego backend (currently YAML-only)
423
+ - 🔲 HTTP transport for remote MCP (currently stdio-only)
424
+ - 🔲 Web dashboard for audit log + coverage manifest
425
+
426
+ ### v0.3
427
+ - 🔲 LangGraph integration (auto-emit on state transitions)
428
+ - 🔲 CrewAI integration
429
+ - 🔲 Aider-style coding agent example
430
+ - 🔲 Benchmark suite vs Mem0/Zep/Letta
431
+
432
+ ### v1.0
433
+ - 🔲 Enterprise tier: signed policy packs, SIEM integration, SSO
434
+ - 🔲 Multi-region sync for self-hosted enterprise
435
+ - 🔲 Policy marketplace (curated, audited policy bundles)
436
+
437
+ ---
438
+
439
+ ## Limitations (honest)
440
+
441
+ - **Embeddings:** v1 uses BLAKE2b hashing as a dependency-free placeholder embedder. Swap in a real embedder via `MemoryStore(embed_fn=...)` for genuine semantic recall.
442
+ - **Vector search:** v1 uses keyword matching for archival recall. sqlite-vec integration is on the v0.2 roadmap.
443
+ - **Judge:** Rules + heuristics handle ~90% of cases correctly. The 10% it misses are saved with a `tagged` flag for review during consolidation. Optional LLM enrichment coming in v0.2.
444
+ - **Passive capture:** v1 requires explicit event emission (no automatic capture from chat). This is by design — automatic capture introduces cost and prompt-injection surface.
445
+ - **TTL:** `ttl_seconds` is stored per-fact but not yet actively swept. Active forgetting handles the equivalent cleanup.
446
+
447
+ ---
448
+
449
+ ## Contributing
450
+
451
+ PRs welcome. Especially valuable:
452
+
453
+ - More built-in policy packs (legal, healthcare, devops, customer-support)
454
+ - Integration examples (LangGraph, CrewAI, AutoGen, Aider)
455
+ - Benchmarks against Mem0/Zep/Letta
456
+ - Bug reports + reproducible test cases
457
+
458
+ See `tests/` for the existing test suite (26 unit tests + 3-agent end-to-end demo + MCP server test).
459
+
460
+ ---
461
+
462
+ ## License
463
+
464
+ Apache-2.0. Use it commercially, fork it, sell it. Just don't blame us if your agent remembers things you didn't want it to.
465
+
466
+ ---
467
+
468
+ ## Author
469
+
470
+ **Tathagat** — AI/ML engineer building systems end-to-end.
471
+
472
+ - GitHub: [@tathagat-git](https://github.com/tathagat-git)
473
+ - Twitter: [@tathagat_](https://twitter.com/tathagat_)
474
+ - LinkedIn: [tathagat-tathagat3460](https://linkedin.com/in/tathagat-tathagat3460)
475
+ - Portfolio: [tathagat-git.github.io](https://tathagat-git.github.io/)
476
+
477
+ Built while studying how the brain decides what to remember. The neuroscience parallels are real; the implementation is pragmatic Python.
478
+
479
+ ---
480
+
481
+ ## Star history
482
+
483
+ [![Star History Chart](https://api.star-history.com/svg?repos=tathagat-git/plug-play-memory&type=Date)](https://star-history.com/#tathagat-git/plug-play-memory&Date)
484
+
485
+ ---
486
+
487
+ **If this project saves you time, [star the repo](https://github.com/tathagat-git/plug-play-memory).** It's the only metric that tells me to keep building.
@@ -0,0 +1,21 @@
1
+ plug_play_memory/__init__.py,sha256=tCG8I1_8oVHpNnT8G8pjb2sVx9mtYunRm2VM1Cwf0ro,808
2
+ plug_play_memory/audit.py,sha256=UhCICFWU-3QJb_PWPS-KCM7iyH609SooNkj5XO43E-o,7366
3
+ plug_play_memory/auth.py,sha256=o2z33Fg7-5TJ53qy9tSgUgSwuA0gam-y2qU7HBto4CA,5401
4
+ plug_play_memory/cli.py,sha256=RyA8lC_E4aLTPY3653vkJ_k1HfH1Do8e1JnZFghvOGg,14228
5
+ plug_play_memory/consolidation.py,sha256=gcJd6jbVNKKIVu6zxp9auiakAlvUJfwssVEMf4s4OqQ,7355
6
+ plug_play_memory/emitter.py,sha256=T9KyGWaMZnumwhFaAFI65-qC7h0iLt2lu9cHODU3-aA,12064
7
+ plug_play_memory/events.py,sha256=a1cj_J_0eacHMpRyTQoqbVFG--N4SQWAMOly4INuAwM,1228
8
+ plug_play_memory/judge.py,sha256=fosWCYSclZhZIIr3YplBUzCw8ZcpHM1uXDt62ACLKMY,18083
9
+ plug_play_memory/policy.py,sha256=bNW0sPaZsP1nRtQ7uyDev761UMkt9WWKyp_dJ5Hq_YI,13731
10
+ plug_play_memory/server.py,sha256=RUaB-E7qOSZzBHd5LkRuS4rGxZr9QCEz6TyPx5seVWA,14629
11
+ plug_play_memory/storage.py,sha256=9cn_kuQJEtJyDA63DpfPxV-HQUZys962R2x89cjSzEc,19234
12
+ plug_play_memory/policies/builtin/_base.yaml,sha256=DbU1_98EmgdQ5Mr7_qrOzz4yQILoPzB43u0fF0L1T4M,506
13
+ plug_play_memory/policies/builtin/coding.yaml,sha256=u_GgZghg63xUliAzGgfLbO1joDe6MH7XVxz8pMxPhfw,1161
14
+ plug_play_memory/policies/builtin/financial.yaml,sha256=eiBsgT8UvxbkJwZVHAOaz4wzeLEKnT1fEuN80SQBEps,1268
15
+ plug_play_memory/policies/builtin/study.yaml,sha256=fQcUe_dZ9yFTtVhvUEKM12jAfHeM4qFW5KEKolWb8Co,1211
16
+ plug_play_memory-0.2.0.dist-info/licenses/LICENSE,sha256=lKstJzcWmAURvn110gnFmhPVzy0DjN1Kco3C_1B8dYg,11338
17
+ plug_play_memory-0.2.0.dist-info/METADATA,sha256=OspflzOxfYfLacGHSHzhZUv7mZ0zdAWQrVUlGqocVmE,18703
18
+ plug_play_memory-0.2.0.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
19
+ plug_play_memory-0.2.0.dist-info/entry_points.txt,sha256=c7irK8x0tXtfuPwOdiAhknLOEgoZksqUMavW8Q8gNQI,58
20
+ plug_play_memory-0.2.0.dist-info/top_level.txt,sha256=4axUgKOCGOo_NNw9MzFB4cAoTikaWSQFqzq9viEZjMg,17
21
+ plug_play_memory-0.2.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.2.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ agentmemory = plug_play_memory.cli:main