alma-memory 0.2.0__py3-none-any.whl → 0.3.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,438 @@
1
+ Metadata-Version: 2.4
2
+ Name: alma-memory
3
+ Version: 0.3.0
4
+ Summary: Agent Learning Memory Architecture - Persistent memory for AI agents
5
+ Author-email: RBKunnela <aiagentsprompt@gmail.com>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/RBKunnela/ALMA-memory
8
+ Project-URL: Documentation, https://github.com/RBKunnela/ALMA-memory/tree/main/docs
9
+ Project-URL: Repository, https://github.com/RBKunnela/ALMA-memory
10
+ Project-URL: Issues, https://github.com/RBKunnela/ALMA-memory/issues
11
+ Keywords: ai,agents,memory,learning,llm,azure,claude
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
20
+ Requires-Python: >=3.10
21
+ Description-Content-Type: text/markdown
22
+ Requires-Dist: pyyaml>=6.0
23
+ Requires-Dist: python-dotenv>=1.0.0
24
+ Provides-Extra: local
25
+ Requires-Dist: sentence-transformers>=2.2.0; extra == "local"
26
+ Requires-Dist: faiss-cpu>=1.7.4; extra == "local"
27
+ Provides-Extra: azure
28
+ Requires-Dist: azure-cosmos>=4.5.0; extra == "azure"
29
+ Requires-Dist: azure-identity>=1.15.0; extra == "azure"
30
+ Requires-Dist: azure-keyvault-secrets>=4.7.0; extra == "azure"
31
+ Requires-Dist: openai>=1.0.0; extra == "azure"
32
+ Provides-Extra: mcp
33
+ Requires-Dist: pydantic>=2.0.0; extra == "mcp"
34
+ Requires-Dist: aiohttp>=3.9.0; extra == "mcp"
35
+ Provides-Extra: dev
36
+ Requires-Dist: pytest>=7.0.0; extra == "dev"
37
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
38
+ Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
39
+ Requires-Dist: pytest-benchmark>=4.0.0; extra == "dev"
40
+ Requires-Dist: mypy>=1.0.0; extra == "dev"
41
+ Requires-Dist: ruff>=0.1.0; extra == "dev"
42
+ Provides-Extra: all
43
+ Requires-Dist: alma-memory[azure,dev,local,mcp]; extra == "all"
44
+
45
+ # ALMA - Agent Learning Memory Architecture
46
+
47
+ [![PyPI version](https://badge.fury.io/py/alma-memory.svg)](https://pypi.org/project/alma-memory/)
48
+ [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
49
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
50
+
51
+ > Persistent memory for AI agents that learn and improve over time - without model weight updates.
52
+
53
+ ## What is ALMA?
54
+
55
+ ALMA is a **memory framework** that makes AI agents appear to "learn" by:
56
+ 1. **Storing** outcomes, strategies, and knowledge from past tasks
57
+ 2. **Retrieving** relevant memories before each new task
58
+ 3. **Injecting** that knowledge into prompts
59
+ 4. **Learning** from new outcomes to improve future performance
60
+
61
+ **No fine-tuning. No model changes. Just smarter prompts.**
62
+
63
+ ```
64
+ ┌─────────────────────────────────────────────────────────────────┐
65
+ │ BEFORE TASK: Retrieve relevant memories │
66
+ │ ├── "Last time you tested forms, incremental validation worked"│
67
+ │ ├── "User prefers verbose output" │
68
+ │ └── "Don't use sleep() - causes flaky tests" │
69
+ ├─────────────────────────────────────────────────────────────────┤
70
+ │ DURING TASK: Agent executes with injected knowledge │
71
+ ├─────────────────────────────────────────────────────────────────┤
72
+ │ AFTER TASK: Learn from outcome │
73
+ │ └── Success? → New heuristic. Failure? → Anti-pattern. │
74
+ └─────────────────────────────────────────────────────────────────┘
75
+ ```
76
+
77
+ ## Installation
78
+
79
+ ```bash
80
+ pip install alma-memory
81
+ ```
82
+
83
+ ## Quick Start
84
+
85
+ ```python
86
+ from alma import ALMA
87
+
88
+ # Initialize
89
+ alma = ALMA.from_config(".alma/config.yaml")
90
+
91
+ # Before task: Get relevant memories
92
+ memories = alma.retrieve(
93
+ task="Test the login form validation",
94
+ agent="helena",
95
+ top_k=5
96
+ )
97
+
98
+ # Inject into your prompt
99
+ prompt = f"""
100
+ ## Your Task
101
+ Test the login form validation
102
+
103
+ ## Knowledge from Past Runs
104
+ {memories.to_prompt()}
105
+ """
106
+
107
+ # After task: Learn from outcome
108
+ alma.learn(
109
+ agent="helena",
110
+ task="Test login form",
111
+ outcome="success",
112
+ strategy_used="Tested empty fields, invalid email, valid submission",
113
+ )
114
+ ```
115
+
116
+ ## Features
117
+
118
+ ### Core Memory System
119
+
120
+ | Feature | Description |
121
+ |---------|-------------|
122
+ | **5 Memory Types** | Heuristics, Outcomes, Preferences, Domain Knowledge, Anti-patterns |
123
+ | **Semantic Search** | Vector similarity for relevant memory retrieval |
124
+ | **Scoped Learning** | Agents only learn from their domain (Helena can't learn backend) |
125
+ | **Confidence Decay** | Old memories fade, recent ones stay strong |
126
+ | **Forgetting** | Automatic cleanup of low-value memories |
127
+
128
+ ### Storage Backends
129
+
130
+ | Backend | Use Case | Vector Search |
131
+ |---------|----------|---------------|
132
+ | **SQLite + FAISS** | Local development | Yes |
133
+ | **Azure Cosmos DB** | Production | Yes (native) |
134
+ | **File-based** | Testing/Simple use | No |
135
+
136
+ ### Domain Memory Factory (NEW in v0.3.0)
137
+
138
+ Create ALMA instances for any domain - not just coding:
139
+
140
+ ```python
141
+ from alma.domains import DomainMemoryFactory, get_research_schema
142
+
143
+ # Pre-built schemas
144
+ factory = DomainMemoryFactory()
145
+ alma = factory.create_alma(get_research_schema(), "my-research-project")
146
+
147
+ # Or create custom domains
148
+ schema = factory.create_schema("sales", {
149
+ "entity_types": [
150
+ {"name": "lead", "attributes": ["stage", "value"]},
151
+ {"name": "objection", "attributes": ["type", "response"]},
152
+ ],
153
+ "learning_categories": [
154
+ "objection_handling",
155
+ "closing_techniques",
156
+ "qualification_patterns",
157
+ ],
158
+ })
159
+ ```
160
+
161
+ **Pre-built schemas:** `coding`, `research`, `sales`, `general`, `customer_support`, `content_creation`
162
+
163
+ ### Progress Tracking (NEW in v0.3.0)
164
+
165
+ Track work items and get intelligent next-task suggestions:
166
+
167
+ ```python
168
+ from alma.progress import ProgressTracker
169
+
170
+ tracker = ProgressTracker("my-project")
171
+
172
+ # Create work items
173
+ item = tracker.create_work_item(
174
+ title="Fix authentication bug",
175
+ description="Login fails on mobile devices",
176
+ priority=80,
177
+ agent="Victor",
178
+ )
179
+
180
+ # Update status
181
+ tracker.update_status(item.id, "in_progress")
182
+
183
+ # Get next task (by priority, quick wins, or unblock others)
184
+ next_task = tracker.get_next_item(strategy="priority")
185
+
186
+ # Get progress summary
187
+ summary = tracker.get_progress_summary()
188
+ print(f"Done: {summary.done}/{summary.total} ({summary.completion_percentage}%)")
189
+ ```
190
+
191
+ ### Session Handoff (NEW in v0.3.0)
192
+
193
+ Maintain context across sessions - no more "starting fresh":
194
+
195
+ ```python
196
+ from alma.session import SessionManager
197
+
198
+ manager = SessionManager("my-project")
199
+
200
+ # Start session (loads previous context)
201
+ context = manager.start_session(agent="Helena", goal="Complete auth testing")
202
+
203
+ # Previous session info is available
204
+ if context.previous_handoff:
205
+ print(f"Last action: {context.previous_handoff.last_action}")
206
+ print(f"Blockers: {context.previous_handoff.blockers}")
207
+
208
+ # Track decisions and blockers during work
209
+ manager.update_session("Helena", context.session_id,
210
+ decision="Using OAuth mock for testing",
211
+ blocker="Staging API is down",
212
+ )
213
+
214
+ # End session with handoff for next time
215
+ manager.create_handoff("Helena", context.session_id,
216
+ last_action="completed_oauth_tests",
217
+ last_outcome="success",
218
+ next_steps=["Test refresh tokens", "Add error cases"],
219
+ )
220
+ ```
221
+
222
+ ### MCP Server Integration
223
+
224
+ Expose ALMA to Claude Code or any MCP-compatible client:
225
+
226
+ ```bash
227
+ # Start MCP server
228
+ python -m alma.mcp --config .alma/config.yaml
229
+ ```
230
+
231
+ ```json
232
+ // .mcp.json
233
+ {
234
+ "mcpServers": {
235
+ "alma-memory": {
236
+ "command": "python",
237
+ "args": ["-m", "alma.mcp", "--config", ".alma/config.yaml"]
238
+ }
239
+ }
240
+ }
241
+ ```
242
+
243
+ **Available MCP Tools:**
244
+ - `alma_retrieve` - Get memories for a task
245
+ - `alma_learn` - Record task outcome
246
+ - `alma_add_preference` - Add user preference
247
+ - `alma_add_knowledge` - Add domain knowledge
248
+ - `alma_forget` - Prune stale memories
249
+ - `alma_stats` - Get memory statistics
250
+ - `alma_health` - Health check
251
+
252
+ ## Memory Types
253
+
254
+ | Type | What It Stores | Example |
255
+ |------|----------------|---------|
256
+ | **Heuristic** | Learned strategies | "For forms with >5 fields, test validation incrementally" |
257
+ | **Outcome** | Task results | "Login test succeeded using JWT token strategy" |
258
+ | **Preference** | User constraints | "User prefers verbose test output" |
259
+ | **Domain Knowledge** | Accumulated facts | "Login uses OAuth 2.0 with 24h token expiry" |
260
+ | **Anti-pattern** | What NOT to do | "Don't use sleep() for async waits - causes flaky tests" |
261
+
262
+ ## The Harness Pattern
263
+
264
+ ALMA implements a generalized harness pattern for any tool-using agent:
265
+
266
+ ```
267
+ ┌─────────────────────────────────────────────────────────────────┐
268
+ │ 1. SETTING Fixed environment: tools, constraints │
269
+ ├─────────────────────────────────────────────────────────────────┤
270
+ │ 2. CONTEXT Ephemeral per-run inputs: task, user │
271
+ ├─────────────────────────────────────────────────────────────────┤
272
+ │ 3. AGENT The executor with scoped intelligence │
273
+ ├─────────────────────────────────────────────────────────────────┤
274
+ │ 4. MEMORY SCHEMA Domain-specific learning structure │
275
+ └─────────────────────────────────────────────────────────────────┘
276
+ ```
277
+
278
+ ```python
279
+ from alma import create_harness, Context
280
+
281
+ # Create domain-specific harness
282
+ harness = create_harness("coding", "helena", alma)
283
+
284
+ # Run with automatic memory injection
285
+ result = harness.run(Context(
286
+ task="Test the login form validation",
287
+ project_id="my-app",
288
+ ))
289
+ ```
290
+
291
+ ## Configuration
292
+
293
+ Create `.alma/config.yaml`:
294
+
295
+ ```yaml
296
+ alma:
297
+ project_id: "my-project"
298
+ storage: sqlite # or "azure" for production
299
+
300
+ agents:
301
+ helena:
302
+ domain: coding
303
+ can_learn:
304
+ - testing_strategies
305
+ - selector_patterns
306
+ cannot_learn:
307
+ - backend_logic
308
+ min_occurrences_for_heuristic: 3
309
+
310
+ victor:
311
+ domain: coding
312
+ can_learn:
313
+ - api_patterns
314
+ - database_queries
315
+ cannot_learn:
316
+ - frontend_selectors
317
+ min_occurrences_for_heuristic: 3
318
+ ```
319
+
320
+ ## Architecture
321
+
322
+ ```
323
+ ┌─────────────────────────────────────────────────────────────────┐
324
+ │ ALMA v0.3.0 │
325
+ ├─────────────────────────────────────────────────────────────────┤
326
+ │ HARNESS LAYER │
327
+ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
328
+ │ │ Setting │ │ Context │ │ Agent │ │MemorySchema │ │
329
+ │ └──────────┘ └──────────┘ └──────────┘ └──────────────┘ │
330
+ ├─────────────────────────────────────────────────────────────────┤
331
+ │ NEW IN v0.3.0 │
332
+ │ ┌──────────────┐ ┌────────────────┐ ┌───────────────────┐ │
333
+ │ │ Progress │ │ Session │ │ Domain Memory │ │
334
+ │ │ Tracking │ │ Handoff │ │ Factory │ │
335
+ │ └──────────────┘ └────────────────┘ └───────────────────┘ │
336
+ ├─────────────────────────────────────────────────────────────────┤
337
+ │ CORE LAYER │
338
+ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌──────────┐ │
339
+ │ │ Retrieval │ │ Learning │ │ Caching │ │Forgetting│ │
340
+ │ │ Engine │ │ Protocol │ │ Layer │ │Mechanism │ │
341
+ │ └────────────┘ └────────────┘ └────────────┘ └──────────┘ │
342
+ ├─────────────────────────────────────────────────────────────────┤
343
+ │ STORAGE LAYER │
344
+ │ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ │
345
+ │ │ SQLite + FAISS │ │ Azure Cosmos │ │ File-based │ │
346
+ │ └────────────────┘ └────────────────┘ └────────────────┘ │
347
+ ├─────────────────────────────────────────────────────────────────┤
348
+ │ INTEGRATION LAYER │
349
+ │ ┌────────────────────────────────────────────────────────┐ │
350
+ │ │ MCP Server │ │
351
+ │ └────────────────────────────────────────────────────────┘ │
352
+ └─────────────────────────────────────────────────────────────────┘
353
+ ```
354
+
355
+ ## Development Status
356
+
357
+ | Phase | Description | Status |
358
+ |-------|-------------|--------|
359
+ | 1 | Core Abstractions | ✅ Done |
360
+ | 2 | Local Storage (SQLite + FAISS) | ✅ Done |
361
+ | 3 | Retrieval Engine | ✅ Done |
362
+ | 4 | Learning Protocols | ✅ Done |
363
+ | 5 | Agent Integration | ✅ Done |
364
+ | 6 | Azure Cosmos DB | ✅ Done |
365
+ | 7 | Cache Layer | ✅ Done |
366
+ | 8 | Forgetting Mechanism | ✅ Done |
367
+ | 9 | MCP Server + Testing Suite | ✅ Done |
368
+ | 10 | Progress, Sessions, Domains | ✅ Done |
369
+ | 11 | Initializer Agent Pattern | Planned |
370
+ | 12 | Forward-Looking Confidence | Planned |
371
+
372
+ ## API Reference
373
+
374
+ ### Core
375
+
376
+ ```python
377
+ # Initialize
378
+ alma = ALMA.from_config(".alma/config.yaml")
379
+
380
+ # Retrieve memories
381
+ memories = alma.retrieve(task, agent, top_k=5)
382
+
383
+ # Learn from outcome
384
+ alma.learn(agent, task, outcome, strategy_used, feedback=None)
385
+
386
+ # Add knowledge directly
387
+ alma.add_preference(user_id, category, preference)
388
+ alma.add_domain_knowledge(agent, domain, fact)
389
+
390
+ # Memory hygiene
391
+ alma.forget(agent, older_than_days=90, min_confidence=0.3)
392
+ ```
393
+
394
+ ### Progress Tracking
395
+
396
+ ```python
397
+ from alma.progress import ProgressTracker, WorkItem
398
+
399
+ tracker = ProgressTracker("project-id")
400
+ item = tracker.create_work_item(title, description, priority=50)
401
+ tracker.update_status(item.id, "in_progress") # or "done", "blocked"
402
+ next_item = tracker.get_next_item(strategy="priority")
403
+ summary = tracker.get_progress_summary(agent="helena")
404
+ ```
405
+
406
+ ### Session Management
407
+
408
+ ```python
409
+ from alma.session import SessionManager
410
+
411
+ manager = SessionManager("project-id")
412
+ context = manager.start_session(agent, goal)
413
+ manager.update_session(agent, session_id, decision=..., blocker=...)
414
+ manager.create_handoff(agent, session_id, last_action, outcome, next_steps)
415
+ reload_str = manager.get_quick_reload(agent)
416
+ ```
417
+
418
+ ### Domain Factory
419
+
420
+ ```python
421
+ from alma.domains import DomainMemoryFactory, get_coding_schema
422
+
423
+ factory = DomainMemoryFactory()
424
+ schema = get_coding_schema() # or research, sales, general
425
+ alma = factory.create_alma(schema, "project-id")
426
+ ```
427
+
428
+ ## License
429
+
430
+ MIT
431
+
432
+ ## Contributing
433
+
434
+ Contributions welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
435
+
436
+ ---
437
+
438
+ **Built for AI agents that get better with every task.**
@@ -1,8 +1,12 @@
1
- alma/__init__.py,sha256=QGUJuT7StZvjzNAwInBgXasEEuoEOMmwMQ9fRtTImQk,1504
1
+ alma/__init__.py,sha256=NORUFhIujFb2ZQdft_mM6If48dGv4AAVnCssaWgiyMg,2500
2
2
  alma/core.py,sha256=-lAYOdnNYDz0ziVQFybLNF_2cDbM8-lIw5xvLuiXZKY,9638
3
3
  alma/types.py,sha256=hdBP1dwvYquS7Zej4xb6DM4Bfyx6C2OIFi3vFYo9DMk,6769
4
4
  alma/config/__init__.py,sha256=MQ7zjiIFlUnjeI_Nxn4ig0HAmYeUuS7_FVNjYi8Ik3A,99
5
5
  alma/config/loader.py,sha256=OJPXTSKrBunl6LMvyb-avSOyH1Pr0IpUZIK9UOmB-LE,4884
6
+ alma/domains/__init__.py,sha256=wDvWGshubbbEcUv_7vUdnj_Np5Ovkqp8w9VwFCv_JOs,623
7
+ alma/domains/factory.py,sha256=dYhsqW8K3VmfzP6zwBzfddkDZBuPjoL_K7jdB6SFne0,10843
8
+ alma/domains/schemas.py,sha256=OOvnddjBwJHSH99h0fZ1EFQgkCPyZPPx3Lc4210Rn0U,13040
9
+ alma/domains/types.py,sha256=s4ToTMLPzJRj1u4yfFTkiQhK2bjcF0O17zaUFloBtOk,8999
6
10
  alma/harness/__init__.py,sha256=T25gbnat63HA6QeHY5BiaYxM3BODgQmkcR85DIVjsMc,684
7
11
  alma/harness/base.py,sha256=rvgLHVVKo0INDDQTzqYIzEpoNkSiJ0DG5qE_-K4Cc5A,11223
8
12
  alma/harness/domains.py,sha256=ur6BqClFd7JgH62DQsC5RBJV-IpEbL9uaEHZzZRtyxI,25720
@@ -20,17 +24,23 @@ alma/mcp/__main__.py,sha256=OKNXBY3GBJJKhAjIpGeKYcK02dX_83eOwUXkUXpV54A,3946
20
24
  alma/mcp/resources.py,sha256=tdJoBA55qRcdwXCPyaFJ2hR23oQRqfiNUTzHo-h5qfs,3460
21
25
  alma/mcp/server.py,sha256=4LPs2J53I4fTXVB5P-1mZibce-FVWrPhFWCoUKHy9TM,19043
22
26
  alma/mcp/tools.py,sha256=UEB9NzcjxcpuAiie6sJ_gGdjfP6Ey0ajgp8hZRx3NHE,9452
27
+ alma/progress/__init__.py,sha256=6cdZ4ON__ARzZRfLOOFcIguQ2Z8xie2CwIvUVCJJWhM,371
28
+ alma/progress/tracker.py,sha256=0wKXqwEQePAYD7lc9DcBGhpqjvcQN47W-UT6p85lp00,19137
29
+ alma/progress/types.py,sha256=cVu-dLrrrsTJ4n25rwaQdWMYTEl2Z4JwYZxJhM83Vfs,7088
23
30
  alma/retrieval/__init__.py,sha256=lhfJh7Lfi4d0UYzhgVxKPVCO3959eJwCH0VzK4mgTio,1006
24
31
  alma/retrieval/cache.py,sha256=mJ-hJUaoX1aUlcQjYsrrYQBKb8F3qIJJe46bSQ2RMg4,34645
25
32
  alma/retrieval/embeddings.py,sha256=S7KvogxBNoDP2r5ANwuH0hFdzqsAGXzAqAA8BY0_zMI,6464
26
33
  alma/retrieval/engine.py,sha256=RHkCaBbhYMHA44t8CU1W7dxMuUj1yvZ7p_v52cC23bY,9659
27
34
  alma/retrieval/scoring.py,sha256=VG41Vq1mV0DgLv0cM7m89KLwRNqOWaLboSRNhoC0cy8,10102
35
+ alma/session/__init__.py,sha256=1kKfjacWOd0WBWs3Yv_d_t_CaUTOWeGb0DCoKxRfvp8,352
36
+ alma/session/manager.py,sha256=O6Onh7rnQIr_J5L2IahiuxsH7pi8-G_VmGavp_QEsQs,12637
37
+ alma/session/types.py,sha256=lLcWK64C5-ycItJmvHAHgC6L-y3toTc4kKttp2Fvgic,9464
28
38
  alma/storage/__init__.py,sha256=PtKICN39q2MQ7CuUmFnERQMIfo8Tbpv_Ro61jLLvUvQ,528
29
39
  alma/storage/azure_cosmos.py,sha256=GAeheRabaWXKsXLS66qtl8ALzVk2QM6bw3sgC6ImpSI,32805
30
40
  alma/storage/base.py,sha256=-1Xi3zQFdFgdkIWvqLhNNq9SPdjaIYoagijPMKA3I8M,8960
31
41
  alma/storage/file_based.py,sha256=g-1dkmu68T6ePhyvh40o_u-THqK1WbXtt4xfccChySM,20709
32
- alma/storage/sqlite_local.py,sha256=qovQ_vhq67zsrhZLxMtFaCR-9ZPpuV1EAknxmRouqEA,32820
33
- alma_memory-0.2.0.dist-info/METADATA,sha256=jQQOgv5q1ODVlLdM6lUfdapw4MBAv1HJCmrBR332W0c,12555
34
- alma_memory-0.2.0.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
35
- alma_memory-0.2.0.dist-info/top_level.txt,sha256=5oN68LXctTl8a8i1LA-5WqSaP-pDA-J0x1AfCFfLm4A,5
36
- alma_memory-0.2.0.dist-info/RECORD,,
42
+ alma/storage/sqlite_local.py,sha256=ppqUcXbuiqN6p7tEWu0r1MoMQTCXc-XDYkQe0Tq93ps,36557
43
+ alma_memory-0.3.0.dist-info/METADATA,sha256=t2GYuoFkI6VvHBjrwrhF21GPpxOHD6q8J5daBOQEOoA,17731
44
+ alma_memory-0.3.0.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
45
+ alma_memory-0.3.0.dist-info/top_level.txt,sha256=5oN68LXctTl8a8i1LA-5WqSaP-pDA-J0x1AfCFfLm4A,5
46
+ alma_memory-0.3.0.dist-info/RECORD,,