parallelclaw 1.0.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 (62) hide show
  1. package/CHANGELOG.md +204 -0
  2. package/HELP.md +600 -0
  3. package/LICENSE +21 -0
  4. package/MULTI_MACHINE.md +152 -0
  5. package/README.md +417 -0
  6. package/README.ru.md +740 -0
  7. package/SYNC.md +844 -0
  8. package/bot/README.md +173 -0
  9. package/bot/config.js +66 -0
  10. package/bot/inbox.js +153 -0
  11. package/bot/index.js +294 -0
  12. package/bot/nexara.js +61 -0
  13. package/bot/poll.js +304 -0
  14. package/bot/search.js +155 -0
  15. package/bot/telegram.js +96 -0
  16. package/ingest.js +2712 -0
  17. package/lib/cli/index.js +1987 -0
  18. package/lib/config.js +220 -0
  19. package/lib/db-init.js +158 -0
  20. package/lib/hook/install.js +268 -0
  21. package/lib/import-telegram.js +158 -0
  22. package/lib/ingest-file.js +779 -0
  23. package/lib/notify-click-action.js +281 -0
  24. package/lib/openclaw-channel.js +643 -0
  25. package/lib/parse-cursor.js +172 -0
  26. package/lib/parse-obsidian.js +256 -0
  27. package/lib/parse-telegram-html.js +384 -0
  28. package/lib/parse.js +175 -0
  29. package/lib/render-markdown.js +0 -0
  30. package/lib/store-doc/canonicalize.js +116 -0
  31. package/lib/store-doc/detect.js +209 -0
  32. package/lib/store-doc/extract-title.js +162 -0
  33. package/lib/sync/auth.js +80 -0
  34. package/lib/sync/cert.js +144 -0
  35. package/lib/sync/cli.js +906 -0
  36. package/lib/sync/client.js +138 -0
  37. package/lib/sync/config.js +130 -0
  38. package/lib/sync/pair.js +145 -0
  39. package/lib/sync/pull.js +158 -0
  40. package/lib/sync/push.js +305 -0
  41. package/lib/sync/replicate.js +335 -0
  42. package/lib/sync/server.js +224 -0
  43. package/lib/sync/service.js +726 -0
  44. package/lib/tasks.js +215 -0
  45. package/lib/telegram-decisions.js +165 -0
  46. package/lib/telegram-discovery.js +373 -0
  47. package/lib/telegram-notify.js +272 -0
  48. package/lib/telegram-pending.js +200 -0
  49. package/lib/web/index.js +265 -0
  50. package/lib/web/routes/conversation.js +193 -0
  51. package/lib/web/routes/conversations.js +180 -0
  52. package/lib/web/routes/dashboard.js +175 -0
  53. package/lib/web/routes/pending.js +277 -0
  54. package/lib/web/routes/settings.js +226 -0
  55. package/lib/web/static/style.css +393 -0
  56. package/lib/web/templates.js +234 -0
  57. package/package.json +84 -0
  58. package/server.js +3816 -0
  59. package/skills/install-memex/README.md +109 -0
  60. package/skills/install-memex/SKILL.md +342 -0
  61. package/skills/install-memex/examples.md +294 -0
  62. package/skills/install-memex-claw/SKILL.md +423 -0
