@rvboris/opencode-mempalace 0.2.1 → 0.3.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/README.md CHANGED
@@ -1,29 +1,39 @@
1
- # OpenCode MemPalace Plugin
1
+ # @rvboris/opencode-mempalace
2
2
 
3
- OpenCode memory layer with private retrieval and safe autosave.
3
+ **Persistent memory for OpenCode zero config, visible results.**
4
+
5
+ Your AI coding assistant forgets everything between sessions. This plugin fixes that. It silently saves what matters and finds it when needed — no extra prompts, no manual effort.
4
6
 
5
7
  [Русская версия](./README.ru.md)
6
8
 
7
- ## Why it matters
9
+ ---
10
+
11
+ ## What it does
12
+
13
+ Before every reply, the plugin searches your memory for relevant context. After every session, it quietly saves durable knowledge. You never have to say "remember this" — but when you do, it listens.
14
+
15
+ ```
16
+ You: "What build tool does this project use?"
17
+ AI: [searches memory] → "Bun. You decided that on April 10."
18
+ ```
8
19
 
9
- Keep OpenCode context-aware without extra prompts.
20
+ ### The result
10
21
 
11
- - **Finds relevant memory automatically** before normal replies
12
- - **Saves durable knowledge quietly** in the background
13
- - **Keeps writes safe** through one controlled tool
14
- - **Protects sensitive data** before anything is stored
22
+ - Answers informed by your past decisions, preferences, and project history
23
+ - No repeated explanations across sessions
24
+ - Privacy-first: secrets and private blocks are never stored
25
+ - Works entirely locally no cloud, no API keys, no MCP server
15
26
 
16
27
  ## Quick start
17
28
 
