Skip to main content
Glama
README.md
# Noosphere Lite MCP

**Память для ИИ, которой не нужно помещаться в контекстное окно.**

*Автор — Garyu-tt · Версия 0.3.0 · Linux / Python / MCP · GNU GPLv3*

[English documentation](README_EN.md)

---

## Что это вообще такое?

Представь: ты несколько недель разрабатываешь проект с нейросетью. Вы находите ошибки, принимаете решения, меняете архитектуру, проверяете гипотезы. А потом начинается новый диалог, и половину проделанной работы приходится объяснять заново.

**Noosphere Lite — долговременная память, которая живёт отдельно от агента.** Это не ещё одна языковая модель, не бесконечный чат и не каталог текстовых файлов. Это хранилище знаний, их истории и взаимосвязей. Агент подключается к нему через MCP, получает ровно ту информацию, которая нужна в текущий момент, и продолжает работу.

Память принадлежит не конкретной сессии. Один агент сохранил решение сегодня; другой может найти его через неделю. Не нужно пытаться запихнуть в промпт весь архив: **контекстное окно становится рабочим столом, а не складом.**

## Что умеет Lite

### Память по требованию

У агента есть несколько способов вспомнить необходимое: найти подходящие записи, получить краткие результаты, прочитать одну запись целиком, пройти по связанным узлам или собрать ограниченный объём контекста под задачу. Всё остальное в контекст не попадает.

### Граф вместо мешка заметок

Каждая запись — отдельный узел: идентификатор, заголовок, текст, тип, теги, ссылка на источник и время изменений. Узлы можно связывать именованными направленными отношениями: например, **related**, **supports**, **blocks**, **derived_from**.

По графу можно ходить на глубину от одного до трёх переходов. Содержимое записей не обязано загружаться вместе с картой связей. Можно сначала найти путь, а затем открыть нужный узел.

### Каскадное устаревание

Это важнее, чем кажется. Если однажды сохранённый факт изменился, старые выводы, построенные на нём, нельзя продолжать выдавать как актуальные.

Пример:

    Измерение A
       ↑ derived_from
    Вывод B
       ↑ derived_from
    Решение C

Если пересмотреть A, Lite автоматически пометит B и C как **stale** — «требует повторной проверки». Если явно признать A недостоверным, устареет вся цепочка: A, B и C. История при этом остаётся на месте.

Система не пытается самостоятельно придумать новую истину и не удаляет неудобные результаты. Она честно сообщает агенту: «этот вывод опирался на сведения, которые уже изменились».

Каскад работает по **явным** связям derived_from. Lite пока не угадывает такие зависимости самостоятельно. Статус **current** означает «не помечено устаревшим», а не «достоверность доказана».

### История изменений

Ноосфера не должна забывать, *почему* возникло то или иное решение. Новые изменения записываются событиями, а предыдущие состояния остаются в истории. Даже архивация не уничтожает старую запись из зашифрованного журнала — лишь скрывает её из обычной выдачи.

Поэтому память подходит не только для хранения ответов, но и для накопления опыта: наблюдение → вывод → решение → пересмотр.

### Хранение: отдельно граф, отдельно события

Внутри Lite четыре слоя:

    ИИ-агент
        │ MCP-запрос
        ▼
    Поиск и выборка контекста
        │
        ▼
    Рабочий граф в оперативной памяти
        │
        ▼
    Зашифрованный журнал событий
        ├─ основная копия
        └─ зеркальная копия

В постоянном хранилище используется собственный **бинарный журнал NLV1**, зашифрованный с AES-256-GCM. В нём последовательно фиксируются события: создание записи, связь, изменение, устаревание, архивация.

Рабочий граф восстанавливается в оперативной памяти. Постоянного открытого JSON-файла с полезными данными или незашифрованного поискового индекса нет.

Это сознательно простой движок: поиск пока **лексический**, а не векторный. С версии 0.3.0 есть экспериментальный read-only поиск возможных связей между уже сохранёнными заметками; он не подтверждает факты и не создаёт связи автоматически. Эмбеддинги, нейронное извлечение смысла и автоматическое понимание противоречий — направления развития, а не функции версии 0.3.0.

### Защита и две копии

Каждое событие аутентифицируется и связывается с предыдущим через хеш. Изменение или повреждение журнала обнаруживается при чтении. Две копии сверяются; если одна повреждена или отстала, её можно восстановить по исправной.

