memini-ai-dev 0.2.0__tar.gz

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 (93) hide show
  1. memini_ai_dev-0.2.0/.github/workflows/ci.yml +38 -0
  2. memini_ai_dev-0.2.0/.github/workflows/workflow.yml +51 -0
  3. memini_ai_dev-0.2.0/.gitignore +14 -0
  4. memini_ai_dev-0.2.0/.python-version +1 -0
  5. memini_ai_dev-0.2.0/CHANGELOG.md +29 -0
  6. memini_ai_dev-0.2.0/PKG-INFO +370 -0
  7. memini_ai_dev-0.2.0/README.md +333 -0
  8. memini_ai_dev-0.2.0/docs/memory_report.agent.final.converted.md +856 -0
  9. memini_ai_dev-0.2.0/docs/memory_report.agent.final.md +856 -0
  10. memini_ai_dev-0.2.0/docs/memory_report.agent.outline.md +126 -0
  11. memini_ai_dev-0.2.0/docs/memory_report_sec00.md +17 -0
  12. memini_ai_dev-0.2.0/docs/memory_report_sec01.md +68 -0
  13. memini_ai_dev-0.2.0/docs/memory_report_sec02.md +125 -0
  14. memini_ai_dev-0.2.0/docs/memory_report_sec03.md +243 -0
  15. memini_ai_dev-0.2.0/docs/memory_report_sec04.md +109 -0
  16. memini_ai_dev-0.2.0/docs/memory_report_sec05.md +84 -0
  17. memini_ai_dev-0.2.0/docs/memory_report_sec06.md +162 -0
  18. memini_ai_dev-0.2.0/docs/pgvector_migration.md +583 -0
  19. memini_ai_dev-0.2.0/docs/reality_check.md +209 -0
  20. memini_ai_dev-0.2.0/docs/research/memory_providers_cross_verification.md +23 -0
  21. memini_ai_dev-0.2.0/docs/research/memory_providers_dim01.md +73 -0
  22. memini_ai_dev-0.2.0/docs/research/memory_providers_dim02.md +109 -0
  23. memini_ai_dev-0.2.0/docs/research/memory_providers_dim03.md +97 -0
  24. memini_ai_dev-0.2.0/docs/research/memory_providers_dim04.md +68 -0
  25. memini_ai_dev-0.2.0/docs/research/memory_providers_insight.md +94 -0
  26. memini_ai_dev-0.2.0/main.py +12 -0
  27. memini_ai_dev-0.2.0/pyproject.toml +95 -0
  28. memini_ai_dev-0.2.0/scripts/migrate_qdrant_to_pgvector.py +198 -0
  29. memini_ai_dev-0.2.0/src/memini_ai/__init__.py +3 -0
  30. memini_ai_dev-0.2.0/src/memini_ai/config.py +394 -0
  31. memini_ai_dev-0.2.0/src/memini_ai/decay.py +811 -0
  32. memini_ai_dev-0.2.0/src/memini_ai/dialectic.py +1103 -0
  33. memini_ai_dev-0.2.0/src/memini_ai/entity_extractor.py +439 -0
  34. memini_ai_dev-0.2.0/src/memini_ai/extractor.py +281 -0
  35. memini_ai_dev-0.2.0/src/memini_ai/graph.py +323 -0
  36. memini_ai_dev-0.2.0/src/memini_ai/indexer/__init__.py +47 -0
  37. memini_ai_dev-0.2.0/src/memini_ai/indexer/chunker.py +460 -0
  38. memini_ai_dev-0.2.0/src/memini_ai/indexer/constants.py +186 -0
  39. memini_ai_dev-0.2.0/src/memini_ai/indexer/file_tracker.py +211 -0
  40. memini_ai_dev-0.2.0/src/memini_ai/indexer/indexer.py +402 -0
  41. memini_ai_dev-0.2.0/src/memini_ai/indexer/pause_controller.py +89 -0
  42. memini_ai_dev-0.2.0/src/memini_ai/indexer/snapshot.py +192 -0
  43. memini_ai_dev-0.2.0/src/memini_ai/indexer/watcher.py +217 -0
  44. memini_ai_dev-0.2.0/src/memini_ai/knowledge_graph.py +1355 -0
  45. memini_ai_dev-0.2.0/src/memini_ai/main.py +52 -0
  46. memini_ai_dev-0.2.0/src/memini_ai/memory/__init__.py +32 -0
  47. memini_ai_dev-0.2.0/src/memini_ai/memory/database.py +1095 -0
  48. memini_ai_dev-0.2.0/src/memini_ai/memory/schema.py +305 -0
  49. memini_ai_dev-0.2.0/src/memini_ai/memory/search.py +486 -0
  50. memini_ai_dev-0.2.0/src/memini_ai/memory/system.py +530 -0
  51. memini_ai_dev-0.2.0/src/memini_ai/model/__init__.py +15 -0
  52. memini_ai_dev-0.2.0/src/memini_ai/model/embeddings.py +106 -0
  53. memini_ai_dev-0.2.0/src/memini_ai/model/manager.py +199 -0
  54. memini_ai_dev-0.2.0/src/memini_ai/multi_peer.py +861 -0
  55. memini_ai_dev-0.2.0/src/memini_ai/postgres/__init__.py +5 -0
  56. memini_ai_dev-0.2.0/src/memini_ai/postgres/database.py +593 -0
  57. memini_ai_dev-0.2.0/src/memini_ai/postgres/queries.py +256 -0
  58. memini_ai_dev-0.2.0/src/memini_ai/postgres/schema.py +288 -0
  59. memini_ai_dev-0.2.0/src/memini_ai/precompress.py +135 -0
  60. memini_ai_dev-0.2.0/src/memini_ai/server.py +2383 -0
  61. memini_ai_dev-0.2.0/src/memini_ai/tiered_loader.py +557 -0
  62. memini_ai_dev-0.2.0/src/memini_ai/trust_engine.py +299 -0
  63. memini_ai_dev-0.2.0/src/memini_ai/user_model.py +543 -0
  64. memini_ai_dev-0.2.0/src/memini_ai/utils/__init__.py +6 -0
  65. memini_ai_dev-0.2.0/src/memini_ai/utils/hash.py +43 -0
  66. memini_ai_dev-0.2.0/src/memini_ai/utils/logger.py +50 -0
  67. memini_ai_dev-0.2.0/tests/__init__.py +1 -0
  68. memini_ai_dev-0.2.0/tests/conftest.py +44 -0
  69. memini_ai_dev-0.2.0/tests/integration/__init__.py +1 -0
  70. memini_ai_dev-0.2.0/tests/integration/test_integration.py +467 -0
  71. memini_ai_dev-0.2.0/tests/test_chunker.py +260 -0
  72. memini_ai_dev-0.2.0/tests/test_config.py +279 -0
  73. memini_ai_dev-0.2.0/tests/test_database.py +411 -0
  74. memini_ai_dev-0.2.0/tests/test_decay.py +769 -0
  75. memini_ai_dev-0.2.0/tests/test_dialectic.py +572 -0
  76. memini_ai_dev-0.2.0/tests/test_embeddings.py +219 -0
  77. memini_ai_dev-0.2.0/tests/test_entity_extractor.py +265 -0
  78. memini_ai_dev-0.2.0/tests/test_extractor.py +522 -0
  79. memini_ai_dev-0.2.0/tests/test_graph.py +823 -0
  80. memini_ai_dev-0.2.0/tests/test_hash.py +115 -0
  81. memini_ai_dev-0.2.0/tests/test_indexer.py +435 -0
  82. memini_ai_dev-0.2.0/tests/test_knowledge_graph.py +514 -0
  83. memini_ai_dev-0.2.0/tests/test_multi_peer.py +780 -0
  84. memini_ai_dev-0.2.0/tests/test_postgres_database.py +743 -0
  85. memini_ai_dev-0.2.0/tests/test_precompress.py +442 -0
  86. memini_ai_dev-0.2.0/tests/test_schema.py +246 -0
  87. memini_ai_dev-0.2.0/tests/test_search.py +375 -0
  88. memini_ai_dev-0.2.0/tests/test_server.py +219 -0
  89. memini_ai_dev-0.2.0/tests/test_system.py +504 -0
  90. memini_ai_dev-0.2.0/tests/test_tiered_loader.py +1207 -0
  91. memini_ai_dev-0.2.0/tests/test_trust_engine.py +725 -0
  92. memini_ai_dev-0.2.0/tests/test_user_model.py +878 -0
  93. memini_ai_dev-0.2.0/uv.lock +3056 -0