package/HELP.md ADDED
@@ -0,0 +1,600 @@
1
+ # ParallelClaw — как пользоваться
2
+
3
+ > **Кратко:** ParallelClaw — твой локальный архив всех разговоров с AI (CLI-команда — `memex`). Сохраняет дословно. Любой AI-агент через MCP видит всю твою историю.
4
+
5
+ Если ты только установил memex и не знаешь что делать — этот файл объясняет на конкретных кейсах. Скопируй промпт, вставь в свой AI (Claude Code, Cursor, OpenClaw) — и попробуй.
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** — v0.10+: daemon сам ловит экспорты из `~/Downloads/Telegram Desktop/` → пакует в pending → ты per-chat подтверждаешь импорт (`memex telegram pending` + `memex telegram import 1 3 5`). Никакого ручного копирования
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
+ ### 8. 🔗 Сохранение URL'ов в memex (Perplexity, статьи, AI-share'ы)
231
+
232
+ Ты читаешь что-то — Perplexity research thread, длинную статью, GitHub-обсуждение, AI-chat share — и хочешь чтобы это жило в memex-памяти, искалось из любого AI-чата.
233
+
234
+ **В любом MCP-агенте (Claude Code, Cursor, OpenClaw):**
235
+
236
+ ```
237
+ Сохрани https://perplexity.ai/share/<id> в memex
238
+ Добавь эту статью в memex: https://example.com/great-post
239
+ Захвати этот ChatGPT-разговор: https://chat.openai.com/share/<id>
240
+ ```
241
+
242
+ **Что происходит за кулисами:**
243
+
244
+ 1. Агент сам делает fetch URL'a (через свой WebFetch)
245
+ 2. Если страница защищена Cloudflare (Perplexity, npm.com, Twitter, Medium…) — агент авто-retry через `r.jina.ai` proxy (бесплатный JS-runtime, обходит Cloudflare). **Точный recipe** (зафиксирован эмпирически на реальных Cloudflare-страницах в 2026-05):
246
+ ```bash
247
+ curl -H "Accept: text/markdown" https://r.jina.ai/https://<original-url>
248
+ ```
249
+ Критично: **`https://` после `r.jina.ai/`** (НЕ `http://`, НЕ голый домен), **`Accept: text/markdown`** header (иначе возвращается HTML или mixed-формат). Если WebFetch агента не умеет задавать headers — shell out на curl с `-H`.
250
+ 3. Агент вызывает `memex_store_document(content, url, title)`
251
+ 4. Memex сохраняет содержимое как conversation с `source: "web"` — ищется через `memex_search` рядом с AI-чатами
252
+
253
+ **Для Perplexity-thread'ов:** thread должен быть **PUBLIC**. В Perplexity: открой thread → Share → toggle "Public link" → скопируй новый URL → дай его агенту. URL из адресной строки браузера (`perplexity.ai/search/<id>`) — это **твой owner-URL, не shareable**.
254
+
255
+ Если забудешь — memex детектит «private» в ответе и agent тебе явно скажет что делать.
256
+
257
+ **Login-walled или paywalled контент не fetch'нется** (NYT subscription, твои приватные ChatGPT-чаты). Для них вставь контент руками:
258
+
259
+ ```
260
+ Сохрани этот текст в memex (название: "..."): <вставь содержимое>
261
+ ```
262
+
263
+ **Tag'и при сохранении** — для последующей фильтрации:
264
+
265
+ ```
266
+ Сохрани https://... в memex, поставь теги "research" и "perplexity"
267
+ ```
268
+
269
+ **Поиск:**
270
+
271
+ ```
272
+ Найди в memex что Perplexity говорил про X на прошлой неделе
273
+ ```
274
+
275
+ `memex_search` возвращает совпадения **и из AI-чатов, и из сохранённых URL'ов** в одном запросе — отсортировано по релевантности или дате.
276
+
277
+ **Memex принципиально НЕ делает outbound network calls.** Fetcher живёт в твоём AI-агенте. Если он использует Jina для обхода Cloudflare — Jina видит URL (но НЕ остальной memex-корпус). Это выбор агента, не memex'a.
278
+
279
+ ---
280
+
281
+ ## Какие MCP-tools агент может вызвать
282
+
283
+ | Tool | Что делает |
284
+ |---|---|
285
+ | `memex_overview` | Снэпшот корпуса: источники, сколько сообщений, последние чаты, статус auto-capture |
286
+ | `memex_search(query)` | Полнотекстовый поиск (FTS5) с recency boost'ом. Параметры: `project`, `source`, `chat`, `conversation_id` (поиск ВНУТРИ одной сессии), `since_ts`/`until_ts` (фильтр по диапазону дат), `origin` (v0.14 — с какого УЗЛА захвачено: "vps1", "macbook-pro"), `half_life_days`, `expand_match`, `sort` |
287
+ | `memex_store_document(content, url?, title?)` | Сохранить внешний документ (web-страница, AI-chat share, paste) в memex. Агент сам делает fetch, memex хранит verbatim. Учит Jina-трюк для Cloudflare-страниц |
288
+ | `memex_list_projects` | Список всех проектов с количеством разговоров |
289
+ | `memex_list_conversations` | Список чатов отсортированных по recency |
290
+ | `memex_get_conversation(id)` | Transcript одного чата. Параметры: `limit`, `offset` (листать длинные сессии), `order` (`asc`=старые/`desc`=свежие первыми), `include_subagents`. Вывод сообщает `total` — сколько всего сообщений |
291
+ | `memex_recent` | Последние N сообщений по всем источникам |
292
+ | `memex_archive_conversation(id)` | Скрыть чат из дефолтных списков (не удаляет) |
293
+ | `memex_export_markdown` | Экспорт чата в Markdown (для Obsidian) |
294
+ | `memex_list_sources` | Что и сколько импортировано |
295
+ | `memex_status` | Здоровье memex-sync daemon'a |
296
+ | `memex_sources_status` | Какие источники включены/отключены |
297
+ | `memex_telegram_check` *(v0.10+)* | Состояние Telegram-pipeline: Desktop установлен? login age? сколько pending? Возвращает `next_step` для агента |
298
+ | `memex_telegram_pending` *(v0.10+)* | Список экспортов в `~/.memex/pending/` с chat name + msg count + дата range |
299
+ | `memex_telegram_import` *(v0.10+)* | Импорт выбранных экспортов в memex.db (по индексу или title). Auto-allowlist |
300
+ | `memex_telegram_skip` *(v0.10+)* | Пометить чаты как «не индексировать» — применяется к будущим re-export'ам |
301
+ | `memex_telegram_mode` *(v0.10+)* | Get/set режим: `pick` (default), `auto`, `manual` |
302
+
303
+ ---
304
+
305
+ ## 🔎 Рецепты поиска для агентов (как доставать память эффективно)
306
+
307
+ Частые задачи и точный способ их решить — особенно для длинных сессий и узких запросов:
308
+
309
+ | Задача | Как сделать |
310
+ |---|---|
311
+ | **Тема за конкретный период** («что обсуждали про X в июне») | `memex_search(query, since_ts, until_ts)`. Это фильтр по датам — в отличие от `sort` (только порядок) и `half_life_days` (только буст). |
312
+ | **Ключевое слово внутри одной большой сессии** | `memex_search(query, conversation_id=<id>)` — точный скоуп в один чат (а не нечёткий `chat` по названию). |
313
+ | **Самые свежие сообщения длинной сессии** | `memex_get_conversation(id, order:"desc")` — хвост в один вызов. Дефолт `asc` отдаёт самые старые. |
314
+ | **Навигация по сессии на тысячи сообщений** | Сначала `memex_search(query, conversation_id)` чтобы найти место, потом `memex_get_conversation(id, offset, limit)` чтобы прочитать окно вокруг. |
315
+ | **Листать длинный чат страницами** | `memex_get_conversation(id, limit, offset)` — `offset` 0, 200, 400… Вывод показывает `total`, чтобы знать докуда листать. |
316
+ | **Эволюция документа/решения во времени** | `memex_search(query, sort:"date_asc")` — старые→новые, читать вперёд. |
317
+ | **Найти в чате по человеку/названию** | `memex_search(query, chat:"<часть названия>")` — нечёткий подстрочный матч по заголовку. |
318
+ | **«Что я обсуждал с агентом на конкретной машине»** (synced-меш) | `memex_search(query, origin:"vps1")` — v0.14: каждый узел штампует свои захваты своим именем. Какие origins есть — видно в `memex_overview`. В слитых чатах (два агента в одном Telegram) `memex_get_conversation` помечает строки `[@origin]`. Строки до v0.14 — без origin. |
319
+
320
+ > Даты — Unix-секунды. Напр. «с 1 июня 2026» → `since_ts: 1780272000`. Не уверен в границах — сначала `memex_list_conversations(since_ts=…)` чтобы увидеть, какие сессии попадают в окно.
321
+
322
+ ---
323
+
324
+ ## 🔁 Синк между устройствами (v0.13) — 2 шага
325
+
326
+ Ноут с Claude/Cursor + сервер с агентом → одна общая память. Без публичных
327
+ портов, фаервол не трогаем, SSH-ключи руками не носим.
328
+
329
+ **Шаг 1 — промпт агенту на сервере** (он сделает всё сам):
330
+
331
+ ```
332
+ Настрой memex-sync как хаб и выдай join-токен для моего ноута:
333
+ 1. npm install -g parallelclaw@latest (пропусти, если уже стоит)
334
+ 2. memex-sync sync-server install --bind 127.0.0.1
335
+ 3. memex-sync sync-server invite --join
336
+ Пришли мне строку memex-join:...
337
+ ```
338
+
339
+ **Шаг 2 — одна команда на ноуте:**
340
+
341
+ ```bash
342
+ memex-sync sync-join memex-join:eyJ2...
343
+ ```
344
+
345
+ Поднимет самовосстанавливающийся SSH-туннель, сделает первый синк, поставит
346
+ авто-синк (15м) + watchdog (1ч) и **докажет** петлю тестовой заметкой.
347
+ Проверить состояние в любой момент: `memex-sync sync-status` (туннель,
348
+ расписание, watchdog, когда был последний успешный синк). Если синк замолчит
349
+ дольше часа — watchdog пришлёт уведомление и запишет `~/.memex/sync-alert.txt`.
350
+
351
+ Типовые проблемы: токен «expired» сразу после выпуска → проверь часы на обеих
352
+ машинах (`date -u`), пере-выпусти токен; «SSH failed» → команда печатает твой
353
+ pubkey — отдай его агенту сервера и повтори. Подробности и продвинутые
354
+ топологии — [SYNC.md](https://github.com/parallelclaw/memex-mvp/blob/main/SYNC.md).
355
+
356
+ ---
357
+
358
+ ## 💻 Терминальный CLI (v0.7+) — когда MCP не работает
359
+
360
+ Если MCP-интеграция не подцепилась к твоему агенту (или ты в агенте без MCP-поддержки, но с shell-доступом) — у memex есть **terminal-режим** на том же бинаре. Один пакет, два режима.
361
+
362
+ ```bash
363
+ memex search "Postgres миграция" # FTS5 поиск
364
+ memex search "Q2 deck" --chat "Memex Bot" # фильтр по title чата
365
+ memex search "auth" --source claude-code --limit 5 --sort date_desc
366
+ memex search "JWT" --as-of 2026-05-01 # time-travel (v0.8.1+) — только до даты
367
+
368
+ memex when "Brian Chesky" # «когда мы об этом говорили»
369
+ memex when "JWT decision" --limit 5 # → chronological list of chats, без snippets
370
+
371
+ memex recent --limit 5 # последние сообщения
372
+ memex recent --source telegram
373
+
374
+ memex list # все conversations
375
+ memex list --source web # только сохранённые URL'ы
376
+
377
+ memex get web-1582ab51a7b7 # полный контент conversation
378
+
379
+ memex overview # snapshot корпуса (+ capture streak v0.8.1+)
380
+ memex projects # уникальные project_paths
381
+
382
+ # Telegram pipeline (v0.10+):
383
+ memex telegram check # Desktop? 24h? watcher? pending?
384
+ memex telegram pending # список pending экспортов
385
+ memex telegram import 1 3 5 # импорт по индексам или title'у
386
+ memex telegram skip 4 # не индексировать; запомнить
387
+ memex telegram allow "Family" # auto-import на следующих re-export'ах
388
+ memex telegram block "*bank*" # никогда не индексировать (glob)
389
+ memex telegram mode auto # pick (default) / auto / manual
390
+ memex telegram notifications on --show-titles # macOS notif когда детектится новый export
391
+ memex telegram notifications target claude-cli # клик по баннеру → откроет Claude Code CLI
392
+ memex telegram open-pending # открыть pending в лучшем доступном клиенте
393
+ memex telegram open-pending --in terminal # forcefully в Terminal с командой
394
+ memex telegram scan # one-shot ре-скан Downloads
395
+ memex telegram status # all decisions
396
+
397
+ # Импорт файла из ЛЮБОГО пути (v0.10.12+) — без танцев с inbox/pending:
398
+ memex import ~/projects/memex/result.json # автодетект формата
399
+ memex import ~/Downloads/ChatExport_2026-05-18/ # директория Telegram HTML
400
+ memex import ~/path/to/session.jsonl # Claude Code JSONL
401
+ memex import ~/Downloads/result.json --force # пропустить privacy-gate
402
+ memex import file --format claude-jsonl --json # явный формат + JSON-вывод
403
+
404
+ memex help # эта инструкция в терминале
405
+ memex --help # справка по командам
406
+ memex --version
407
+ ```
408
+
409
+ **Все query-команды поддерживают `--json`** для пайпов и скриптов:
410
+
411
+ ```bash
412
+ memex search "TODO" --json | jq '.results[].snippet'
413
+ memex list --source telegram --json | jq -r '.conversations[].title'
414
+ memex get web-1582ab51a7b7 --json > backup.json
415
+ ```
416
+
417
+ **БД открывается read-only** — безопасно запускать пока daemon-writer работает.
418
+
419
+ **Когда использовать CLI вместо MCP:**
420
+
421
+ - MCP-интеграция в твоём агенте не подключилась → `memex overview` подтвердит что сам memex здоров, проблема в MCP-config'е клиента
422
+ - Агент без MCP-поддержки (OpenCode + Kimi, любые CLI-only агенты), но с shell-доступом
423
+ - Shell-скрипты / автоматизация
424
+ - Дебаг: «вижу ли я свою историю напрямую?»
425
+
426
+ **`memex` (без аргументов)** — это MCP stdio-сервер. Это поведение по умолчанию для Claude Code / Cursor / OpenClaw через их MCP-config'и. CLI-команды активируются только при наличии распознанного subcommand'a.
427
+
428
+ ---
429
+
430
+ ## 📥 Импорт файла из произвольного пути (v0.10.8+ → v0.10.12+ MCP)
431
+
432
+ Если у тебя файл `result.json` (Telegram export) или `.jsonl` (Claude/Cowork-сессия) лежит где-нибудь в `~/Downloads/`, `~/Desktop/`, `~/projects/foo/` — **не нужно** копировать его руками в `~/.memex/inbox/`. Одна команда:
433
+
434
+ ```bash
435
+ memex import ~/projects/memex/result.json
436
+ ```
437
+
438
+ Что произойдёт:
439
+ - Авто-детект формата (Telegram JSON / HTML / Claude Code JSONL / Cowork JSONL)
440
+ - Для Telegram: проверяет твои decision-предпочтения (`allow` / `skip` / `block`)
441
+ - Новый чат → выводит preview (title, кол-во сообщений, диапазон дат, senders) и спрашивает подтверждения (`--force` чтобы импортить)
442
+ - Уже в `allowed` → импортит сразу
443
+ - В `skipped` / `blocked` → отказывается (или `--force` чтобы переопределить)
444
+ - Для Claude/Cowork JSONL — импортит сразу (своя память, нет privacy-gate)
445
+ - Идемпотентно — повторный импорт того же файла не задвоит (UNIQUE constraint)
446
+
447
+ **То же самое через AI-агента:** любой агент с MCP-соединением может вызвать `memex_import_file({path: "..."})` одним tool-call'ом, получить структурированный ответ. Это **в 100 раз дешевле по токенам** чем агент через bash руками таскает файлы в inbox и парсит логи.
448
+
449
+ ---
450
+
451
+ ## 🖥 Web-дашборд (v0.10.8+) — посмотреть память глазами
452
+
453
+ Когда хочется не звать AI, а **самому полистать** что у тебя в memex'е — есть локальный read-only веб-UI. Та же SQLite, другая поверхность.
454
+
455
+ ```bash
456
+ memex web --open # localhost:8765, откроется в браузере
457
+ memex web --port 9000 # свой порт
458
+ memex web --public --token s3cret # 0.0.0.0 с bearer-авторизацией (для туннеля)
459
+ memex web --help
460
+ ```
461
+
462
+ **5 страниц:**
463
+
464
+ - `/` — статы (messages / conversations / sources / imports), sources breakdown, callout про pending Telegram, последние 10 чатов
465
+ - `/conversations` — список с **live FTS5-поиском** через htmx (печатаешь — обновляется за 200мс), фильтры-чипы по source
466
+ - `/c/:id` — **verbatim** транскрипт chat-bubble'ами (то самое, что не делает claude-mem — он только AI-резюмирует); поиск внутри чата с подсветкой; пагинация для 1000+ сообщений
467
+ - `/pending` — Telegram-экспорты с чекбоксами; нажимаешь Import / Skip — тот же гейт privacy, что и `memex telegram import`
468
+ - `/settings` — daemon status, путь и размер БД, установленные хуки, decisions count (read-only)
469
+
470
+ **Что важно:**
471
+ - Не always-on. `memex web` поднял — Ctrl+C погасил. Никакого фонового сервера.
472
+ - Read-only. Единственные записи — это TG import / skip на `/pending`.
473
+ - Localhost-only by default. Для remote — `--public --token …`.
474
+ - Без build-step'a. Raw Node `http` + tagged template literals + htmx 14KB. Клиентский bundle ≈ 30KB (для сравнения у claude-mem ~10MB React-бандл).
475
+ - Брендирование как на лендинге (mint #6ee7b7 на тёмном).
476
+
477
+ **Когда полезно:**
478
+ - Хочешь сам прокрутить большой Telegram-чат и не вспоминать какой именно поиск ввести
479
+ - Демо коллеге — открыл вкладку, показал что у тебя реально лежит дословно (это и есть verbatim-moat — на любой чат с любого источника можно перейти и увидеть сырое, не AI-пересказ)
480
+ - Аудит pending'a с мышкой и галочками вместо `memex telegram import 1 3 5`
481
+ - Cron-friendly remote endpoint (тот же сервер потом получит multi-host sync API в v0.13+)
482
+
483
+ ---
484
+
485
+ ## 🪄 Auto-context (v0.8+) — Brian Chesky moment
486
+
487
+ Magic-фича. Когда ты открываешь Claude Code в проекте, Claude **сам** инжектит 500-1500 токенов контекста про этот проект — что ты делал недавно, какие conversations касались темы. Ты ещё ничего не спросил, а AI **уже знает**.
488
+
489
+ **Технически:** SessionStart hook в `~/.claude/settings.json`. При старте каждой Claude Code сессии хук вызывает `memex context` → memex выдаёт markdown summary → Claude получает его как system message _до_ твоего первого вопроса.
490
+
491
+ **Установка:** проще всего — `curl -fsSL https://memex.parallelclaw.ai/install.sh | bash` поставит memex + daemon + auto-context хук одной командой. Если ставил memex вручную — во время `memex-sync install` будет промпт `[Y/n]` (соглашайся, Y по default'у). Или установи хук позже:
492
+
493
+ ```bash
494
+ memex hook install # добавить хук
495
+ memex hook uninstall # удалить (только memex-запись, другие хуки сохраняются)
496
+ memex hook status # узнать текущее состояние
497
+ ```
498
+
499
+ **Посмотреть что будет инжектиться** (dry-run в текущей директории):
500
+
501
+ ```bash
502
+ memex context # markdown как для хука
503
+ memex context --json # структурированный
504
+ memex context --no-source telegram # исключить telegram (privacy)
505
+ memex context --freshness-days 30 # только последние 30 дней
506
+ ```
507
+
508
+ **Privacy:** хук ничего не отправляет наружу — это локальная инъекция в локальную Claude-сессию. Но в context могут попасть фрагменты из любых indexed sources (включая Telegram). Чтобы исключить — добавь `--no-source telegram` в команду хука (правится в `~/.claude/settings.json`).
509
+
510
+ **Где это пока не работает:** Cursor — нет native SessionStart hook'а; fallback через MCP-tool (v0.9+). Сейчас auto-context работает в **Claude Code и OpenClaw**.
511
+
512
+ ---
513
+
514
+ ## Если что-то не работает
515
+
516
+ ### Поиск пустой
517
+
518
+ 1. Вызови `memex_overview`. Внимание на статус-баннер сверху:
519
+ - 🟢 daemon работает — всё ок, может ещё не успел проиндексировать
520
+ - 🔴 daemon установлен но не работает — `launchctl load ~/Library/LaunchAgents/com.parallelclaw.memex.sync.plist`
521
+ - ⚪ daemon не установлен — самый простой способ: `curl -fsSL https://memex.parallelclaw.ai/install.sh | bash` (поставит сам всё). Или вручную: `memex-sync install`.
522
+
523
+ ### Хочу проиндексировать существующие сессии (бэкфилл)
524
+
525
+ ```bash
526
+ npx memex-sync scan
527
+ ```
528
+
529
+ Обходит `~/.claude/projects/`, Cowork-сессии, Cursor state.vscdb, и Obsidian-vault'ы один раз — ингестит всё что уже есть на диске.
530
+
531
+ ### Telegram-чаты не появляются
532
+
533
+ В Telegram **Desktop** (не mobile!): чат → меню (⋮ или ☰) → **Export chat history**.
534
+
535
+ **memex поддерживает оба формата экспорта (v0.9+):**
536
+
537
+ - **«Machine-readable JSON»** ← рекомендуется. Один файл `result.json`, чисто ингестится.
538
+ - **«HTML»** ← тоже работает (с v0.9+). Получишь директорию `ChatExport_<chat>_<date>/`.
539
+
540
+ **v0.10+ flow — privacy-first, без ручного копирования:**
541
+
542
+ 1. Сохрани экспорт куда обычно (по умолчанию `~/Downloads/Telegram Desktop/ChatExport_*`).
543
+ 2. Daemon **сам** детектит и переносит в `~/.memex/pending/`.
544
+ 3. Получишь уведомление (через 4 канала: tip в CLI, в auto-context хуке Claude, в response любого MCP-tool, optionally macOS native notification). Подробнее: `memex telegram notifications status`.
545
+ 4. Запусти `memex telegram pending` → увидишь список с превью.
546
+ 5. Импорт: `memex telegram import 1 3 5` (по индексу) или просто скажи AI агенту «импортируй family и work».
547
+ 6. Sensitive чаты можно пропустить: `memex telegram skip 4 7` — memex запомнит и не будет предлагать снова.
548
+
549
+ **Старый flow тоже работает** (для совместимости): кинь `result.json` или `ChatExport_*/` прямо в `~/.memex/inbox/` — попадёт сразу в `memex.db` без pending review.
550
+
551
+ **Modes** (`memex telegram mode <pick|auto|manual>`):
552
+ - `pick` (default): всё через pending, ты явно подтверждаешь
553
+ - `auto`: чаты из allow-list импортятся сами, новые — в pending
554
+ - `manual`: watcher выключен, только ручной inbox
555
+
556
+ Если ингест не произошёл — проверь `~/.memex/data/memex.log`. Для HTML-export'а парсер пишет actionable error если что-то не так (формат изменился у Telegram, директория повреждена, и т.д.).
557
+
558
+ **Что НЕ работает:**
559
+ - ❌ Мобильный экспорт (Telegram mobile не экспортирует структурированно)
560
+ - ❌ Скриншоты чатов
561
+ - ❌ Только-медиа чаты (без текста парсятся как `[photo]`/`[voice]` placeholders, но без content)
562
+
563
+ ### Хочу подключить новый Obsidian-vault
564
+
565
+ ```bash
566
+ npx memex-sync vault add ~/path/to/vault
567
+ ```
568
+
569
+ ### Я в Cursor, memex не видит мои Claude Code сессии
570
+
571
+ `memex_overview` покажет что захватывается. Если Claude Code не в списке источников — проверь что `~/.claude/projects/` существует на твоей машине и не пустая. Затем `npx memex-sync scan-claude` для одноразового ингеста.
572
+
573
+ ### Хочу удалить какой-то чат
574
+
575
+ ```bash
576
+ # Скрыть из дефолтных списков (рекомендуется)
577
+ memex_archive_conversation(conversation_id="tg-...")
578
+
579
+ # Или полностью удалить через sqlite
580
+ sqlite3 ~/.memex/data/memex.db "DELETE FROM messages WHERE conversation_id = '...'"
581
+ ```
582
+
583
+ ---
584
+
585
+ ## Где живёт твоя память
586
+
587
+ - **`~/.memex/data/memex.db`** — твой SQLite-архив. Это main файл. Бэкап через `cp`.
588
+ - **`~/.memex/inbox/`** — куда дроп'ать Telegram-экспорты или другие JSON для импорта
589
+ - **`~/.memex/staging/`** — внутренняя кухня daemon'a, **не трогай**
590
+ - **`~/.memex/data/conversations/`** — импортированные файлы переезжают сюда после успешного парсинга
591
+ - **`~/.memex/data/ingest.log`** — лог daemon'a (`tail -f` чтобы смотреть в реальном времени)
592
+ - **`~/.memex/config.json`** — конфиг (какие источники включены)
593
+
594
+ ---
595
+
596
+ ## Ничего не помогает?
597
+
598
+ - Issues / баги: https://github.com/parallelclaw/memex-mvp/issues
599
+ - README с архитектурой: https://github.com/parallelclaw/memex-mvp#readme
600
+ - Лендинг с 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.