По умолчанию копии должны находиться **на разных файловых системах**. Ключ шифрования хранится отдельно, с доступом только владельцу. Ключ тоже необходимо безопасно резервировать: потеря всех его экземпляров означает потерю доступа ко всей памяти.

Два зеркала не заменяют независимую внешнюю резервную копию. А если злоумышленник получил доступ к работающей пользовательской сессии и ключу, шифрование диска уже не решает проблему за тебя.

### Универсальный интерфейс

Lite работает локально на Linux и не требует облака, GPU или собственной нейросети. Агент получает память через MCP. В комплекте локальный сервер **stdio**, без открытого HTTP-порта, запуска команд и доступа к произвольным файлам компьютера.

Это память для совместимого агента, а не агент, который тайком управляет системой.

## Как это выглядит в работе

Ты сохранил решение о конфигурации сервера и связал его с исходным тестом. Через месяц новый агент возвращается к проекту: находит решение, открывает его источник и связанные заметки, восстанавливает ход мысли.

А если исходный тест за это время оказался неправильным, все выводы, которые явно от него зависели, уже будут помечены для перепроверки.

**Смысл не в том, чтобы помнить больше текста. Смысл — не терять причинно-следственные связи между уже проделанными действиями.**

## Установка на Linux

Нужен Python 3.11 или новее.

    git clone https://github.com/Garyu-tt/noosphere-lite-mcp.git
    cd noosphere-lite-mcp
    python3 -m venv .venv
    source .venv/bin/activate
    pip install -e .

Подключи две независимые файловые системы под хранилище и настрой пути:

    export NSL_PRIMARY=/mnt/storage-a/noosphere-lite
    export NSL_MIRROR=/mnt/storage-b/noosphere-lite
    export NSL_KEY_FILE="$HOME/.config/noosphere-lite/key"

    python -m noosphere_lite init
    python -m noosphere_lite status
    python -m noosphere_lite mcp

Каталоги хранилища должны иметь права 0700; ключ и журналы — 0600. Инициализация не перезаписывает существующие журналы.

**Только для тестов на одном диске** можно указать переменную NSL_DEVELOPMENT_SAME_DEVICE=1. Это отключает проверку независимости копий и не подходит для ценных данных.

### Настройка MCP-клиента

Для клиентов, поддерживающих локальный stdio MCP, пример конфигурации:

    {
      "mcpServers": {
        "noosphere-lite": {
          "command": "/absolute/path/noosphere-lite-mcp/.venv/bin/python",
          "args": ["-m", "noosphere_lite", "mcp"],
          "env": {
            "NSL_PRIMARY": "/mnt/storage-a/noosphere-lite",
            "NSL_MIRROR": "/mnt/storage-b/noosphere-lite",
            "NSL_KEY_FILE": "/home/you/.config/noosphere-lite/key"
          }
        }
      }
    }

Это пример для совместимых локальных MCP-хостов. Интерфейс ChatGPT может требовать отдельно поддерживаемый мост; конфигурация stdio сама по себе не устанавливает облачный коннектор.

### Зашифрованные брифинги и карточки файлов (R02)

Новые инструменты [memory_briefing и memory_by_source](docs/encrypted-briefings-r02.md) работают **непосредственно с уже зашифрованными журналами NLV1**, без создания открытого поискового индекса. Для выборки заметок укажи явный тег `project:my-app` и тип `negative`, `invariant`, `open_loop`, `decision` или `fact`. Поиск по пути сравнивает только сохранённую строку `source`; он не читает исходник и не подтверждает его актуальность. Подтверждение совпадения с JSON-источником выполняется существующим Evidence Gate, но оно не доказывает истинность факта. Теги проекта — фильтр, а не система прав доступа.


## 18 инструментов MCP