@@ -0,0 +1,38 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ ci:
11
+ runs-on: ubuntu-latest
12
+
13
+ steps:
14
+ - name: Checkout code
15
+ uses: actions/checkout@v4
16
+
17
+ - name: Set up Python 3.13
18
+ uses: actions/setup-python@v5
19
+ with:
20
+ python-version: "3.13"
21
+
22
+ - name: Install uv
23
+ uses: astral-sh/setup-uv@v5
24
+
25
+ - name: Sync dependencies (including dev)
26
+ run: uv sync --extra dev
27
+
28
+ - name: Check code formatting
29
+ run: uvx ruff format --check .
30
+
31
+ - name: Lint code
32
+ run: uvx ruff check .
33
+
34
+ - name: Run tests
35
+ run: uv run pytest
36
+
37
+ - name: Build package
38
+ run: uv build
@@ -0,0 +1,51 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*.*.*"
7
+
8
+ jobs:
9
+ release:
10
+ runs-on: ubuntu-latest
11
+ environment: pypi
12
+ permissions:
13
+ contents: write
14
+ id-token: write
15
+
16
+ steps:
17
+ - name: Checkout code
18
+ uses: actions/checkout@v4
19
+ with:
20
+ ref: ${{ github.ref }}
21
+
22
+ - name: Set up Python 3.13
23
+ uses: actions/setup-python@v5
24
+ with:
25
+ python-version: "3.13"
26
+
27
+ - name: Install uv
28
+ uses: astral-sh/setup-uv@v5
29
+
30
+ - name: Sync dependencies
31
+ run: uv sync
32
+
33
+ - name: Build package
34
+ run: uv build
35
+
36
+ - name: Extract tag name
37
+ id: extract_tag
38
+ run: echo "tag_name=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
39
+
40
+ - name: Create GitHub Release
41
+ uses: softprops/action-gh-release@v2
42
+ with:
43
+ tag_name: ${{ steps.extract_tag.outputs.tag_name }}
44
+ name: ${{ steps.extract_tag.outputs.tag_name }}
45
+ generate_release_notes: true
46
+ files: dist/*
47
+ env:
48
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
49
+
50
+ - name: Publish to PyPI
51
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,14 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ .venv
11
+ TASKS.md
12
+ PHASE*_PLAN.md
13
+ CONTEXT.md
14
+ HANDOFF.md
@@ -0,0 +1 @@
1
+ 3.13
@@ -0,0 +1,29 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.2.0] - 2026-05-18
9
+
10
+ ### Features
11
+
12
+ - pgvector/pgvectorscale backend with StreamingDiskANN index
13
+ - VectorDatabase ABC for database abstraction
14
+ - PostgresDatabase class with asyncpg support
15
+ - New `postgres/` module with schema and queries
16
+ - Migration script: `scripts/migrate_qdrant_to_pgvector.py`
17
+ - New config options: `MEMINI_DB_URL`, `db_pool_size`, `db_min_size`, `db_max_size`
18
+
19
+ ### Tests
20
+
21
+ - 38 new tests for PostgresDatabase
22
+
23
+ ### Bug Fixes
24
+
25
+ - N/A
26
+
27
+ ### Breaking Changes
28
+
29
+ - None (backward compatible with Qdrant)
@@ -0,0 +1,370 @@
1
+ Metadata-Version: 2.4
2
+ Name: memini-ai-dev
3
+ Version: 0.2.0
4
+ Summary: Local-first semantic memory server with vector search
5
+ Project-URL: Homepage, https://github.com/Veedubin/memini-ai-dev
6
+ Project-URL: Repository, https://github.com/Veedubin/memini-ai-dev
7
+ Author: VeeDubin
8
+ License: MIT
9
+ Keywords: mcp,memory,qdrant,semantic-search,vector-search
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Requires-Python: >=3.11
18
+ Requires-Dist: asyncpg>=0.29.0
19
+ Requires-Dist: fastmcp>=2.0
20
+ Requires-Dist: httpx>=0.27
21
+ Requires-Dist: pydantic-settings>=2.0
22
+ Requires-Dist: pydantic>=2.0
23
+ Requires-Dist: qdrant-client>=1.12
24
+ Requires-Dist: rank-bm25>=0.2
25
+ Requires-Dist: sentence-transformers>=3.0
26
+ Requires-Dist: structlog>=24.0
27
+ Requires-Dist: tenacity>=8.0
28
+ Requires-Dist: torch>=2.0
29
+ Requires-Dist: watchdog>=4.0
30
+ Provides-Extra: dev
31
+ Requires-Dist: mypy>=1.10; extra == 'dev'
32
+ Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
33
+ Requires-Dist: pytest-cov>=5.0; extra == 'dev'
34
+ Requires-Dist: pytest>=8.0; extra == 'dev'
35
+ Requires-Dist: ruff>=0.6; extra == 'dev'
36
+ Description-Content-Type: text/markdown
37
+
38
+ # Memini-ai v3.0
39
+
40
+ > "I remember" in Latin (pronounced *meh-mee-nee*)
41
+
42
+ Local-first semantic memory server with vector search, MCP-compatible.
43
+
44
+ ## Overview
45
+
46
+ Memini-ai is a Python rewrite of [Super-Memory-TS](https://github.com/veedubin/super-memory-ts), designed as a local-first semantic memory server with vector search capabilities. It provides persistent memory storage and retrieval using Qdrant as the backend vector database.
47
+
48
+ ### Key Features
49
+
50
+ - **MCP-Compatible**: Works with any MCP-compatible client (OpenCode, Claude Desktop, etc.)
51
+ - **Vector Search**: BGE-Large embeddings (1024-dim) with MiniLM fallback (384-dim)
52
+ - **Hybrid Search**: Combines vector similarity with BM25 text search
53
+ - **Project Isolation**: Memories are isolated by project ID
54
+ - **File Indexing**: Index and search project files with semantic chunking
55
+ - **Graceful Degradation**: Works without Qdrant (returns errors for memory operations)
56
+ - **CPU-First**: Designed to run on CPU, optional GPU acceleration
57
+
58
+ ## Installation
59
+
60
+ ### Prerequisites
61
+
62
+ - Python 3.11+
63
+ - [Qdrant](https://qdrant.tech/documentation/guides/installation/) running locally or remotely
64
+
65
+ ### Quick Start
66
+
67
+ ```bash
68
+ # Install memini-ai
69
+ pip install memini-ai
70
+
71
+ # Start Qdrant (if not running)
72
+ docker run -d --name qdrant -p 6333:6333 qdrant/qdrant
73
+
74
+ # Run the server
75
+ memini-ai --stdio
76
+ ```
77
+
78
+ ### Development Installation
79
+
80
+ ```bash
81
+ # Clone the repository
82
+ git clone https://github.com/veedubin/memini-ai.git
83
+ cd memini-ai
84
+
85
+ # Create virtual environment
86
+ python -m venv .venv
87
+ source .venv/bin/activate # Linux/Mac
88
+ # or: .venv\Scripts\activate # Windows
89
+
90
+ # Install with dev dependencies
91
+ pip install -e ".[dev]"
92
+ ```
93
+
94
+ ## Configuration
95
+
96
+ Memini-ai can be configured via environment variables or a JSON config file.
97
+
98
+ ### Environment Variables
99
+
100
+ | Variable | Default | Description |
101
+ |----------|---------|-------------|
102
+ | `MEMINI_QDRANT_URL` | `http://localhost:6333` | Qdrant server URL |
103
+ | `MEMINI_PROJECT_ID` | auto-generated | Project identifier for isolation |
104
+ | `MEMINI_EMBEDDING_DIM` | `1024` | Embedding dimension (1024 or 384) |
105
+ | `MEMINI_CHUNK_SIZE` | `512` | Chunk size for file indexing |
106
+ | `MEMINI_CHUNK_OVERLAP` | `64` | Overlap between chunks |
107
+ | `MEMINI_BATCH_SIZE` | `32` | Batch size for embedding generation |
108
+ | `MEMINI_WORKERS` | `4` | Number of worker threads |
109
+ | `MEMINI_LOG_LEVEL` | `INFO` | Logging level |
110
+ | `MEMINI_CONFIG_PATH` | None | Path to JSON config file |
111
+
112
+ ### JSON Config File
113
+
114
+ ```json
115
+ {
116
+ "qdrant": {
117
+ "url": "http://localhost:6333"
118
+ },
119
+ "model": {
120
+ "embedding_dim": 1024
121
+ },
122
+ "indexer": {
123
+ "chunk_size": 512,
124
+ "chunk_overlap": 64
125
+ },
126
+ "logging": {
127
+ "level": "INFO"
128
+ }
129
+ }
130
+ ```
131
+
132
+ ## Usage
133
+
134
+ ### MCP Tools
135
+
136
+ Memini-ai provides 6 MCP tools:
137
+
138
+ #### `query_memories`
139
+ Semantic search over memories.
140
+
141
+ ```json
142
+ {
143
+ "query": "What files were modified yesterday?",
144
+ "limit": 10,
145
+ "strategy": "tiered"
146
+ }
147
+ ```
148
+
149
+ **Strategies:**
150
+ - `tiered` (default): MiniLM primary + BGE fallback
151
+ - `vector_only`: Pure semantic similarity
152
+ - `text_only`: BM25 keyword search
153
+ - `parallel`: Dual-tier with RRF fusion
154
+
155
+ #### `add_memory`
156
+ Store a new memory entry.
157
+
158
+ ```json
159
+ {
160
+ "content": "Remember to update the config file",
161
+ "sourceType": "session",
162
+ "sourcePath": "/path/to/file",
163
+ "metadata": {"key": "value"}
164
+ }
165
+ ```
166
+
167
+ #### `search_project`
168
+ Search indexed project files.
169
+
170
+ ```json
171
+ {
172
+ "query": "authentication middleware",
173
+ "topK": 20,
174
+ "fileTypes": [".py", ".ts"],
175
+ "paths": ["src/"]
176
+ }
177
+ ```
178
+
179
+ #### `index_project`
180
+ Trigger project indexing.
181
+
182
+ ```json
183
+ {
184
+ "path": ".",
185
+ "force": false,
186
+ "background": true
187
+ }
188
+ ```
189
+
190
+ #### `get_file_contents`
191
+ Reconstruct a file from indexed chunks.
192
+
193
+ ```json
194
+ {
195
+ "filePath": "src/main.py",
196
+ "triggerIndex": false
197
+ }
198
+ ```
199
+
200
+ #### `get_status`
201
+ Get server component status.
202
+
203
+ ```json
204
+ {}
205
+ ```
206
+
207
+ ### Python API
208
+
209
+ ```python
210
+ from memini_ai.memory.system import MemorySystem
211
+ from memini_ai.memory.schema import MemoryEntry, MemorySourceType, SearchOptions, SearchStrategy
212
+
213
+ async def main():
214
+ # Create and initialize
215
+ system = MemorySystem()
216
+ await system.initialize()
217
+
218
+ # Add a memory
219
+ entry = MemoryEntry(
220
+ text="Python list comprehension tutorial",
221
+ source_type=MemorySourceType.session,
222
+ )
223
+ memory_id = await system.add_memory(entry)
224
+
225
+ # Query memories
226
+ options = SearchOptions(topK=10, strategy=SearchStrategy.TIERED)
227
+ results = await system.query_memories("list comprehension", options)
228
+
229
+ # Delete memory
230
+ await system.delete_memory(memory_id)
231
+
232
+ asyncio.run(main())
233
+ ```
234
+
235
+ ## Docker Compose
236
+
237
+ For local development with Qdrant:
238
+
239
+ ```yaml
240
+ version: '3.8'
241
+
242
+ services:
243
+ qdrant:
244
+ image: qdrant/qdrant
245
+ ports:
246
+ - "6333:6333"
247
+ - "6334:6334"
248
+ volumes:
249
+ - qdrant_data:/qdrant/storage
250
+
251
+ memini-ai:
252
+ build: .
253
+ depends_on:
254
+ - qdrant
255
+ environment:
256
+ - MEMINI_QDRANT_URL=http://qdrant:6333
257
+ volumes:
258
+ - .:/app
259
+
260
+ volumes:
261
+ qdrant_data:
262
+ ```
263
+
264
+ ```bash
265
+ docker-compose up -d
266
+ ```
267
+
268
+ ## Testing
269
+
270
+ ```bash
271
+ # Run all tests
272
+ pytest tests/ -v
273
+
274
+ # Run unit tests only (skip integration)
275
+ pytest tests/ -v --ignore=tests/integration/
276
+
277
+ # Run integration tests (requires Qdrant)
278
+ pytest tests/integration/ -v
279
+
280
+ # Run with coverage
281
+ pytest tests/ --cov=src/memini_ai --cov-report=term-missing
282
+ ```
283
+
284
+ ### Integration Tests with Docker
285
+
286
+ ```bash
287
+ # Start Qdrant for integration tests
288
+ docker run -d --name qdrant-test -p 6333:6333 qdrant/qdrant
289
+
290
+ # Run integration tests
291
+ pytest tests/integration/ -v
292
+
293
+ # Cleanup
294
+ docker stop qdrant-test && docker rm qdrant-test
295
+ ```
296
+
297
+ ## Quality Gates
298
+
299
+ Before submitting changes, ensure:
300
+
301
+ ```bash
302
+ # Lint
303
+ ruff check src/
304
+
305
+ # Format
306
+ ruff format src/
307
+
308
+ # Type check
309
+ mypy src/
310
+
311
+ # Tests
312
+ pytest tests/ -x
313
+ ```
314
+
315
+ ## Performance
316
+
317
+ Memini-ai is designed for sub-10ms query latency on cached queries.
318
+
319
+ Typical performance:
320
+ - **Query latency**: < 10ms (after warmup)
321
+ - **Indexing**: ~1000 files/second
322
+ - **Memory footprint**: ~500MB (without model)
323
+
324
+ ### Performance Tuning
325
+
326
+ ```bash
327
+ # Use faster embedding model (384-dim instead of 1024)
328
+ export MEMINI_EMBEDDING_DIM=384
329
+
330
+ # Increase workers for faster indexing
331
+ export MEMINI_WORKERS=8
332
+
333
+ # Larger batch size for embedding generation
334
+ export MEMINI_BATCH_SIZE=64
335
+ ```
336
+
337
+ ## Architecture
338
+
339
+ ```
340
+ memini_ai/
341
+ ├── config.py # Configuration management
342
+ ├── server.py # FastMCP server (6 tools)
343
+ ├── memory/
344
+ │ ├── schema.py # Pydantic models
345
+ │ ├── database.py # Qdrant CRUD operations
346
+ │ ├── search.py # 4 search strategies
347
+ │ └── system.py # MemorySystem coordinator
348
+ ├── model/
349
+ │ ├── manager.py # ModelManager singleton
350
+ │ └── embeddings.py # Embedding generation
351
+ ├── indexer/
352
+ │ ├── indexer.py # ProjectIndexer
353
+ │ ├── chunker.py # Semantic chunking
354
+ │ ├── watcher.py # File watching
355
+ │ └── file_tracker.py # SQLite persistence
356
+ └── utils/
357
+ ├── logger.py # Structured logging
358
+ └── hash.py # SHA-256 utilities
359
+ ```
360
+
361
+ ## License
362
+
363
+ MIT License - see LICENSE file for details.
364
+
365
+ ## Links
366
+
367
+ - [Repository](https://github.com/veedubin/memini-ai)
368
+ - [Documentation](https://github.com/veedubin/memini-ai#readme)
369
+ - [Qdrant](https://qdrant.tech/)
370
+ - [FastMCP](https://github.com/jlowin/fastmcp)