18
- Install MemPalace:
29
+ **Prerequisites:** [OpenCode](https://opencode.ai) and Python 3.10+ with pip.
19
30
 
20
31
  ```bash
21
32
  pip install mempalace
22
- mempalace init <dir>
23
- mempalace mine <dir>
33
+ mempalace init ~/.mempalace/palace
24
34
  ```
25
35
 
26
- Add the plugin to `opencode.json`:
36
+ Add to `opencode.json`:
27
37
 
28
38
  ```json
29
39
  {
@@ -31,96 +41,88 @@ Add the plugin to `opencode.json`:
31
41
  }
32
42
  ```
33
43
 
34
- That is enough to enable memory search, autosave, and `mempalace_memory`.
44
+ That's it. Memory search, autosave, and both tools are active immediately.
35
45
 
36
- ## What you get
46
+ ## Features
37
47
 
38
- - hidden memory lookup before answers
39
- - autosave on session lifecycle events
40
- - separate user and project memory
41
- - one safe memory tool for the model
42
- - local Python bridge to MemPalace
48
+ ### Hidden retrieval
43
49
 
44
- The plugin does **not** require the MemPalace MCP server.
50
+ Before each answer, the plugin injects a search instruction so the model checks your memory first. No tool call noise in the chat — the context just appears.
45
51
 
46
- ## The one tool: `mempalace_memory`
52
+ ### Background autosave
47
53
 
48
- This is the only tool the model needs.
54
+ On session idle, compaction, or close, the plugin mines the conversation transcript for durable facts and saves them to the right memory area automatically.
49
55
 
50
- ### Modes
56
+ ### `mempalace_memory` — the one tool
51
57
 
52
- - **`save`** — store a durable preference, fact, or decision
53
- - **`search`** — find relevant memory by query
54
- - **`kg_add`** — add a structured fact to the knowledge graph
55
- - **`diary_write`** — save a short work note or daily log
56
- - **`mine_messages`** — internal autosave mode used by the plugin
58
+ Four modes, one interface:
57
59
 
58
- ### Examples
60
+ | Mode | Purpose |
61
+ |---|---|
62
+ | `save` | Store a preference, fact, or decision |
63
+ | `search` | Find relevant memory by query |
64
+ | `kg_add` | Add a structured fact to the knowledge graph |
65
+ | `diary_write` | Save a short work note |
59
66
 
60
- Save a user preference:
67
+ Examples:
61
68
 
62
69
  ```text
63
- mempalace_memory
64
- mode: save
65
- scope: user
66
- room: preferences
67
- content: Prefers concise responses and numbered steps.
70
+ mempalace_memory mode: save scope: user room: preferences content: Prefers concise responses.
68
71
  ```
69
72
 
70
- Save a project decision:
73
+ ```text
74
+ mempalace_memory mode: search scope: project room: decisions query: build tool
75
+ ```
71
76
 
72
77
  ```text
73
- mempalace_memory
74
- mode: save
75
- scope: project
76
- room: decisions
77
- content: Use Bun for builds and tests.
78
+ mempalace_memory mode: kg_add subject: my-repo predicate: uses object: bun
78
79
  ```
79
80
 
80
- Search memory:
81
+ ### `mempalace_status` — visible proof
82
+
83
+ Check whether the plugin is actually helping:
81
84
 
82
85
  ```text
83
- mempalace_memory
84
- mode: search
85
- scope: project
86
- room: workflow
87
- query: build command
88
- limit: 3
86
+ mempalace_status
89
87
  ```
90
88
 
91
- Add a graph fact:
89
+ Shows retrieval hit rate, last autosave outcome, memory previews, and cumulative counters. Use `verbose: true` for full detail.
90
+
91
+ ### TUI HUD — memory stats in your prompt
92
+
93
+ A compact session stats line appears in the OpenCode prompt area:
92
94
 
93
- ```text
94
- mempalace_memory
95
- mode: kg_add
96
- subject: my-repo
97
- predicate: uses
98
- object: bun
99
95
  ```
96
+ MEM hits 3 · saved 2 · failed 0 · writes 1
97
+ ```
98
+
99
+ Color-coded indicators for `SKIPPED` and `FAILED` states. Requires a `tui.json` entry (see below).
100
100
 
101
101
  ## Memory areas
102
102
 
103
- **User memory**
103
+ **User memory** — cross-project preferences and habits:
104
104
 
105
- - `preferences`
106
- - `workflow`
107
- - `communication`
105
+ - `preferences` — coding style, communication preferences
106
+ - `workflow` — working patterns, tool choices
107
+ - `communication` — language, response format
108
108
 
109
- Use it for stable cross-project habits and preferences.
109
+ **Project memory** repository-specific knowledge:
110
110
 
111
- **Project memory**
111
+ - `architecture` — design decisions, patterns
112
+ - `workflow` — build commands, CI config
113
+ - `decisions` — ADRs, trade-offs
114
+ - `bugs` — known issues, workarounds
115
+ - `setup` — environment setup, dependencies
112
116
 
113
- - `architecture`
114
- - `workflow`
115
- - `decisions`
116
- - `bugs`
117
- - `setup`
117
+ ## Privacy
118
118
 
119
- Use it for repository-specific knowledge.
119
+ - `<private>...</private>` blocks are respected and never stored
120
+ - Common secrets (API keys, tokens, passwords) are redacted before writes
121
+ - Fully private content is skipped entirely
120
122
 
121
123
  ## Configuration
122
124
 
123
- Optional config file: `~/.config/opencode/mempalace.jsonc`
125
+ Optional config file at `~/.config/opencode/mempalace.jsonc`:
124
126
 
125
127
  ```jsonc
126
128
  {
@@ -133,54 +135,93 @@ Optional config file: `~/.config/opencode/mempalace.jsonc`
133
135
  }
134
136
  ```
135
137
 
136
- Useful environment variables:
137
-
138
- - `MEMPALACE_AUTOSAVE_ENABLED`
139
- - `MEMPALACE_RETRIEVAL_ENABLED`
140
- - `MEMPALACE_KEYWORD_SAVE_ENABLED`
141
- - `MEMPALACE_PRIVACY_REDACTION_ENABLED`
142
- - `MEMPALACE_AUTOSAVE_LOG_FILE`
143
- - `MEMPALACE_ADAPTER_PYTHON`
144
-
145
- ## Privacy
146
-
147
- - respects `<private>...</private>` blocks
148
- - redacts common secrets before writes
149
- - skips fully private content
150
-
151
- ## Project docs
138
+ Environment variables:
152
139
 
153
- - Release history: [`CHANGELOG.md`](./CHANGELOG.md)
154
- - Changelog rules: [`CONTRIBUTING.md#changelog`](./CONTRIBUTING.md#changelog)
140
+ | Variable | Purpose |
141
+ |---|---|
142
+ | `MEMPALACE_AUTOSAVE_ENABLED` | Toggle background autosave |
143
+ | `MEMPALACE_RETRIEVAL_ENABLED` | Toggle hidden retrieval |
144
+ | `MEMPALACE_KEYWORD_SAVE_ENABLED` | Toggle keyword-triggered saves |
145
+ | `MEMPALACE_PRIVACY_REDACTION_ENABLED` | Toggle secret redaction |
146
+ | `MEMPALACE_ADAPTER_PYTHON` | Path to Python binary |
147
+ | `MEMPALACE_ADAPTER_TIMEOUT_MS` | Adapter timeout (default 15000) |
155
148
 
156
- ## Local development
149
+ ## TUI HUD setup
157
150
 
158
- Load from source:
151
+ To enable the prompt-area stats display, add a `tui.json` in your OpenCode config directory:
159
152
 
160
- ```jsonc
153
+ ```json
161
154
  {
162
- "$schema": "https://opencode.ai/config.json",
155
+ "$schema": "https://opencode.ai/tui.json",
163
156
  "plugin": [
164
- "file:///ABSOLUTE/PATH/TO/mempalace-autosave/plugin/index.ts"
157
+ "file:///path/to/mempalace-autosave/plugin/tui/index.tsx"
165
158
  ]
166
159
  }
167
160
  ```
168
161
 
169
- Build:
162
+ Or when installed from npm, use the package entry:
163
+
164
+ ```json
165
+ {
166
+ "$schema": "https://opencode.ai/tui.json",
167
+ "plugin": ["@rvboris/opencode-mempalace/tui"]
168
+ }
169
+ ```
170
+
171
+ ## How it works
172
+
173
+ ```
174
+ User message
175
+ → system hook injects "search memory first" instruction
176
+ → model calls mempalace_memory [search]
177
+ → results inform the answer
178
+
179
+ Session ends / idles
180
+ → event hook mines transcript
181
+ → Python adapter saves durable facts via MemPalace
182
+ ```
183
+
184
+ The plugin uses a local Python bridge (`bridge/mempalace_adapter.py`) to communicate with MemPalace. It does **not** require the MemPalace MCP server.
185
+
186
+ ## Compatibility
187
+
188
+ | Requirement | Version |
189
+ |---|---|
190
+ | OpenCode | latest |
191
+ | Python | 3.10+ |
192
+ | MemPalace | 3.3+ |
193
+ | OS | macOS, Linux, Windows |
194
+
195
+ ## Project docs
196
+
197
+ - [Changelog](./CHANGELOG.md) — release history
198
+ - [Contributing](./CONTRIBUTING.md) — changelog rules
199
+
200
+ ## Local development
170
201
 
171
202
  ```bash
203
+ git clone https://github.com/rvboris/opencode-mempalace.git
204
+ cd opencode-mempalace/mempalace-autosave
205
+ npm install
172
206
  npm run build
173
207
  ```
174
208
 
175
- Debug logs:
209
+ Load from source in `opencode.json`:
176
210
 
177
- ```bash
178
- opencode --log-level DEBUG
211
+ ```jsonc
212
+ {
213
+ "plugin": ["file:///ABSOLUTE/PATH/TO/mempalace-autosave/plugin/index.ts"]
214
+ }
179
215
  ```
180
216
 
181
- File log: `~/.mempalace/opencode_autosave.log`
217
+ Debug: `opencode --log-level DEBUG` or check `~/.mempalace/opencode_autosave.log`.
182
218
 
183
219
  ## Links
184
220
 
185
221
  - OpenCode: https://opencode.ai
186
222
  - MemPalace: https://github.com/milla-jovovich/mempalace
223
+ - npm: https://www.npmjs.com/package/@rvboris/opencode-mempalace
224
+
225
+ ## License
226
+
227
+ MIT
package/README.ru.md CHANGED
@@ -1,29 +1,39 @@
1
- # Плагин MemPalace для OpenCode
1
+ # @rvboris/opencode-mempalace
2
2
 
3
- Слой памяти для OpenCode: скрытый поиск по памяти и безопасное автосохранение.
3
+ **Персистентная память для OpenCode нулевая конфигурация, видимый результат.**
4
+
5
+ Твой ИИ-ассистент забывает всё между сессиями. Этот плагин это исправляет. Он незаметно сохраняет важное и находит его, когда нужно — без лишних подсказок и ручной работы.
4
6
 
5
7
  [English version](./README.md)
6
8
 
7
- ## Зачем он нужен
9
+ ---
10
+
11
+ ## Что он делает
12
+
13
+ Перед каждым ответом плагин ищет в памяти релевантный контекст. После каждой сессии — тихо сохраняет устойчивые знания. Тебе не нужно говорить «запомни это» — но если скажешь, плагин услышит.
14
+
15
+ ```
16
+ Ты: "Какую систему сборки мы используем?"
17
+ ИИ: [ищет в памяти] → "Bun. Это решение приняли 10 апреля."
18
+ ```
8
19
 
9
- Чтобы OpenCode отвечал с учётом прошлого контекста — без лишних подсказок и без шума в чате.
20
+ ### Результат
10
21
 
11
- - **Сам ищет нужную память** перед обычным ответом
12
- - **Тихо сохраняет важное** по ходу работы
13
- - **Пишет безопасно** через один контролируемый инструмент
14
- - **Учитывает приватность** перед сохранением
22
+ - Ответы, опирающиеся на прошлые решения, предпочтения и историю проекта
23
+ - Не нужно повторять объяснения от сессии к сессии
24
+ - Приватность: секреты и приватные блоки никогда не сохраняются
25
+ - Работает полностью локально — без облака, API-ключей и MCP-сервера
15
26
 
16
27
  ## Быстрый старт
17
28
 
18
- Установи MemPalace:
29
+ **Требования:** [OpenCode](https://opencode.ai) и Python 3.10+ с pip.
19
30
 
20
31
  ```bash
21
32
  pip install mempalace
22
- mempalace init <dir>
23
- mempalace mine <dir>
33
+ mempalace init ~/.mempalace/palace
24
34
  ```
25
35
 
26
- Добавь плагин в `opencode.json`:
36
+ Добавь в `opencode.json`:
27
37
 
28
38
  ```json
29
39
  {
@@ -31,92 +41,84 @@ mempalace mine <dir>
31
41
  }
32
42
  ```
33
43
 
34
- Этого достаточно, чтобы включить поиск по памяти, автосохранение и `mempalace_memory`.
44
+ Готово. Поиск по памяти, автосохранение и оба инструмента активны сразу.
35
45
 
36
- ## Что ты получаешь
46
+ ## Возможности
37
47
 
38
- - скрытый поиск по памяти перед ответом
39
- - автосохранение на событиях сессии
40
- - раздельную память для пользователя и проекта
41
- - один безопасный инструмент для работы с памятью
42
- - локальную Python-прослойку для MemPalace
48
+ ### Скрытый поиск
43
49
 
44
- Самому плагину **не нужен** сервер MCP от MemPalace.
50
+ Перед каждым ответом плагин подставляет инструкцию «сначала проверь память». Модель видит релевантный контекст без лишнего шума в чате.
45
51
 
46
- ## Основной инструмент: `mempalace_memory`
52
+ ### Фоновое автосохранение
47
53
 
48
- Это единственный инструмент, который нужен модели.
54
+ При простое сессии, компактизации или завершении — плагин анализирует транскрипт, извлекает устойчивые факты и сохраняет их в нужную область памяти.
49
55
 
50
- ### Режимы
56
+ ### `mempalace_memory` — единый инструмент
51
57
 
52
- - **`save`** сохранить устойчивый факт, предпочтение или решение
53
- - **`search`** — найти релевантную память по запросу
54
- - **`kg_add`** — добавить структурированный факт в граф знаний
55
- - **`diary_write`** — записать короткую рабочую заметку
56
- - **`mine_messages`** — внутренний режим автосохранения, который использует сам плагин
58
+ Четыре режима, один интерфейс:
57
59
 
58
- ### Примеры
60
+ | Режим | Назначение |
61
+ |---|---|
62
+ | `save` | Сохранить предпочтение, факт или решение |
63
+ | `search` | Найти релевантную память по запросу |
64
+ | `kg_add` | Добавить структурированный факт в граф знаний |
65
+ | `diary_write` | Записать короткую рабочую заметку |
59
66
 
60
- Сохранить пользовательское предпочтение:
67
+ Примеры:
61
68
 
62
69
  ```text
63
- mempalace_memory
64
- mode: save
65
- scope: user
66
- room: preferences
67
- content: Prefers concise responses and numbered steps.
70
+ mempalace_memory mode: save scope: user room: preferences content: Предпочитает краткие ответы.
68
71
  ```
69
72
 
70
- Сохранить проектное решение:
73
+ ```text
74
+ mempalace_memory mode: search scope: project room: decisions query: система сборки
75
+ ```
71
76
 
72
77
  ```text
73
- mempalace_memory
74
- mode: save
75
- scope: project
76
- room: decisions
77
- content: Use Bun for builds and tests.
78
+ mempalace_memory mode: kg_add subject: my-repo predicate: uses object: bun
78
79
  ```
79
80
 
80
- Найти память:
81
+ ### `mempalace_status` — видимое доказательство
82
+
83
+ Проверь, реально ли плагин помогает:
81
84
 
82
85
  ```text
83
- mempalace_memory
84
- mode: search
85
- scope: project
86
- room: workflow
87
- query: build command
88
- limit: 3
86
+ mempalace_status
89
87
  ```
90
88
 
91
- Добавить факт в граф знаний:
89
+ Показывает процент попаданий при поиске, последний результат автосохранения, превью памяти и накопительные счётчики. Для полного отчёта — `verbose: true`.
90
+
91
+ ### TUI HUD — статистика памяти в строке промпта
92
+
93
+ Компактная строка статистики текущей сессии в области ввода OpenCode:
92
94
 
93
- ```text
94
- mempalace_memory
95
- mode: kg_add
96
- subject: my-repo
97
- predicate: uses
98
- object: bun
99
95
  ```
96
+ MEM hits 3 · saved 2 · failed 0 · writes 1
97
+ ```
98
+
99
+ Цветовые индикаторы для `SKIPPED` и `FAILED`. Требует записи в `tui.json` (см. ниже).
100
100
 
101
101
  ## Области памяти
102
102
 
103
- **Память пользователя**
103
+ **Память пользователя** — кросс-проектные предпочтения и привычки:
104
104
 
105
- - `preferences`
106
- - `workflow`
107
- - `communication`
105
+ - `preferences` — стиль кода, предпочтения общения
106
+ - `workflow` — рабочие паттерны, выбор инструментов
107
+ - `communication` — язык, формат ответов
108
108
 
109
- Подходит для стабильных привычек и предпочтений, которые полезны в любом проекте.
109
+ **Память проекта** знания, привязанные к репозиторию:
110
110
 
111
- **Память проекта**
111
+ - `architecture` — архитектурные решения, паттерны
112
+ - `workflow` — команды сборки, CI-конфиг
113
+ - `decisions` — ADR, компромиссы
114
+ - `bugs` — известные баги, обходные пути
115
+ - `setup` — настройка окружения, зависимости
112
116
 
113
- - `architecture`
114
- - `workflow`
115
- - `decisions`
116
- - `bugs`
117
- - `setup`
117
+ ## Приватность
118
118
 
119
- Подходит для знаний, привязанных к конкретному репозиторию.
119
+ - Блоки `<private>...</private>` уважаются и никогда не сохраняются
120
+ - Типовые секреты (API-ключи, токены, пароли) скрываются перед записью
121
+ - Полностью приватное содержимое пропускается целиком
120
122
 
121
123
  ## Настройка
122
124
 
@@ -133,54 +135,93 @@ mempalace_memory
133
135
  }
134
136
  ```
135
137
 
136
- Полезные переменные окружения:
137
-
138
- - `MEMPALACE_AUTOSAVE_ENABLED`
139
- - `MEMPALACE_RETRIEVAL_ENABLED`
140
- - `MEMPALACE_KEYWORD_SAVE_ENABLED`
141
- - `MEMPALACE_PRIVACY_REDACTION_ENABLED`
142
- - `MEMPALACE_AUTOSAVE_LOG_FILE`
143
- - `MEMPALACE_ADAPTER_PYTHON`
144
-
145
- ## Приватность
146
-
147
- - поддерживаются блоки `<private>...</private>`
148
- - типовые секреты скрываются перед записью
149
- - полностью приватное содержимое не сохраняется
150
-
151
- ## Документация проекта
138
+ Переменные окружения:
152
139
 
153
- - История изменений: [`CHANGELOG.md`](./CHANGELOG.md)
154
- - Правила ведения changelog: [`CONTRIBUTING.md#changelog`](./CONTRIBUTING.md#changelog)
140
+ | Переменная | Назначение |
141
+ |---|---|
142
+ | `MEMPALACE_AUTOSAVE_ENABLED` | Включить/выключить фоновое автосохранение |
143
+ | `MEMPALACE_RETRIEVAL_ENABLED` | Включить/выключить скрытый поиск |
144
+ | `MEMPALACE_KEYWORD_SAVE_ENABLED` | Включить/выключить сохранение по ключевым словам |
145
+ | `MEMPALACE_PRIVACY_REDACTION_ENABLED` | Включить/выключить скрытие секретов |
146
+ | `MEMPALACE_ADAPTER_PYTHON` | Путь к бинарнику Python |
147
+ | `MEMPALACE_ADAPTER_TIMEOUT_MS` | Таймаут адаптера (по умолчанию 15000) |
155
148
 
156
- ## Локальная разработка
149
+ ## Настройка TUI HUD
157
150
 
158
- Загрузка из исходников:
151
+ Чтобы включить отображение статистики в строке промпта, добавь `tui.json` в каталог конфигурации OpenCode:
159
152
 
160
- ```jsonc
153
+ ```json
161
154
  {
162
- "$schema": "https://opencode.ai/config.json",
155
+ "$schema": "https://opencode.ai/tui.json",
163
156
  "plugin": [
164
- "file:///ABSOLUTE/PATH/TO/mempalace-autosave/plugin/index.ts"
157
+ "file:///путь/до/mempalace-autosave/plugin/tui/index.tsx"
165
158
  ]
166
159
  }
167
160
  ```
168
161
 
169
- Сборка:
162
+ Или при установке из npm — используй пакетный вход:
163
+
164
+ ```json
165
+ {
166
+ "$schema": "https://opencode.ai/tui.json",
167
+ "plugin": ["@rvboris/opencode-mempalace/tui"]
168
+ }
169
+ ```
170
+
171
+ ## Как это работает
172
+
173
+ ```
174
+ Сообщение пользователя
175
+ → системный хук подставляет «сначала проверь память»
176
+ → модель вызывает mempalace_memory [search]
177
+ → результаты влияют на ответ
178
+
179
+ Сессия завершается / простаивает
180
+ → хук событий анализирует транскрипт
181
+ → Python-адаптер сохраняет устойчивые факты через MemPalace
182
+ ```
183
+
184
+ Плагин использует локальную Python-прослойку (`bridge/mempalace_adapter.py`) для работы с MemPalace. Ему **не нужен** MCP-сервер MemPalace.
185
+
186
+ ## Совместимость
187
+
188
+ | Требование | Версия |
189
+ |---|---|
190
+ | OpenCode | latest |
191
+ | Python | 3.10+ |
192
+ | MemPalace | 3.3+ |
193
+ | ОС | macOS, Linux, Windows |
194
+
195
+ ## Документация проекта
196
+
197
+ - [Changelog](./CHANGELOG.md) — история изменений
198
+ - [Contributing](./CONTRIBUTING.md) — правила ведения changelog
199
+
200
+ ## Локальная разработка
170
201
 
171
202
  ```bash
203
+ git clone https://github.com/rvboris/opencode-mempalace.git
204
+ cd opencode-mempalace/mempalace-autosave
205
+ npm install
172
206
  npm run build
173
207
  ```
174
208
 
175
- Журналы отладки:
209
+ Загрузка из исходников в `opencode.json`:
176
210
 
177
- ```bash
178
- opencode --log-level DEBUG
211
+ ```jsonc
212
+ {
213
+ "plugin": ["file:///ABSOLUTE/PATH/TO/mempalace-autosave/plugin/index.ts"]
214
+ }
179
215
  ```
180
216
 
181
- Файл журнала: `~/.mempalace/opencode_autosave.log`
217
+ Отладка: `opencode --log-level DEBUG` или файл `~/.mempalace/opencode_autosave.log`.
182
218
 
183
219
  ## Ссылки
184
220
 
185
221
  - OpenCode: https://opencode.ai
186
222
  - MemPalace: https://github.com/milla-jovovich/mempalace
223
+ - npm: https://www.npmjs.com/package/@rvboris/opencode-mempalace
224
+
225
+ ## Лицензия
226
+
227
+ MIT
@@ -22,6 +22,10 @@ def write_result(result: dict) -> None:
22
22
  sys.stdout.buffer.flush()
23
23
 
24
24
 
25
+ def write_utf8_text(path: Path, text: str) -> None:
26
+ path.write_bytes(text.encode("utf-8", errors="replace"))
27
+
28
+
25
29
  def main() -> int:
26
30
  try:
27
31
  payload = json.load(sys.stdin)
@@ -60,7 +64,7 @@ def main() -> int:
60
64
  extract_mode = payload.get("extract_mode", "general")
61
65
  with tempfile.TemporaryDirectory(prefix="mempalace-autosave-") as tmpdir:
62
66
  transcript_path = Path(tmpdir) / "session.txt"
63
- transcript_path.write_text(payload["transcript"], encoding="utf-8")
67
+ write_utf8_text(transcript_path, payload["transcript"])
64
68
  with redirect_stdout(StringIO()):
65
69
  mine_convos(
66
70
  convo_dir=tmpdir,