| Инструмент | Что делает |
| --- | --- |
| **memory_add** | Сохраняет заметку, факт, решение или задачу |
| **memory_search** | Ищет подходящие воспоминания |
| **memory_suggest_links** | Предлагает непроверенные связи по пересечению значимых терминов и тегов; ничего не записывает |
| **memory_read** | Возвращает конкретную запись целиком |
| **memory_context** | Собирает ограниченный контекст для задачи |
| **memory_link / memory_unlink** | Создаёт и удаляет типизированные связи |
| **memory_neighborhood** | Обходит соседние узлы |
| **memory_revise** | Обновляет запись и помечает зависимые выводы как устаревшие |
| **memory_invalidate** | Запускает каскадное устаревание от выбранной записи |
| **memory_archive** | Скрывает запись, не стирая историю |
| **memory_status** | Проверяет журналы и статистику |
| **memory_evidence_source_add / memory_evidence_propose** | Записывает источник JSON и предлагает проверяемое по нему, но ещё не подтверждённое утверждение |
| **memory_evidence_reject / memory_evidence_context** | Фиксирует отклонения, выдаёт только согласованные с источниками кандидаты и показывает противоречия |
| **memory_briefing** | Собирает ограничения, незавершённую работу и факты по проекту в рамках зашифрованной памяти |
| **memory_by_source** | Находит карточки по точной строке пути исходника, не обращаясь к файловой системе |

## Эксперимент: обучаемые веса связей (R04)

В каталоге [examples/reviewed_plasticity](examples/reviewed_plasticity/README.md) опубликован отдельный Python-пример весов графа с **независимым подтверждением результатов**, SHA-256 доказательств, разреженным накоплением полезности и откатом. **Это opt-in reference implementation, не функция ядра Lite 0.3.0**: оно не изменяет зашифрованные NLV1-журналы и не обучает веса LLM. Для реальной работы нужен доверенный интегратор с аутентификацией агентов и QA; его SQLite-sidecar хранит метаданные без шифрования.

## Эксперимент: проверяемая временная память (R01)

В [examples/memory_synthesis](examples/memory_synthesis/README.md) опубликована **отдельная экспериментальная реализация** привязки фактов к исходным файлам, SHA-256/Git, времени действия утверждений, безопасного явного вытеснения старых версий, проверки цитат, негативных правил, коротких брифингов и FTS5-поиска. [Каталог 27 исследовательских идей](docs/research-memory-candidates-2026-11-08.md) сохраняет атрибуцию и ограничения лицензий Agents Remember, Daimon, Primnox и Engram.

**Это не часть зашифрованного ядра Lite 0.3.0:** пример использует незашифрованный SQLite и не предназначен для приватных данных. Внутренние форумы, агенты, секреты и административные функции профессиональной версии в публичный репозиторий не переносятся.

## Чего пока нет

В дальнейших версиях хочется добавить автоматическое обнаружение зависимостей, векторный и семантический поиск, уровни значимости памяти, управление давностью и сроками хранения, согласование конфликтующих источников, уплотнение истории, разделение прав между агентами и внешние резервные копии.

**В 0.3.0 этого пока нет.** Текущий движок рассчитан на один хост и одного пишущего процесса с блокировкой, а не на распределённый кластер. Журнал при запросах перечитывается, поэтому большие базы потребуют отдельной оптимизации. Текущий лимит — 150 000 событий, а не 150 000 узлов.

## Проверка

    python -m unittest discover -s tests -v

Тесты покрывают шифрование, обнаружение повреждений, восстановление копии, связи и многоуровневое каскадное устаревание. Подключение локального MCP-клиента проверено на синтетических данных.

---

**Noosphere Lite MCP — чтобы новый разговор не означал новое начало.**

*Garyu-tt · GNU GPLv3 · [English documentation](README_EN.md)*


## License / Authorship

Original project code in this release: **GNU GPL-3.0-or-later**. Copyright (C) 2026 [Garyu-tt](https://github.com/Garyu-tt). See [LICENSE](LICENSE) and [AUTHORS.md](AUTHORS.md). Previously published MIT-licensed versions retain their earlier permissions and existing contributors' acknowledgments.

### Контекст с проверкой источника R02 (2026-11-08)

Результаты обычного `memory_search` и `memory_context` явно помечаются как непроверенные заметки. Для контекста только с привязкой к исходному свидетельству используйте `memory_source_grounded_context` или `memory_context(..., source_grounded_only=true)`. Строгий режим не подмешивает старые записи; совпадение с источником не означает доказанную истинность. [Документация R02](docs/EVIDENCE_CONTEXT_R02.md).

### Git-aware память R03

После настройки разрешённых локальных репозиториев через `NSL_GIT_ROOTS_JSON` привязать запись к версии файла можно с `memory_git_anchor`, а проверить изменения — с `memory_git_status` или `memory_git_scan`. Строгая память не возвращает знания, чей привязанный исходный код изменён; автоматического признания исправленного кода истинным нет. [Документация](docs/GIT_DRIFT_R03.md).