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.
- package/CHANGELOG.md +204 -0
- package/HELP.md +600 -0
- package/LICENSE +21 -0
- package/MULTI_MACHINE.md +152 -0
- package/README.md +417 -0
- package/README.ru.md +740 -0
- package/SYNC.md +844 -0
- package/bot/README.md +173 -0
- package/bot/config.js +66 -0
- package/bot/inbox.js +153 -0
- package/bot/index.js +294 -0
- package/bot/nexara.js +61 -0
- package/bot/poll.js +304 -0
- package/bot/search.js +155 -0
- package/bot/telegram.js +96 -0
- package/ingest.js +2712 -0
- package/lib/cli/index.js +1987 -0
- package/lib/config.js +220 -0
- package/lib/db-init.js +158 -0
- package/lib/hook/install.js +268 -0
- package/lib/import-telegram.js +158 -0
- package/lib/ingest-file.js +779 -0
- package/lib/notify-click-action.js +281 -0
- package/lib/openclaw-channel.js +643 -0
- package/lib/parse-cursor.js +172 -0
- package/lib/parse-obsidian.js +256 -0
- package/lib/parse-telegram-html.js +384 -0
- package/lib/parse.js +175 -0
- package/lib/render-markdown.js +0 -0
- package/lib/store-doc/canonicalize.js +116 -0
- package/lib/store-doc/detect.js +209 -0
- package/lib/store-doc/extract-title.js +162 -0
- package/lib/sync/auth.js +80 -0
- package/lib/sync/cert.js +144 -0
- package/lib/sync/cli.js +906 -0
- package/lib/sync/client.js +138 -0
- package/lib/sync/config.js +130 -0
- package/lib/sync/pair.js +145 -0
- package/lib/sync/pull.js +158 -0
- package/lib/sync/push.js +305 -0
- package/lib/sync/replicate.js +335 -0
- package/lib/sync/server.js +224 -0
- package/lib/sync/service.js +726 -0
- package/lib/tasks.js +215 -0
- package/lib/telegram-decisions.js +165 -0
- package/lib/telegram-discovery.js +373 -0
- package/lib/telegram-notify.js +272 -0
- package/lib/telegram-pending.js +200 -0
- package/lib/web/index.js +265 -0
- package/lib/web/routes/conversation.js +193 -0
- package/lib/web/routes/conversations.js +180 -0
- package/lib/web/routes/dashboard.js +175 -0
- package/lib/web/routes/pending.js +277 -0
- package/lib/web/routes/settings.js +226 -0
- package/lib/web/static/style.css +393 -0
- package/lib/web/templates.js +234 -0
- package/package.json +84 -0
- package/server.js +3816 -0
- package/skills/install-memex/README.md +109 -0
- package/skills/install-memex/SKILL.md +342 -0
- package/skills/install-memex/examples.md +294 -0
- package/skills/install-memex-claw/SKILL.md +423 -0
package/README.ru.md
ADDED
|
@@ -0,0 +1,740 @@
|
|
|
1
|
+
# ParallelClaw · общая память + координация для твоих AI-агентов
|
|
2
|
+
|
|
3
|
+
> [English](README.md) · **Русский**
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/parallelclaw)
|
|
6
|
+
[](https://www.npmjs.com/package/parallelclaw)
|
|
7
|
+
[](LICENSE)
|
|
8
|
+
|
|
9
|
+
> **Одна дословная память для всех твоих AI-агентов — и слой координации, чтобы они передавали задачи друг другу.**
|
|
10
|
+
|
|
11
|
+
ParallelClaw — локальный **personal AI ops-слой** из двух уровней:
|
|
12
|
+
|
|
13
|
+
1. **Общая память (фундамент, уже работает).** Локальный MCP-сервер индексирует **все твои разговоры с AI** — Claude Code, Claude Cowork, Cursor, OpenClaw, Hermes, заметки Obsidian и выбранные Telegram-чаты — в один SQLite + FTS5-корпус и отдаёт их **любому MCP-совместимому клиенту**.
|
|
14
|
+
2. **Координация (направление, разворачивается).** Поверх общей памяти любой твой агент может **передать задачу любому другому** — между инструментами и машинами. Она выполнится, когда тот агент доступен; результат вернётся туда, где ты спросил. Транспорт (меж-машинный синк + происхождение каждой записи) уже работает; turnkey-цикл делегирования разворачивается.
|
|
15
|
+
|
|
16
|
+
Никакого облака. Никакого аккаунта. Только твой ноут.
|
|
17
|
+
|
|
18
|
+
> **Про имена CLI:** бинарь — `parallelclaw` (короткий алиас `pclaw`). Legacy-команды `memex` / `memex-sync`, каталог данных `~/.memex` и имена MCP-тулов `memex_*` сохранены для обратной совместимости — поэтому примеры ниже с `memex …` работают дословно.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Как это работает
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
~/.memex/inbox/ ← кладёшь сюда экспорты (или симлинк на Claude Code .jsonl)
|
|
26
|
+
↓ chokidar watcher
|
|
27
|
+
↓
|
|
28
|
+
parser (Telegram JSON / Claude Code JSONL — flat и nested)
|
|
29
|
+
↓
|
|
30
|
+
SQLite + FTS5 (~/.memex/data/memex.db)
|
|
31
|
+
↓
|
|
32
|
+
MCP server (stdio JSON-RPC)
|
|
33
|
+
↓
|
|
34
|
+
любой клиент → 8 tool'ов:
|
|
35
|
+
• memex_overview — снэпшот корпуса + статус auto-capture
|
|
36
|
+
• memex_search — full-text поиск (с дедупом по чатам)
|
|
37
|
+
• memex_recent — последние N сообщений
|
|
38
|
+
• memex_list_conversations — список чатов по recency
|
|
39
|
+
• memex_get_conversation — полный транскрипт чата
|
|
40
|
+
• memex_archive_conversation — скрыть чат из выдачи (но не из поиска)
|
|
41
|
+
• memex_status — здоровье memex-sync daemon'а
|
|
42
|
+
• memex_list_sources — что импортировано
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Спроси своему агенту «помнишь как мы решили проблему с миграцией Postgres?» — он **сам** вызовет `memex_search`, найдёт релевантное и ответит с реальным контекстом.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Requirements / Требования
|
|
50
|
+
|
|
51
|
+
### Обязательное (без этого memex не запустится)
|
|
52
|
+
|
|
53
|
+
- **Node.js 20.x – 24.x** (рекомендуется **22 LTS**). В репо есть `.nvmrc` со значением `22` — если у тебя `nvm`, выполни `nvm use` в директории проекта.
|
|
54
|
+
- **macOS 12+ или Linux** с inotify (Windows — только через WSL).
|
|
55
|
+
- **Xcode Command Line Tools** на macOS (`xcode-select --install`) — нужны для нативной сборки `better-sqlite3`, если для твоей Node-версии нет prebuilt binaries.
|
|
56
|
+
- **MCP-совместимый AI-клиент** для использования: Claude Code, Cursor, OpenClaw или любой другой клиент с поддержкой MCP. Без этого memex стрит индекс, но обращаться к нему будет некому.
|
|
57
|
+
|
|
58
|
+
### Опциональное (по ситуации)
|
|
59
|
+
|
|
60
|
+
- **Telegram Desktop** — если хочешь индексировать TG-чаты. Мобильное приложение Telegram **не умеет** экспорт; нужен именно Desktop-клиент.
|
|
61
|
+
- **iCloud Drive / Syncthing** — если хочешь sync БД между несколькими своими ноутами.
|
|
62
|
+
- **Ollama / llama.cpp** — на будущее для локального LLM-extraction слоя (профильные факты). Сейчас в roadmap'е.
|
|
63
|
+
|
|
64
|
+
### Аппаратные требования (small)
|
|
65
|
+
|
|
66
|
+
- **Disk space:** ~5-30 МБ типичный корпус за год. Большие Telegram-экспорты с медиа — отдельно, до сотен МБ.
|
|
67
|
+
- **RAM:** daemon ~30 МБ, MCP-сервер ~50 МБ. Незаметно.
|
|
68
|
+
- **CPU:** на холостом ходу < 1%. Импорт сессии — миллисекунды.
|
|
69
|
+
|
|
70
|
+
### Известные ограничения
|
|
71
|
+
|
|
72
|
+
| Что **не** работает | Почему |
|
|
73
|
+
|---|---|
|
|
74
|
+
| ❌ Web-only AI (ChatGPT в браузере, Claude.ai web) | Эти сессии живут на серверах вендора, на твоём диске их нет |
|
|
75
|
+
| ❌ Мобильные AI-приложения (ChatGPT iOS, Claude Android) | Phone-data не пишется на твой компьютер |
|
|
76
|
+
| ❌ Сессии на VPS / в облаке | Memex читает локальную файловую систему |
|
|
77
|
+
| ❌ Windows напрямую | Только через WSL (chokidar на Win работает плохо без inotify-shim) |
|
|
78
|
+
| ❌ Auto-capture daemon на Linux | `npx memex-sync install` работает только на macOS (LaunchAgent). На Linux запускай daemon в foreground или сделай свой systemd unit |
|
|
79
|
+
| ❌ Mobile capture сегодня | В roadmap'е — Telegram-бот в `bot/` директории |
|
|
80
|
+
|
|
81
|
+
### Положительное «ограничение»
|
|
82
|
+
|
|
83
|
+
✅ **Internet не нужен.** Memex после установки работает полностью офлайн. Никаких phone-home, никаких API-ключей, никаких облачных зависимостей. Это feature, не bug.
|
|
84
|
+
|
|
85
|
+
> ⚠ **Node 25+ известная проблема.** На bleeding-edge Node (25.x) `better-sqlite3` ещё не имеет prebuilt binaries — fallback на компиляцию из исходников падает на macOS с `fatal error: 'climits' file not found`. Решение: `nvm install 22 && nvm use 22`, потом `npm install`.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Установка за 60 секунд
|
|
90
|
+
|
|
91
|
+
**Установка в одну строку (рекомендуется):**
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
curl -fsSL https://memex.parallelclaw.ai/install.sh | bash
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Эта команда сама делает:
|
|
98
|
+
1. Проверяет Node ≥ 20.
|
|
99
|
+
2. Запускает `npm install -g parallelclaw`, и если ловит `EACCES` — сама переносит npm prefix в `~/.npm-global` (sudo больше не нужен — никогда, ни для одного `npm install -g`).
|
|
100
|
+
3. Поднимает auto-capture daemon (`memex-sync install`) **вместе с** Brian Chesky auto-context хуком (v0.8+) в `~/.claude/settings.json` (другие хуки не трогает).
|
|
101
|
+
4. Бэкфиллит историю (`memex-sync scan`) — memex сразу знает о твоих прошлых сессиях.
|
|
102
|
+
5. Если на машине найден Claude Code CLI (`claude`), вызывает `claude mcp add memex --scope user -- memex` — MCP прописывается автоматом.
|
|
103
|
+
|
|
104
|
+
Идемпотентно — безопасно перезапускать. Хочешь сначала посмотреть скрипт: `curl -fsSL https://memex.parallelclaw.ai/install.sh | less`.
|
|
105
|
+
|
|
106
|
+
**Или вручную:**
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
npm install -g parallelclaw
|
|
110
|
+
memex-sync install # macOS LaunchAgent для auto-capture
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Если `npm install -g` упирается в `EACCES` (системный Node на macOS) — два пути:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
# A. Один раз — починить prefix, чтоб больше не страдать:
|
|
117
|
+
mkdir -p ~/.npm-global
|
|
118
|
+
npm config set prefix ~/.npm-global
|
|
119
|
+
echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.zshrc
|
|
120
|
+
source ~/.zshrc
|
|
121
|
+
|
|
122
|
+
# B. Или просто разово через sudo:
|
|
123
|
+
sudo npm install -g parallelclaw
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**Альтернатива без global install** — `npx -p parallelclaw memex-sync install` ставит всё во временный кэш, ничего глобально не оставляет.
|
|
127
|
+
|
|
128
|
+
После установки `memex-sync install` поднимет фоновый daemon (`~/.memex/{inbox,data}/` создадутся автоматически при первом запуске).
|
|
129
|
+
|
|
130
|
+
### Установка через AI-скилл (Claude Code / OpenClaw)
|
|
131
|
+
|
|
132
|
+
Если хочешь чтобы агент сам всё сделал — закинь [install-memex skill](skills/install-memex/) в `~/.claude/skills/`:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
mkdir -p ~/.claude/skills
|
|
136
|
+
curl -fsSL https://raw.githubusercontent.com/parallelclaw/memex-mvp/main/skills/install-memex/SKILL.md \
|
|
137
|
+
-o ~/.claude/skills/install-memex/SKILL.md
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Затем в Claude Code (или любом Skills-aware агенте) скажи:
|
|
141
|
+
|
|
142
|
+
> установи memex
|
|
143
|
+
|
|
144
|
+
…или `/install-memex`. Агент сам сделает `npm install`, пропишет MCP-config, поднимет daemon и проверит что всё работает — ~2 минуты.
|
|
145
|
+
|
|
146
|
+
### Сохранение URL'ов в memex (v0.6+)
|
|
147
|
+
|
|
148
|
+
После установки в любом MCP-агенте (Claude Code, Cursor, OpenClaw) можно сохранять **web-страницы, AI-chat share'ы и pasted-тексты** прямо в memex-память:
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
Сохрани https://www.perplexity.ai/share/<id> в memex
|
|
152
|
+
Добавь эту статью в memex: https://example.com/article
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Агент сам fetch'ит страницу через свой WebFetch — для Cloudflare-защищённых сайтов (Perplexity, npm.com, Twitter, Medium) автоматически falls back на `r.jina.ai` proxy (memex учит агента этому трюку через tool description). Затем агент вызывает `memex_store_document`, который хранит контент verbatim как conversation с `source: "web"`.
|
|
156
|
+
|
|
157
|
+
**Memex остаётся 100% локальным** — fetch делает агент, memex только хранит. Никаких outbound network calls со стороны memex.
|
|
158
|
+
|
|
159
|
+
Полное руководство и edge cases (private Perplexity, paywall, login-walls): [HELP.md §8](HELP.md).
|
|
160
|
+
|
|
161
|
+
### Терминальный CLI (v0.7+) — запросы к memex без MCP
|
|
162
|
+
|
|
163
|
+
Тот же бинарь `memex`, который работает как MCP-сервер, имеет **terminal-режим** для прямых запросов. Полезно когда MCP не настроен, когда хочешь пайпить результаты в shell-скрипты, или дебажить MCP-конфиг:
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
memex search "Postgres миграция" # полнотекстовый поиск
|
|
167
|
+
memex search "Q2 deck" --chat "Memex Bot" # сузить до конкретного чата по title
|
|
168
|
+
memex search "JWT" --as-of 2026-05-01 # v0.8.1: time-travel — только до даты
|
|
169
|
+
memex when "Brian Chesky" # v0.8.1: «когда мы это обсуждали» — даты + чаты
|
|
170
|
+
memex recent --limit 5 # последние 5 сообщений из всех источников
|
|
171
|
+
memex list --source web # все сохранённые URL'ы
|
|
172
|
+
memex get web-1582ab51a7b7 # полный контент одной conversation
|
|
173
|
+
memex overview # snapshot корпуса + v0.8.1: capture streak
|
|
174
|
+
memex projects # уникальные project_paths
|
|
175
|
+
memex help # полное руководство (HELP.md)
|
|
176
|
+
memex --help # справка по командам
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
У каждого query-subcommand'a есть `--json` для machine-readable вывода: `memex search foo --json | jq '.results[].snippet'`. БД открывается **read-only** — безопасно запускать пока daemon пишет.
|
|
180
|
+
|
|
181
|
+
При запуске **без аргументов** (`memex`) бинарь по-прежнему работает как MCP stdio server (как и вызывают его Claude Code / Cursor / OpenClaw из своих конфигов). CLI-режим и MCP-режим — один и тот же пакет, без дополнительной установки.
|
|
182
|
+
|
|
183
|
+
**Использовать CLI, когда:**
|
|
184
|
+
- MCP-интеграция не подцепилась к твоему агенту → `memex overview` подтвердит что сам memex здоров
|
|
185
|
+
- Агент без MCP-поддержки, но с shell-доступом
|
|
186
|
+
- Хочешь пайпить результаты: `memex search foo --json | jq ...`
|
|
187
|
+
- Хочешь сдампить полный transcript в stdout для context'a
|
|
188
|
+
|
|
189
|
+
### Auto-context (v0.8+) — Claude уже знает что ты делал
|
|
190
|
+
|
|
191
|
+
После `memex-sync install` появляется промпт про **auto-context**. Если согласишься — memex добавит SessionStart хук в `~/.claude/settings.json`. Когда ты потом открываешь Claude Code в каком-то проекте, Claude **сам подгружает 500-1500 токенов контекста** про этот проект — что ты делал недавно, какие conversations его касались, какие связанные темы всплывали. Никаких вопросов, никаких tool-call'ов, просто Claude **знает**.
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
# Добавить/удалить хук вне install-flow:
|
|
195
|
+
memex hook install # добавить SessionStart хук (idempotent)
|
|
196
|
+
memex hook uninstall # удалить только memex-запись, остальные хуки не трогает
|
|
197
|
+
memex hook status # показать текущее состояние
|
|
198
|
+
|
|
199
|
+
# Посмотреть что будет инжектиться:
|
|
200
|
+
memex context # dry-run для текущей директории
|
|
201
|
+
memex context --pwd /path # для другого проекта
|
|
202
|
+
memex context --no-source telegram # исключить источник
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Хук **сохраняет существующие хуки** (gstack, твои кастомные) — добавляет только свою запись.
|
|
206
|
+
|
|
207
|
+
**Сейчас native SessionStart есть только в Claude Code.** Для Cursor fallback через MCP-tool доступен (v0.9+).
|
|
208
|
+
|
|
209
|
+
### Подключение к Claude Code
|
|
210
|
+
|
|
211
|
+
Сначала возьми **два абсолютных пути** в терминале:
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
pwd # → путь до memex-mvp (из директории memex-mvp)
|
|
215
|
+
which node # → путь до бинарника node (например /Users/you/.nvm/versions/node/v24.15.0/bin/node)
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
В `~/.claude/config.json` добавь, подставив оба пути:
|
|
219
|
+
|
|
220
|
+
```json
|
|
221
|
+
{
|
|
222
|
+
"mcpServers": {
|
|
223
|
+
"memex": {
|
|
224
|
+
"command": "/абсолютный/путь/до/node",
|
|
225
|
+
"args": ["/абсолютный/путь/до/memex-mvp/server.js"]
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**Почему абсолютный путь к node, а не просто `"node"`?** GUI-приложения (Cursor, Claude Desktop) на macOS часто **не наследуют PATH из shell'a** (`~/.zshrc`). С `"command": "node"` MCP-сервер падает с `spawn node ENOENT` — особенно если node поставлен через nvm. Всегда используй путь из `which node`.
|
|
232
|
+
|
|
233
|
+
Перезапусти Claude Code. Готово — у тебя в session появятся `memex_*` tool'ы.
|
|
234
|
+
|
|
235
|
+
### Подключение к Cursor / OpenClaw
|
|
236
|
+
|
|
237
|
+
Каждый клиент имеет свой `mcpServers` config (у Cursor — `~/.cursor/mcp.json`; для OpenClaw — отдельный гайд memex.parallelclaw.ai/openclaw/). Структура та же — `command` = абсолютный путь до node, `args` = `[путь к server.js]`. Та же ENOENT-проблема актуальна для всех GUI-MCP клиентов.
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## Что поддерживается
|
|
242
|
+
|
|
243
|
+
| Источник | Формат | Статус |
|
|
244
|
+
|----------|--------|--------|
|
|
245
|
+
| **Claude Code** | `*.jsonl` сессии в `~/.claude/projects/` | ✅ работает (nested + flat форматы) |
|
|
246
|
+
| **Claude Cowork** | `cowork-*.jsonl` (через filename prefix), включая subagents | ✅ работает |
|
|
247
|
+
| **Cursor IDE** (Composer + Chat) | SQLite `state.vscdb` в `~/Library/Application Support/Cursor/` | ✅ работает (poll каждые 5 мин) |
|
|
248
|
+
| **Obsidian** vault notes | `.md` файлы + YAML frontmatter | ✅ работает (FSEvents, hash-based dedupe) |
|
|
249
|
+
| **Telegram (JSON / HTML export)** | `result.json` или `ChatExport_*/` из Telegram Desktop | ✅ работает — **v0.10+: авто-детект.** Daemon следит за `~/Downloads/Telegram Desktop/`, экспорты сами попадают в pending, юзер per-chat подтверждает |
|
|
250
|
+
| **Telegram (live)** | бот `memex-bot` ловит твои сообщения / форварды | ✅ работает |
|
|
251
|
+
| **Web-страницы, AI-share'ы, paste'ы** | `memex_store_document` — агент fetch'ит, memex хранит verbatim (v0.6+) | ✅ работает |
|
|
252
|
+
| Claude.ai web export | будет в v0.7 | — |
|
|
253
|
+
| ChatGPT export | будет в v0.7 | — |
|
|
254
|
+
| Apple Notes | будет в v0.7 | — |
|
|
255
|
+
|
|
256
|
+
### Filename convention для inbox-файлов
|
|
257
|
+
|
|
258
|
+
Парсер различает источники по префиксу имени файла в inbox:
|
|
259
|
+
- `code-*.jsonl` или произвольное имя → tagged как `claude-code`
|
|
260
|
+
- `cowork-*.jsonl` → tagged как `claude-cowork`
|
|
261
|
+
- `cursor-*.jsonl` → tagged как `cursor`
|
|
262
|
+
- `obsidian-*.jsonl` → tagged как `obsidian`
|
|
263
|
+
|
|
264
|
+
Это позволяет фильтровать `memex_search` по конкретной экосистеме (`source: "cursor"`, `source: "obsidian"` и т.д.).
|
|
265
|
+
|
|
266
|
+
### Cursor IDE source — особый случай
|
|
267
|
+
|
|
268
|
+
Cursor хранит историю в SQLite (`state.vscdb`), не в JSONL-файлах. memex-sync daemon **поллит** эту БД каждые 5 минут (FSEvents бессмысленно — Cursor пишет в WAL практически на каждый keystroke). При обнаружении composer'а с обновлённым `lastUpdatedAt` daemon экспортит его dialogue (без thinking-bubbles и tool-call'ов) в inbox как `cursor-<short>.jsonl`. Заголовок берётся из `composerData.name` напрямую.
|
|
269
|
+
|
|
270
|
+
Поддерживаемые ОС для Cursor: macOS, Linux, Windows (пути в `lib/parse-cursor.js`).
|
|
271
|
+
|
|
272
|
+
### Obsidian source — заметки как первоклассные сущности
|
|
273
|
+
|
|
274
|
+
memex автоматически находит Obsidian-vault'ы в стандартных местах (`~/Documents/`, `~/Obsidian/`, `~/Library/Mobile Documents/iCloud~md~obsidian/Documents/` для iCloud-синка). Vault — это любая папка с `.obsidian/` подпапкой внутри. Можно явно указать пути через env-переменную:
|
|
275
|
+
|
|
276
|
+
```bash
|
|
277
|
+
export MEMEX_OBSIDIAN_VAULTS=/path/to/vault1,/path/to/vault2
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
Каждая `.md` нота → одна conversation в memex. Title берётся из `title:` frontmatter → первого `# H1` → имени файла. YAML frontmatter парсится для метаданных (дат, тегов). Body индексируется в FTS5 как один user-сообщение.
|
|
281
|
+
|
|
282
|
+
**Privacy**:
|
|
283
|
+
- Обнаружение vault'ов opt-in (только стандартные пути; кастомные через env var)
|
|
284
|
+
- Игнорируются: `.obsidian/`, `.trash/`, `.git/`, `.DS_Store`, `*.sync-conflict-*`
|
|
285
|
+
- Per-note opt-out через frontmatter `memex: false`
|
|
286
|
+
- Hash-based dedupe — пишем в inbox только когда содержание реально изменилось, не на каждый mtime-touch
|
|
287
|
+
|
|
288
|
+
### Bulk import за одну команду
|
|
289
|
+
|
|
290
|
+
memex полностью самодостаточен — не нужен Python, не нужны внешние CLI:
|
|
291
|
+
|
|
292
|
+
```bash
|
|
293
|
+
npx memex-sync scan # Claude Code + Cowork + Cursor + Obsidian сразу
|
|
294
|
+
npx memex-sync scan-claude # только Claude Code + Cowork
|
|
295
|
+
npx memex-sync scan-cursor # только Cursor
|
|
296
|
+
npx memex-sync scan-obsidian # только Obsidian vault(s)
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
Сканирует все источники один раз, эмитит JSONL в inbox, выходит. Идемпотентен — повторный запуск пропускает неизменённые файлы через state-cache. Удобно для cron, manual-первого-импорта, или дебага без daemon'а.
|
|
300
|
+
|
|
301
|
+
### Two pieces
|
|
302
|
+
|
|
303
|
+
memex поставляется в виде **двух независимых частей:**
|
|
304
|
+
|
|
305
|
+
- **MCP server** (`server.js`) — пассивная база знаний, всегда доступна после `npm install`. Отдаёт 8 tool'ов любому MCP-агенту.
|
|
306
|
+
- **memex-sync** (`ingest.js`) — **опциональный** фоновый daemon. Watch'ит `~/.claude/projects/` (Code) и `~/Library/Application Support/Claude/local-agent-mode-sessions/` (Cowork) через FSEvents и автоматически добавляет новые сессии в память в реальном времени.
|
|
307
|
+
|
|
308
|
+
> **Без memex-sync память замёрзла** на момент последнего ручного импорта. **С ним** — каждая новая сессия становится searchable за ~1.5 секунды.
|
|
309
|
+
|
|
310
|
+
### Включить auto-capture (memex-sync)
|
|
311
|
+
|
|
312
|
+
Одна команда — и dameon регистрируется как macOS LaunchAgent, автозапускается при логине, переживает перезагрузку и крэши:
|
|
313
|
+
|
|
314
|
+
```bash
|
|
315
|
+
npx memex-sync install
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
Дальше:
|
|
319
|
+
|
|
320
|
+
```bash
|
|
321
|
+
npx memex-sync status # три состояния: installed / running / watching
|
|
322
|
+
npx memex-sync logs # tail -f лог в реальном времени
|
|
323
|
+
npx memex-sync uninstall # снять с автозапуска (БД остаётся)
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
Без `install` daemon можно гонять и в foreground'е (для отладки):
|
|
327
|
+
|
|
328
|
+
```bash
|
|
329
|
+
npx memex-sync # = serve, в foreground
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### Что под капотом
|
|
333
|
+
|
|
334
|
+
- chokidar (FSEvents на macOS, inotify на Linux) на обе source-директории
|
|
335
|
+
- Per-file state в `~/.memex/data/ingest-state.json` (sha1 первых 256B + size + mtime) — повторный запуск пропускает неизменённые файлы
|
|
336
|
+
- Safety rescan каждые 30 минут — ловит пропущенные FSEvents после sleep/lid-close
|
|
337
|
+
- Atomic writes (temp + rename) в `~/.memex/inbox/` — никаких частичных JSONL
|
|
338
|
+
- Idempotent: новые сообщения идут через UNIQUE(msg_id), дубли отсекаются на уровне БД
|
|
339
|
+
- LaunchAgent работает с `LowPriorityIO=true`, `Nice=5` — не мешает основной работе ноута
|
|
340
|
+
|
|
341
|
+
memex MCP server и memex-sync — два независимых процесса. MCP server отвечает агентам, memex-sync кормит inbox. Связи нет, кроме общей файловой системы.
|
|
342
|
+
|
|
343
|
+
### Управление источниками
|
|
344
|
+
|
|
345
|
+
По умолчанию memex-sync **собирает всё что находит** на машине: Claude Code, Cowork, Cursor, Obsidian (auto-detect). Это удобно для quick-start, но любой источник можно отключить через CLI без удаления daemon'а:
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
npx memex-sync sources # показать что сейчас включено
|
|
349
|
+
npx memex-sync sources cursor disable # выключить cursor
|
|
350
|
+
npx memex-sync sources cursor enable # вернуть
|
|
351
|
+
npx memex-sync vault add /path/to/MyVault # явный список Obsidian-vault'ов
|
|
352
|
+
npx memex-sync vault remove /path # убрать
|
|
353
|
+
npx memex-sync restart # применить изменения
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
Конфиг живёт в `~/.memex/config.json`. Файла нет → сборка по дефолту. Как только что-то изменено через CLI — файл создаётся, daemon его уважает.
|
|
357
|
+
|
|
358
|
+
Privacy: agent через `memex_sources_status` сам показывает что именно отслеживается, и **никогда не выключает источники сам** — это всегда команда от пользователя.
|
|
359
|
+
|
|
360
|
+
### Подсказка для агента
|
|
361
|
+
|
|
362
|
+
Если ты подключил memex к Claude Code/Cursor/OpenClaw и каждый раз когда вызываешь `memex_overview` видишь сверху ⚪ или 🔴 — это значит auto-capture не включён. Агент сам это увидит и предложит юзеру команду `npx memex-sync install`. Это та самая «один раз и забыл» механика — без README-чтения.
|
|
363
|
+
|
|
364
|
+
---
|
|
365
|
+
|
|
366
|
+
## Между устройствами / Across devices
|
|
367
|
+
|
|
368
|
+
### По-русски
|
|
369
|
+
|
|
370
|
+
**Встроенный настоящий синк (v0.13) — два copy-paste шага.** Ноут с
|
|
371
|
+
Claude/Cursor + сервер с агентом (OpenClaw и т.п.) связывают память без
|
|
372
|
+
публичных портов, правки фаервола, ручных SSH-ключей и написания сервисов.
|
|
373
|
+
|
|
374
|
+
**Шаг 1 — кинь этот промпт агенту на сервере:**
|
|
375
|
+
|
|
376
|
+
```
|
|
377
|
+
Настрой memex-sync как хаб и выдай join-токен для моего ноута:
|
|
378
|
+
1. npm install -g parallelclaw@latest (пропусти, если уже стоит)
|
|
379
|
+
2. memex-sync sync-server install --bind 127.0.0.1
|
|
380
|
+
3. memex-sync sync-server invite --join
|
|
381
|
+
Пришли мне строку memex-join:...
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
**Шаг 2 — одна команда на ноуте:**
|
|
385
|
+
|
|
386
|
+
```bash
|
|
387
|
+
memex-sync sync-join memex-join:eyJ2...
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
Эта команда сама: проверяет SSH (нет доступа — печатает твой pubkey и что с
|
|
391
|
+
ним сделать), поднимает **самовосстанавливающийся** туннель (переживает сон,
|
|
392
|
+
смену сети, ребут), пиннит сертификат сервера, делает первый синк
|
|
393
|
+
(прерванный — продолжается с места обрыва), ставит авто-синк каждые 15 минут
|
|
394
|
+
и ежечасный watchdog, и в конце **доказывает** петлю — прогоняет тестовую
|
|
395
|
+
заметку туда-обратно и печатает время. Сервер остаётся на loopback; весь
|
|
396
|
+
трафик едет внутри SSH (порт 22). Бесконфликтно: verbatim-память append-only,
|
|
397
|
+
мёржить нечего.
|
|
398
|
+
|
|
399
|
+
Mobile: пересылай сообщения в Telegram-бота (`bot/`) — попадут на основную
|
|
400
|
+
машину и разойдутся синком. Продвинутые топологии (мульти-нода, reverse-туннели,
|
|
401
|
+
транзит-хабы) — в [SYNC.md](SYNC.md). Legacy file-sync рецепты (iCloud/Syncthing,
|
|
402
|
+
single-writer, DEPRECATED) — в [MULTI_MACHINE.md](MULTI_MACHINE.md).
|
|
403
|
+
|
|
404
|
+
### In English
|
|
405
|
+
|
|
406
|
+
**Built-in real sync (v0.13) — two copy-paste steps.** A laptop with
|
|
407
|
+
Claude/Cursor + a server with an agent connect their memory with no public
|
|
408
|
+
ports, no firewall changes, no manual SSH keys, no hand-written services.
|
|
409
|
+
|
|
410
|
+
**Step 1 — paste to the agent on the server:**
|
|
411
|
+
|
|
412
|
+
```
|
|
413
|
+
Set up memex sync as a hub and give me a join token for my laptop:
|
|
414
|
+
1. npm install -g parallelclaw@latest (skip if installed)
|
|
415
|
+
2. memex-sync sync-server install --bind 127.0.0.1
|
|
416
|
+
3. memex-sync sync-server invite --join
|
|
417
|
+
Send me the memex-join:... line.
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
**Step 2 — one command on the laptop:**
|
|
421
|
+
|
|
422
|
+
```bash
|
|
423
|
+
memex-sync sync-join memex-join:eyJ2...
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
It verifies SSH (or prints your pubkey + instructions), builds a self-healing
|
|
427
|
+
tunnel (survives sleep/network changes/reboot), pins the server cert, runs the
|
|
428
|
+
first sync (resumable), installs 15-min auto-sync + an hourly watchdog, and
|
|
429
|
+
finishes by **proving** the loop with a round-tripped test note. The server
|
|
430
|
+
stays on loopback; everything rides inside SSH on port 22. Conflict-free:
|
|
431
|
+
verbatim memory is append-only — nothing to merge.
|
|
432
|
+
|
|
433
|
+
Advanced topologies (multi-node, reverse tunnels, transit hubs) — see
|
|
434
|
+
[SYNC.md](SYNC.md). Legacy file-sync recipes (single-writer, DEPRECATED) —
|
|
435
|
+
[MULTI_MACHINE.md](MULTI_MACHINE.md).
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
|
|
439
|
+
## Миграция между устройствами / One-time migration
|
|
440
|
+
|
|
441
|
+
> **Не то же самое что sync.** Это **разовый перенос** всей истории со старого ноута на новый — например при покупке нового мака. Sync — это паттерн в секции «Между устройствами» выше, когда два ноута постоянно делят одну БД через iCloud / Syncthing.
|
|
442
|
+
|
|
443
|
+
### По-русски
|
|
444
|
+
|
|
445
|
+
memex.db — обычный SQLite-файл, переезжает как любой документ.
|
|
446
|
+
|
|
447
|
+
**На старом ноуте:**
|
|
448
|
+
|
|
449
|
+
```bash
|
|
450
|
+
# 1. Останови daemon чтобы не было активной записи
|
|
451
|
+
launchctl unload ~/Library/LaunchAgents/com.parallelclaw.memex.sync.plist 2>/dev/null
|
|
452
|
+
|
|
453
|
+
# 2. Сверни WAL в основной файл (чтобы не потерять свежие записи)
|
|
454
|
+
sqlite3 ~/.memex/data/memex.db "PRAGMA wal_checkpoint(TRUNCATE)"
|
|
455
|
+
|
|
456
|
+
# 3. Скопируй ОДИН файл (AirDrop / scp / iCloud / external USB)
|
|
457
|
+
cp ~/.memex/data/memex.db ~/Desktop/memex-backup.db
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
⚠ Копируй **только `memex.db`** — НЕ копируй `memex.db-wal`, `memex.db-shm` (временные, после checkpoint'a не нужны) и НЕ копируй `~/.memex/data/ingest-state.json` (machine-specific — там пути и fingerprint'ы старого ноута).
|
|
461
|
+
|
|
462
|
+
**На новом ноуте:**
|
|
463
|
+
|
|
464
|
+
```bash
|
|
465
|
+
# 1. Установи memex как при первой установке
|
|
466
|
+
git clone https://github.com/parallelclaw/memex-mvp
|
|
467
|
+
cd memex-mvp && npm install
|
|
468
|
+
|
|
469
|
+
# 2. Положи DB-файл
|
|
470
|
+
mkdir -p ~/.memex/data
|
|
471
|
+
cp /path/to/memex-backup.db ~/.memex/data/memex.db
|
|
472
|
+
|
|
473
|
+
# 3. Пропиши MCP-конфиг с абсолютным путём к node (см. секцию "Подключение к Claude Code")
|
|
474
|
+
|
|
475
|
+
# 4. Перезапусти Cursor / Claude Code и вызови memex_overview
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
**Что переедет:** все разговоры, FTS5-индекс, Telegram-экспорты, conversation IDs. Поиск работает сразу.
|
|
479
|
+
|
|
480
|
+
**Что НЕ переедет автоматически:**
|
|
481
|
+
- Новые Claude Code / Cursor сессии нового ноута — это уже файлы нового ноута. Решение: `npx memex-sync install` на новом — daemon начнёт ловить новые сессии и добавлять их в ту же БД.
|
|
482
|
+
- `project_path` в существующих записях содержит **старые пути** (`/Users/oldname/...`). Memex не сломается, но `memex_list_projects` покажет старые пути. При необходимости — `UPDATE conversations SET project_path = REPLACE(...)` руками.
|
|
483
|
+
|
|
484
|
+
### In English
|
|
485
|
+
|
|
486
|
+
memex.db is a regular SQLite file — moves like any document.
|
|
487
|
+
|
|
488
|
+
**On the old laptop:**
|
|
489
|
+
|
|
490
|
+
```bash
|
|
491
|
+
# 1. Stop the daemon to prevent active writes
|
|
492
|
+
launchctl unload ~/Library/LaunchAgents/com.parallelclaw.memex.sync.plist 2>/dev/null
|
|
493
|
+
|
|
494
|
+
# 2. Checkpoint the WAL into the main file (don't lose recent writes)
|
|
495
|
+
sqlite3 ~/.memex/data/memex.db "PRAGMA wal_checkpoint(TRUNCATE)"
|
|
496
|
+
|
|
497
|
+
# 3. Copy ONE file (AirDrop / scp / iCloud / external USB)
|
|
498
|
+
cp ~/.memex/data/memex.db ~/Desktop/memex-backup.db
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
⚠ Copy **only `memex.db`** — do NOT copy `memex.db-wal`, `memex.db-shm` (transient, unneeded after checkpoint), and do NOT copy `~/.memex/data/ingest-state.json` (machine-specific — it contains paths and fingerprints from the old laptop).
|
|
502
|
+
|
|
503
|
+
**On the new laptop:**
|
|
504
|
+
|
|
505
|
+
```bash
|
|
506
|
+
# 1. Install memex like a first-time install
|
|
507
|
+
git clone https://github.com/parallelclaw/memex-mvp
|
|
508
|
+
cd memex-mvp && npm install
|
|
509
|
+
|
|
510
|
+
# 2. Place the DB file
|
|
511
|
+
mkdir -p ~/.memex/data
|
|
512
|
+
cp /path/to/memex-backup.db ~/.memex/data/memex.db
|
|
513
|
+
|
|
514
|
+
# 3. Wire MCP config with absolute path to node (see "Connecting to Claude Code" above)
|
|
515
|
+
|
|
516
|
+
# 4. Restart Cursor / Claude Code and call memex_overview
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
**What transfers:** all conversations, FTS5 index, Telegram exports, conversation IDs. Search works immediately.
|
|
520
|
+
|
|
521
|
+
**What does NOT auto-transfer:**
|
|
522
|
+
- New Claude Code / Cursor sessions on the new laptop — those are new files on the new machine. Solution: run `npx memex-sync install` on the new laptop — the daemon will start catching new sessions and adding them to the same DB.
|
|
523
|
+
- `project_path` in existing rows still contains **old paths** (`/Users/oldname/...`). Memex won't break, but `memex_list_projects` will show old paths. If needed — `UPDATE conversations SET project_path = REPLACE(...)` manually.
|
|
524
|
+
|
|
525
|
+
---
|
|
526
|
+
|
|
527
|
+
## Приватность и безопасность / Privacy & Security
|
|
528
|
+
|
|
529
|
+
### По-русски
|
|
530
|
+
|
|
531
|
+
Один файл со всеми твоими AI-разговорами — звучит страшнее, чем есть.
|
|
532
|
+
|
|
533
|
+
✅ **Что memex делает:** Живёт только на твоей машине, никуда не звонит, без API-ключей, без network access. OS-level права на файлы — читает только твой user.
|
|
534
|
+
|
|
535
|
+
❌ **Что не делает:** Не шифрует БД, не редактирует секреты которые ты вставлял в чаты с AI, нет пароля на сам memex.
|
|
536
|
+
|
|
537
|
+
📦 **Не добавляет риск — концентрирует.** Твоя AI-история **уже** на диске в plain text — Claude Code JSONL, Cursor `state.vscdb`, Cowork session files, Obsidian `.md`, Telegram local DB. Memex консолидирует их в один SQLite-файл. Те же данные, в одном месте вместо пяти. Attack surface не растёт — растёт видимость.
|
|
538
|
+
|
|
539
|
+
🛡️ **Топ-рекомендация: FileVault.** На macOS: `System Settings → Privacy & Security → FileVault → Turn On`. Шифрует весь диск AES-256 на уровне OS. Без твоего пароля диск нечитаем — закрывает ~80% реалистичных угроз (украденный ноут, кража backup, malware без root). На Linux то же делает LUKS. Сделай это **прежде** чем волноваться про app-level шифрование.
|
|
540
|
+
|
|
541
|
+
### In English
|
|
542
|
+
|
|
543
|
+
One file with all your AI conversations — sounds scarier than it is.
|
|
544
|
+
|
|
545
|
+
✅ **What memex does:** Lives only on your machine, never phones home, no API keys, no network access. OS-level file permissions — readable only by your user.
|
|
546
|
+
|
|
547
|
+
❌ **What it doesn't:** Doesn't encrypt the DB file, doesn't redact secrets you pasted into AI chats, no password on memex itself.
|
|
548
|
+
|
|
549
|
+
📦 **Doesn't add risk — concentrates it.** Your AI history is **already** on disk in plain text — Claude Code JSONL, Cursor `state.vscdb`, Cowork session files, Obsidian `.md`, Telegram local DB. Memex consolidates them into one SQLite file. Same data, one place instead of five. Attack surface doesn't grow — visibility does.
|
|
550
|
+
|
|
551
|
+
🛡️ **Top recommendation: FileVault.** On macOS: `System Settings → Privacy & Security → FileVault → Turn On`. Encrypts the entire disk with AES-256 at the OS level. Without your password, the disk is unreadable — closes ~80% of realistic threats (stolen laptop, stolen backup, non-root malware). On Linux: LUKS does the same. Do this **before** worrying about app-level encryption.
|
|
552
|
+
|
|
553
|
+
---
|
|
554
|
+
|
|
555
|
+
## Telegram export
|
|
556
|
+
|
|
557
|
+
1. Telegram **Desktop** (mobile не умеет export)
|
|
558
|
+
2. Чат → меню → **Export chat history**
|
|
559
|
+
3. **Format:** JSON или HTML — оба работают (HTML — с v0.9+)
|
|
560
|
+
4. **Path:** Daemon следит за `~/Downloads/Telegram Desktop/` и подхватывает экспорты автоматически. **Также с v0.10.12 — `memex import <путь>`** из любой папки ([см. ниже](#импорт-из-любого-пути-v01012)). Legacy-путь `~/.memex/inbox/` тоже работает.
|
|
561
|
+
5. Готово. После экспорта запусти `memex telegram pending` чтобы увидеть staged-чаты для импорта. Если daemon ещё не подхватил (например, экспорт лежал до установки memex'а) — `memex telegram scan` сделает backfill.
|
|
562
|
+
|
|
563
|
+
## Импорт из любого пути (v0.10.12+)
|
|
564
|
+
|
|
565
|
+
Если файл лежит не в `~/.memex/inbox/`, а в обычном месте на диске (`~/Downloads/`, `~/Desktop/`, `~/projects/foo/`) — одна команда:
|
|
566
|
+
|
|
567
|
+
```bash
|
|
568
|
+
memex import ~/projects/memex/result.json
|
|
569
|
+
memex import ~/Downloads/ChatExport_2026-05-18/ # Telegram HTML-папка
|
|
570
|
+
memex import ~/path/to/session.jsonl # Claude Code сессия
|
|
571
|
+
memex import ~/Downloads/result.json --force # пропустить privacy-gate
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
То же через AI-агента: `memex_import_file({path: "..."})` — один MCP tool-call. Не нужно вручную переносить файлы.
|
|
575
|
+
|
|
576
|
+
---
|
|
577
|
+
|
|
578
|
+
## Web-дашборд (v0.10.8+) — увидеть свою память без AI
|
|
579
|
+
|
|
580
|
+
Опциональный read-only локальный UI для просмотра корпуса. Та же SQLite, другая поверхность — пригождается когда хочется просто посмотреть на свои разговоры глазами, без MCP-агента в цикле.
|
|
581
|
+
|
|
582
|
+
```sh
|
|
583
|
+
memex web --open # localhost:8765, откроет браузер
|
|
584
|
+
memex web --port 9000 # свой порт
|
|
585
|
+
memex web --public --token s3cret # 0.0.0.0 с bearer-авторизацией (для remote / туннеля)
|
|
586
|
+
memex web --help
|
|
587
|
+
```
|
|
588
|
+
|
|
589
|
+
Пять страниц:
|
|
590
|
+
|
|
591
|
+
| Страница | Что внутри |
|
|
592
|
+
|-------------------|-------------------------------------------------------------------------------------------|
|
|
593
|
+
| `/` | Сетка статов · sources breakdown · callout про pending Telegram · последние 10 conversations |
|
|
594
|
+
| `/conversations` | Live FTS5-поиск через htmx (200мс debounce) · фильтры-чипы по source · кол-во hit'ов на чат |
|
|
595
|
+
| `/c/:id` | **Verbatim** транскрипт chat-bubble'ами · поиск внутри чата с `<mark>` подсветкой · пагинация |
|
|
596
|
+
| `/pending` | Telegram-экспорты ждущие решения · чекбоксы bulk Import / Skip · история твоих решений |
|
|
597
|
+
| `/settings` | Статус daemon'а · путь и размер БД · установленные хуки · TG decisions counts (read-only) |
|
|
598
|
+
|
|
599
|
+
**Принципы:**
|
|
600
|
+
- **Opt-in, не always-on.** `memex web` поднимает сервер; Ctrl+C гасит. Никакого фонового демона.
|
|
601
|
+
- **Read-only по умолчанию.** Единственные записи — TG import / skip на `/pending` (тот же privacy-gate, что и `memex telegram import`).
|
|
602
|
+
- **Localhost-only по умолчанию.** Слушает на `127.0.0.1`. Для удалённого доступа — `--public --token <…>` (на этом же endpoint в будущем поедет multi-host sync API).
|
|
603
|
+
- **Без build-step'а.** Raw Node `http` + tagged template literals + htmx 14KB с CDN. Клиентский bundle ≈ 30KB.
|
|
604
|
+
- **Брендирование совпадает с лендингом.** Inter + mint-палитра как на [memex.parallelclaw.ai](https://memex.parallelclaw.ai).
|
|
605
|
+
|
|
606
|
+
---
|
|
607
|
+
|
|
608
|
+
## Как использовать на практике / How to actually use it
|
|
609
|
+
|
|
610
|
+
Полный guide с **6 типовыми use case'ами** (Telegram → action plan, cross-AI bridge, recall, project resume, patterns, deck-анализ), описанием всех MCP-tools и troubleshooting — в [HELP.md](HELP.md). Скопируй любой промпт из этого файла → вставь в свой AI-агент → попробуй сразу после установки.
|
|
611
|
+
|
|
612
|
+
---
|
|
613
|
+
|
|
614
|
+
## Проверь что работает
|
|
615
|
+
|
|
616
|
+
В Claude Code/Cursor/OpenClaw напиши:
|
|
617
|
+
|
|
618
|
+
```
|
|
619
|
+
Используй memex_list_sources — что у меня в локальной памяти?
|
|
620
|
+
```
|
|
621
|
+
|
|
622
|
+
Должен ответить чем-то вроде:
|
|
623
|
+
|
|
624
|
+
```
|
|
625
|
+
Total messages: 15021
|
|
626
|
+
Sources:
|
|
627
|
+
• telegram — 13640 messages, 3 chat(s)
|
|
628
|
+
• claude-code — 1381 messages, 16 chat(s)
|
|
629
|
+
```
|
|
630
|
+
|
|
631
|
+
Дальше пробуй настоящие запросы:
|
|
632
|
+
|
|
633
|
+
```
|
|
634
|
+
Помнишь как мы обсуждали бизнес-модели для арбитража?
|
|
635
|
+
Найди мою сессию про SberBusiness структуру.
|
|
636
|
+
Что было в апреле про создание YC-презентации?
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
Агент сам вызовет `memex_search`, отдаст реальные совпадения с conversation_id и timestamps.
|
|
640
|
+
|
|
641
|
+
---
|
|
642
|
+
|
|
643
|
+
## MCP tools
|
|
644
|
+
|
|
645
|
+
> **Все tool'ы поддерживают параметр `format: "markdown" | "json"`** (дефолт `"markdown"`).
|
|
646
|
+
> Markdown — для глаз, JSON — для агентов: меньше токенов, можно парсить поля напрямую.
|
|
647
|
+
|
|
648
|
+
> **Server-side instructions для агентов.** В MCP `initialize`-ответе сервер отдаёт ~3 КБ системного контекста: что хранится, какой tool когда выбирать, FTS5-синтаксис, известные ограничения. Любой подключающийся агент (Claude Code, Cursor, OpenClaw) получает это автоматически — отдельную инструкцию писать не нужно. Текст в `SERVER_INSTRUCTIONS` в [server.js](server.js).
|
|
649
|
+
|
|
650
|
+
### `memex_overview(recent_limit?, format?)`
|
|
651
|
+
Снэпшот корпуса одним вызовом — для ориентации в начале сессии. Возвращает: общее число сообщений, breakdown по источникам (telegram / claude-code / claude-cowork), date range, и последние N разговоров с заголовками. Этот call даёт агенту mental map за ~500 токенов и резко повышает качество последующих `memex_search` запросов (т.к. агент уже знает что у пользователя в памяти есть, а чего нет). Server-side instructions явно рекомендуют вызывать его первым шагом в новой сессии.
|
|
652
|
+
|
|
653
|
+
### `memex_search(query, limit?, source?, project?, chat?, conversation_id?, origin?, since_ts?, until_ts?, sort?, half_life_days?, group_by_conversation?, include_archived?, expand_match?, format?)`
|
|
654
|
+
Full-text поиск через FTS5. Возвращает ranked сниппеты с `<<word>>` подсветкой.
|
|
655
|
+
|
|
656
|
+
**Фильтры скоупа:** `source` (telegram/claude-code/…), `project` (по project_path), `chat` (нечёткий матч по названию), **`conversation_id` (точный поиск ВНУТРИ одной сессии)**, **`origin` (v0.14 — с какого узла захвачено: в synced-меше source'ы всех машин совпадают, origin различает)**.
|
|
657
|
+
|
|
658
|
+
**Фильтр по датам (v0.12):** `since_ts` / `until_ts` (Unix-секунды, включительно) — ограничить окном: «что обсуждали про X в июне». Это настоящий фильтр, в отличие от `sort` (только порядок) и `half_life_days` (только recency-boost).
|
|
659
|
+
|
|
660
|
+
**По умолчанию `group_by_conversation: true`** — возвращает один лучший хит на каждый conversation_id плюс `match_count` (сколько всего совпадений в этом чате). Это убирает шум, когда один длинный диалог занимает всю выдачу одинаковыми кусками. Передай `false` чтобы получить классический список всех совпадений.
|
|
661
|
+
|
|
662
|
+
Архивные чаты по умолчанию исключены из выдачи; передай `include_archived: true` чтобы искать везде.
|
|
663
|
+
|
|
664
|
+
### `memex_recent(limit?, source?, include_archived?, format?)`
|
|
665
|
+
Последние N сообщений по timestamp.
|
|
666
|
+
|
|
667
|
+
### `memex_list_conversations(limit?, source?, since_ts?, include_archived?, format?)`
|
|
668
|
+
Список чатов отсортированных по последней активности (most recent first). Каждая запись — `conversation_id`, источник, заголовок, диапазон дат и кол-во сообщений. Удобно, когда хочется быстро увидеть какие у тебя вообще разговоры с конкретным ботом или внутри одного источника, прежде чем вытаскивать полный транскрипт.
|
|
669
|
+
|
|
670
|
+
Архивные чаты скрыты по дефолту, помечены 🗄️ если включены через `include_archived: true`.
|
|
671
|
+
|
|
672
|
+
### `memex_get_conversation(conversation_id, limit?, offset?, order?, include_subagents?, format?)`
|
|
673
|
+
Transcript одного чата. **Пагинация (v0.12):** `offset` листает длинные сессии (0, 200, 400…), `order` задаёт порядок — `asc` (старые первыми, дефолт) или `desc` (свежие первыми). Вывод сообщает `total` — сколько всего сообщений, чтобы знать докуда листать. Для сессии на тысячи сообщений `order:"desc"` отдаёт хвост в один вызов (раньше был доступен только старый «нос»).
|
|
674
|
+
|
|
675
|
+
### `memex_archive_conversation(conversation_id, archive?)`
|
|
676
|
+
Заархивировать (или восстановить) чат. Архивный чат остаётся в индексе и доступен для поиска через `include_archived: true`, но не засоряет дефолтную выдачу `memex_list_conversations` / `memex_search`. Передай `archive: false` чтобы расколоть.
|
|
677
|
+
|
|
678
|
+
### `memex_list_sources(format?)`
|
|
679
|
+
Метаданные: счётчики по источникам, последние импорты, путь к БД, число архивных чатов.
|
|
680
|
+
|
|
681
|
+
---
|
|
682
|
+
|
|
683
|
+
## Архитектура
|
|
684
|
+
|
|
685
|
+
```
|
|
686
|
+
memex-mvp/
|
|
687
|
+
├── server.js ← MCP-server + parsers + chokidar inbox watcher
|
|
688
|
+
├── ingest.js ← optional daemon: live-tail Code/Cowork → inbox
|
|
689
|
+
├── lib/parse.js ← shared dialogue parser (used by both)
|
|
690
|
+
├── package.json ← 3 dependencies (mcp-sdk, better-sqlite3, chokidar)
|
|
691
|
+
├── install.sh ← создаёт ~/.memex/, npm install, печатает config
|
|
692
|
+
└── test/parser.test.js ← unit-тесты парсера (13 кейсов)
|
|
693
|
+
|
|
694
|
+
~/.memex/
|
|
695
|
+
├── inbox/ ← drop-zone, chokidar watching
|
|
696
|
+
├── data/
|
|
697
|
+
│ ├── memex.db ← SQLite с FTS5 (3 таблицы: messages, messages_fts, conversations)
|
|
698
|
+
│ ├── memex.log ← server log
|
|
699
|
+
│ └── conversations/ ← обработанные оригиналы (telegram/, claude-code/)
|
|
700
|
+
```
|
|
701
|
+
|
|
702
|
+
### Schema
|
|
703
|
+
|
|
704
|
+
- `messages` — `(source, conversation_id, msg_id, role, sender, text, ts, metadata)` с UNIQUE на `(source, conversation_id, msg_id)` для дедупликации
|
|
705
|
+
- `messages_fts` — FTS5 виртуальная таблица, токенизатор `unicode61 remove_diacritics` (русский + английский, case-insensitive)
|
|
706
|
+
- `conversations` — агрегаты per-чат (first_ts, last_ts, message_count)
|
|
707
|
+
|
|
708
|
+
---
|
|
709
|
+
|
|
710
|
+
## Ограничения v0.1
|
|
711
|
+
|
|
712
|
+
- 🟡 Поиск keyword-based — нет semantic similarity. «арбитраж» найдёт «арбитраж», но не «монетизация трафика»
|
|
713
|
+
- 🟡 Manual import (кладёшь файл в inbox) — нет автоматического pull
|
|
714
|
+
- 🟡 Single-device — нет cross-machine sync
|
|
715
|
+
- 🟡 Plaintext SQLite — нет encryption-at-rest
|
|
716
|
+
- 🟡 ID-based dedupe требует стабильного `id` у сообщений; memex-sync (и claude-backup feed-memex для совместимости) генерируют sha1-hash из `role|timestamp|text[:200]` для гарантии
|
|
717
|
+
|
|
718
|
+
Всё лечится в следующих версиях.
|
|
719
|
+
|
|
720
|
+
---
|
|
721
|
+
|
|
722
|
+
## Roadmap
|
|
723
|
+
|
|
724
|
+
- **v0.1** (сейчас) — Telegram + Claude Code + Claude Cowork, FTS5, dialogue-only фильтр noise'а
|
|
725
|
+
- **v0.2** — Semantic search через BGE-M3 + sqlite-vec; ChatGPT export; Obsidian vault
|
|
726
|
+
- **v0.3** — Cloud relay (zero-knowledge) для auto-pull с серверов
|
|
727
|
+
- **v0.4** — Multi-device sync (CRDT-based)
|
|
728
|
+
- **v1.0** — Personal embedding adapter, behavioral routing rules
|
|
729
|
+
|
|
730
|
+
---
|
|
731
|
+
|
|
732
|
+
## Companion projects
|
|
733
|
+
|
|
734
|
+
- **[claude-backup](https://github.com/parallelclaw/claude-backup)** — отдельный Python-CLI для экспорта Claude Code/Cowork сессий **в Markdown** (для backup'а, чтения вне memex, sharing). **Не нужен для memex** — `npx memex-sync scan-claude` импортирует ту же историю напрямую без Python. Используй claude-backup если хочется именно Markdown-файлы как side-effect.
|
|
735
|
+
|
|
736
|
+
---
|
|
737
|
+
|
|
738
|
+
## Лицензия
|
|
739
|
+
|
|
740
|
+
MIT — делай что хочешь.
|