memex-mvp 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/HELP.md ADDED
@@ -0,0 +1,308 @@
1
+ # Memex — как пользоваться
2
+
3
+ > **Кратко:** memex — твой локальный архив всех разговоров с AI. Сохраняет дословно. Любой AI-агент через MCP видит всю твою историю.
4
+
5
+ Если ты только установил memex и не знаешь что делать — этот файл объясняет на конкретных кейсах. Скопируй промпт, вставь в свой AI (Claude Code, Cursor, Cline, Continue, Zed) — и попробуй.
6
+
7
+ ---
8
+
9
+ ## Что memex сохраняет
10
+
11
+ - **Claude Code** — каждую сессию из `~/.claude/projects/`
12
+ - **Claude Cowork** (включая субагентов) — сессии из `~/Library/Application Support/Claude/local-agent-mode-sessions/`
13
+ - **Cursor** — composer history из `state.vscdb`
14
+ - **Obsidian** — заметки из настроенных vault'ов
15
+ - **Telegram** — экспорты которые ты сам положишь в `~/.memex/inbox/`
16
+
17
+ Всё это лежит в **одном файле** `~/.memex/data/memex.db` и доступно через MCP-tools любому AI на твоём компьютере.
18
+
19
+ ---
20
+
21
+ ## Как memex реально работает — механика
22
+
23
+ Когда ты задаёшь вопрос в Claude / Cursor / любом другом MCP-агенте, под капотом происходит **7 шагов**:
24
+
25
+ ```
26
+ ┌──────────────────────────────────────────────────────────────────┐
27
+ │ Ты: «Что я вчера обсуждал с Claude про auth?» │
28
+ └──────────────────────────────────────────────────────────────────┘
29
+
30
+
31
+ ┌──────────────────────────────────────────────────────────────────┐
32
+ │ 1. Агент (LLM в Claude/Cursor) видит твой вопрос │
33
+ │ Думает: "Вопрос про прошлое → надо вызвать memex_search" │
34
+ └──────────────────────────────────────────────────────────────────┘
35
+
36
+
37
+ ┌──────────────────────────────────────────────────────────────────┐
38
+ │ 2. Агент через MCP вызывает memex_search(query="auth") │
39
+ └──────────────────────────────────────────────────────────────────┘
40
+
41
+
42
+ ┌──────────────────────────────────────────────────────────────────┐
43
+ │ 3. Memex выполняет FTS5-запрос к SQLite │
44
+ │ (миллисекунды, читает только текст, никаких LLM) │
45
+ └──────────────────────────────────────────────────────────────────┘
46
+
47
+
48
+ ┌──────────────────────────────────────────────────────────────────┐
49
+ │ 4. Memex возвращает 5-10 сообщений с snippet'ами: │
50
+ │ │
51
+ │ • claude-code · 2026-05-12 · "Решили JWT для auth..." │
52
+ │ • claude-code · 2026-05-12 · "...refresh tokens..." │
53
+ │ • cowork · 2026-05-11 · "Auth pattern для multi-tenant..." │
54
+ └──────────────────────────────────────────────────────────────────┘
55
+
56
+
57
+ ┌──────────────────────────────────────────────────────────────────┐
58
+ │ 5. Эти snippet'ы попадают в контекст агента как tool-result │
59
+ │ (становятся частью контекстного окна LLM ~ 200k токенов) │
60
+ └──────────────────────────────────────────────────────────────────┘
61
+
62
+
63
+ ┌──────────────────────────────────────────────────────────────────┐
64
+ │ 6. LLM (Claude) ЧИТАЕТ снэппеты + твой исходный вопрос │
65
+ │ Если мало — может вызвать memex_search ЕЩЁ РАЗ или │
66
+ │ memex_get_conversation для полного transcript'a │
67
+ └──────────────────────────────────────────────────────────────────┘
68
+
69
+
70
+ ┌──────────────────────────────────────────────────────────────────┐
71
+ │ 7. LLM формулирует ответ на твоём языке: │
72
+ │ │
73
+ │ «Вчера ты обсуждал JWT auth с refresh tokens, в Claude │
74
+ │ Code решил так-то, а в Cowork обсуждал multi-tenant │
75
+ │ аспекты. Вот точные цитаты: ...» │
76
+ └──────────────────────────────────────────────────────────────────┘
77
+ ```
78
+
79
+ ### Кто что делает — главное
80
+
81
+ | | **Memex** | **LLM (Claude/GPT/...)** |
82
+ |---|---|---|
83
+ | Тип работы | **Retrieval** (поиск) | **Reasoning** (рассуждение) |
84
+ | Что умеет | Найти релевантные куски текста за миллисекунды через FTS5 | Понимать контекст, формулировать ответ на твоём языке |
85
+ | Что НЕ умеет | Думать, суммаризовать, отвечать | Сам по себе вспоминать что было вчера |
86
+
87
+ **Аналогия:** memex — как Google для твоего личного архива. LLM — как ты сам, читая результаты Google.
88
+
89
+ ### Куда попадают найденные куски
90
+
91
+ Это **критически важно понять**: snippet'ы из memex попадают **в контекстное окно LLM** (тот же ~200k токенов где живёт твой текущий разговор). LLM видит их как обычный текст в своём контексте и может на них ссылаться, цитировать, переформулировать.
92
+
93
+ Это **не RAG в классическом смысле** (где векторный поиск тащит из БД сверху промпта). Это **agentic retrieval**: LLM сам решает когда вызвать memex_search, и сам обрабатывает результаты как любой другой tool-call.
94
+
95
+ ### Что memex делает — а что нет
96
+
97
+ ✅ **Memex делает:**
98
+ - Возвращает дословный текст (verbatim) — никаких пересказов
99
+ - FTS5-поиск с recency boost (свежее → выше в выдаче)
100
+ - Multi-source поиск (Claude + Cursor + TG + Obsidian в одном запросе)
101
+ - Метаданные: source, date, conversation_id (для drill-down)
102
+
103
+ ❌ **Memex НЕ делает:**
104
+ - Не суммаризует найденное
105
+ - Не отвечает на вопросы напрямую
106
+ - Не «думает» про связи между сообщениями
107
+ - Не модифицирует найденный текст
108
+ - Не использует embeddings (пока — FTS5 only, semantic в roadmap'е)
109
+
110
+ ### Что LLM делает с снэппетами
111
+
112
+ - Читает их как обычный текст в контексте
113
+ - Объединяет с твоим вопросом и формирует ответ
114
+ - Может **уточнить поиск** — вызвать memex_search ещё раз с другим query
115
+ - Может **drill down** — вызвать memex_get_conversation для полного transcript'a одного чата
116
+ - Может **скомбинировать с другими тулзами** — например прочитать локальный PDF через свой file-read tool, и сцепить с контекстом из memex
117
+
118
+ ### Контекстное окно — где это всё живёт
119
+
120
+ LLM имеет ограниченное контекстное окно (~200k токенов у Claude 4.7). Retrieved snippet'ы из memex занимают часть этого окна — поэтому есть параметры регулирования:
121
+
122
+ - `expand_match: false` (default) → snippet'ы по 360 chars каждый, экономия токенов
123
+ - `expand_match: true` → полный текст каждого сообщения
124
+ - `group_by_conversation: true` (default) → один лучший hit на чат + count, не все совпадения
125
+ - `limit: N` (default 10) → сколько результатов вернуть
126
+
127
+ Эти параметры контролируют **сколько токенов** retrieved data занимает в твоём контексте.
128
+
129
+ ---
130
+
131
+ ## 6 типовых сценариев — что попросить агента
132
+
133
+ ### 1. 📋 Превратить рабочий Telegram-чат в action plan
134
+
135
+ ```
136
+ Прочитай через memex_search мой последний месяц переписки с клиентом X
137
+ в Telegram. Сделай чек-лист действий с приоритетами и список открытых
138
+ вопросов на которые надо ответить.
139
+ ```
140
+
141
+ → Агент находит сообщения через `memex_search`, читает контекст, выдаёт структурированный план. Не нужно вручную перечитывать три месяца переписки.
142
+
143
+ ---
144
+
145
+ ### 2. 📊 Анализ pitch-deck'a из рабочего Telegram
146
+
147
+ ```
148
+ Через memex_search найди в моём чате с маркетологом deck про Q2 launch
149
+ (около двух месяцев назад) и всё обсуждение вокруг него. Открой сам файл
150
+ (путь у memex в metadata) и сведи: 1) ключевые тезисы deck'a, 2) комментарии
151
+ команды из чата, 3) открытые вопросы для следующей встречи.
152
+ ```
153
+
154
+ → memex даёт контекст разговора, агент читает PDF своими тулами, выдаёт синтез **deck + обсуждение** в одном.
155
+
156
+ ---
157
+
158
+ ### 3. 🌉 Один AI видит историю другого
159
+
160
+ ```
161
+ Найди через memex_search что я вчера обсуждал с Claude про auth.
162
+ Продолжай отсюда — не нужно объяснять заново.
163
+ ```
164
+
165
+ → Cursor через MCP читает Claude Code сессию. Контекст переходит между AI без повторных объяснений.
166
+
167
+ ---
168
+
169
+ ### 4. 🔍 Найти точную цитату из прошлого
170
+
171
+ ```
172
+ В марте я что-то решал про pricing. Найди дословную формулировку
173
+ в моих сессиях с AI.
174
+ ```
175
+
176
+ → `memex_search("pricing")` возвращает оригинальные сообщения — не пересказ, точную цитату с датой и из какой сессии.
177
+
178
+ ---
179
+
180
+ ### 5. 🔄 «Где я остановился в этом проекте?»
181
+
182
+ ```
183
+ Возвращаюсь к проекту memex после двух недель. Через memex_list_projects
184
+ и memex_recent покажи где я остановился. Что было сделано, что осталось?
185
+ ```
186
+
187
+ → Агент собирает картину из последних сессий по этому project_path.
188
+
189
+ ---
190
+
191
+ ### 6. 💡 Найти паттерны во всех AI-разговорах
192
+
193
+ ```
194
+ Через memex_search найди все упоминания Postgres в моих сессиях с AI.
195
+ В каком контексте? Что я решал? Какие проблемы всплывали?
196
+ ```
197
+
198
+ → Один запрос → агент видит все упоминания через все инструменты и сводит в темы.
199
+
200
+ ---
201
+
202
+ ### 7. 🕐 Timeline эволюции одного документа
203
+
204
+ Memex по дефолту сортирует по **релевантности** (FTS5 BM25 × recency boost). Это хорошо для «найди что-то конкретное», но плохо для **«покажи как X менялось со временем»** — версии разлетаются хаотично.
205
+
206
+ **Попроси агента явно отсортировать:**
207
+
208
+ ```
209
+ Найди в memex все упоминания презентации Q2 launch — в моём Telegram-чате
210
+ с маркетологом И в моих AI-сессиях. ОТСОРТИРУЙ результаты строго по дате
211
+ создания (от самой свежей к самой старой). Покажи как deck менялся —
212
+ какие версии были, что менялось между ними.
213
+ ```
214
+
215
+ → Memex вернёт hits, агент **переупорядочит их по `ts`** (это поле есть в каждом результате) и покажет chronological timeline. Если хитов слишком много в FTS-поиске — попроси `expand_match: true` и `limit: 20`, чтобы получить полные тексты.
216
+
217
+ **Tip:** если уже видишь хаотичные результаты — просто скажи агенту в чате:
218
+
219
+ ```
220
+ Эти результаты переотсортируй по дате — от свежей к старой.
221
+ Каждый укажи с датой и source.
222
+ ```
223
+
224
+ Агент возьмёт уже-полученные hits и пересортирует. **Дополнительный memex-вызов не нужен.**
225
+
226
+ **Server-side sort:** `memex_search` принимает параметр `sort: "date_asc"` (от старых к новым — читать эволюцию) или `sort: "date_desc"` (последняя версия первой). FTS5 MATCH всё равно фильтрует кандидатов, меняется только порядок — recency boost отключается. Это правильнее, чем переcортировка на стороне агента, когда хитов много.
227
+
228
+ ---
229
+
230
+ ## Какие MCP-tools агент может вызвать
231
+
232
+ | Tool | Что делает |
233
+ |---|---|
234
+ | `memex_overview` | Снэпшот корпуса: источники, сколько сообщений, последние чаты, статус auto-capture |
235
+ | `memex_search(query)` | Полнотекстовый поиск (FTS5) с recency boost'ом. Параметры: `project`, `source`, `chat`, `half_life_days`, `expand_match`, `sort` |
236
+ | `memex_list_projects` | Список всех проектов с количеством разговоров |
237
+ | `memex_list_conversations` | Список чатов отсортированных по recency |
238
+ | `memex_get_conversation(id)` | Полный transcript одного чата |
239
+ | `memex_recent` | Последние N сообщений по всем источникам |
240
+ | `memex_archive_conversation(id)` | Скрыть чат из дефолтных списков (не удаляет) |
241
+ | `memex_export_markdown` | Экспорт чата в Markdown (для Obsidian) |
242
+ | `memex_list_sources` | Что и сколько импортировано |
243
+ | `memex_status` | Здоровье memex-sync daemon'a |
244
+ | `memex_sources_status` | Какие источники включены/отключены |
245
+
246
+ ---
247
+
248
+ ## Если что-то не работает
249
+
250
+ ### Поиск пустой
251
+
252
+ 1. Вызови `memex_overview`. Внимание на статус-баннер сверху:
253
+ - 🟢 daemon работает — всё ок, может ещё не успел проиндексировать
254
+ - 🔴 daemon установлен но не работает — `launchctl load ~/Library/LaunchAgents/com.parallelclaw.memex.sync.plist`
255
+ - ⚪ daemon не установлен — `npx memex-sync install` из директории memex-mvp
256
+
257
+ ### Хочу проиндексировать существующие сессии (бэкфилл)
258
+
259
+ ```bash
260
+ npx memex-sync scan
261
+ ```
262
+
263
+ Обходит `~/.claude/projects/`, Cowork-сессии, Cursor state.vscdb, и Obsidian-vault'ы один раз — ингестит всё что уже есть на диске.
264
+
265
+ ### Telegram-чаты не появляются
266
+
267
+ 1. В Telegram **Desktop** (не mobile!): чат → меню → **Export chat history** → **Format: JSON**
268
+ 2. Кинь `result.json` в `~/.memex/inbox/`
269
+ 3. Memex подхватит автоматически за ~1.5 сек
270
+
271
+ ### Хочу подключить новый Obsidian-vault
272
+
273
+ ```bash
274
+ npx memex-sync vault add ~/path/to/vault
275
+ ```
276
+
277
+ ### Я в Cursor, memex не видит мои Claude Code сессии
278
+
279
+ `memex_overview` покажет что захватывается. Если Claude Code не в списке источников — проверь что `~/.claude/projects/` существует на твоей машине и не пустая. Затем `npx memex-sync scan-claude` для одноразового ингеста.
280
+
281
+ ### Хочу удалить какой-то чат
282
+
283
+ ```bash
284
+ # Скрыть из дефолтных списков (рекомендуется)
285
+ memex_archive_conversation(conversation_id="tg-...")
286
+
287
+ # Или полностью удалить через sqlite
288
+ sqlite3 ~/.memex/data/memex.db "DELETE FROM messages WHERE conversation_id = '...'"
289
+ ```
290
+
291
+ ---
292
+
293
+ ## Где живёт твоя память
294
+
295
+ - **`~/.memex/data/memex.db`** — твой SQLite-архив. Это main файл. Бэкап через `cp`.
296
+ - **`~/.memex/inbox/`** — куда дроп'ать Telegram-экспорты или другие JSON для импорта
297
+ - **`~/.memex/staging/`** — внутренняя кухня daemon'a, **не трогай**
298
+ - **`~/.memex/data/conversations/`** — импортированные файлы переезжают сюда после успешного парсинга
299
+ - **`~/.memex/data/ingest.log`** — лог daemon'a (`tail -f` чтобы смотреть в реальном времени)
300
+ - **`~/.memex/config.json`** — конфиг (какие источники включены)
301
+
302
+ ---
303
+
304
+ ## Ничего не помогает?
305
+
306
+ - Issues / баги: https://github.com/parallelclaw/memex-mvp/issues
307
+ - README с архитектурой: https://github.com/parallelclaw/memex-mvp#readme
308
+ - Лендинг с use cases: https://memex.parallelclaw.ai
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 parallelclaw
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.