Область чата: проект и «Без рабочей папки»

Область чата: проект и «Без рабочей папки»

Чат всегда принадлежит ровно одному рабочему пространству (проекту). Приложение поставляется с синтетическим пространством «Без рабочей папки» (id __none__) — «нет проекта»: оно всегда первое в списке пространств и выбрано по умолчанию на свежей установке. На этой странице — что меняет каждая область: корни файловой системы, расположение песочницы, инструкции промпта и удаление.

Две области

Чат проекта Без рабочей папки (временный)
Id пространства случайный 8-hex id __none__
Путь пространства папка, выбранная пользователем ~/.levpro-ai/workspaces/_ephemeral
Создаётся Добавить папку / первое использование папки всегда присутствует
Корень файлового MCP папка проекта папка _ephemeral
uploads/ {project}/uploads {_ephemeral}/uploads
Код-песочница {project}/.sandbox ~/.levpro-ai/sandboxes/<sessionId>
instructions.md ~/.levpro-ai/projects/<id>/instructions.md ~/.levpro-ai/projects/_ephemeral/instructions.md
Удаляется при удалении проекта рабочее дерево стирается при выходе из приложения

Обе области поддерживают одни и те же режимы; различаются только пути и очистка. См. Режим планирования и Режим выполнения.

Как хранится область

~/.levpro-ai/app-settings.json:

{
  "workspaces": [{ "id": "a1b2c3d4", "name": "My Project", "path": "C:/work/proj" }],
  "activeWorkspaceId": "a1b2c3d4"
}
  • workspaces[] никогда не содержит временную запись — она синтезируется на лету.
  • activeWorkspaceId === "__none__" (или null) выбирает временную область.
  • Если папка активного проекта больше не существует, выбирается временная область, и изменение сохраняется.
  • Миграция: старая установка, чьё единственное пространство имеет легаси-id default, переключается на временное; любое легаси-пространство с отсутствующим/пустым именем чинится из имени его папки.

Расположение и жизненный цикл песочницы

Вычисляется как sandboxDirFor(workspace, sessionId) и передаётся серверу code-sandbox через LEVPRO_SANDBOX_DIR:

  • проект → {workspace.path}/.sandbox
  • временный → ~/.levpro-ai/sandboxes/<sessionId> (fallback …/sandboxes/_default, когда нет живого id чата, например при пути обновления конфига)

Удалением владеет Desktop — в одном месте:

Событие Что удаляется
Удаление проекта (removeWorkspace) {project}/.sandbox (сама папка проекта никогда не трогается)
Удаление временного чата (deleteChat) ~/.levpro-ai/sandboxes/<sessionId>
Выход из приложения (cleanupEphemeralWorkspace) всё дерево ~/.levpro-ai/workspaces/_ephemeral

Каталог песочницы никогда не очищается между ходами: он создаётся лениво и хранится всё время жизни чата, чтобы уточняющие вопросы дорабатывали ту же среду.

Удаление временного чата убирает только песочницу этого чата. Удаление чата проекта не удаляет {project}/.sandbox — он исчезает вместе с проектом. Чаты проекта сознательно делят одну песочницу на проект.

Сессии и метаданные проектов переживают перезапуск: выход стирает временное рабочее дерево (uploads/, кэш), но не историю чатов под ~/.levpro-ai/sessions/.

Вложения

Вложения проверяются на границе рендер→main: путь должен резолвиться внутри {activeWorkspace}/uploads, иначе он отбрасывается и логируется (ERR_INVALID_PATH). Создание проекта гарантирует папку uploads/; временная область гарантирует _ephemeral/uploads при первом использовании.

Инструкции проекта

У каждого проекта есть метаданные и файл пользовательских инструкций:

  • ~/.levpro-ai/projects/<id>.json — {id, description, customInstructions, updatedAt}
  • ~/.levpro-ai/projects/<id>/instructions.md — текст инструкций, синхронизируется syncInstructionsFile()

Когда instructions.md непустой, он добавляется в prompt_files обоих агентов — assistant и planner — в сгенерированном конфиге, поэтому правила проекта применяются и при планировании, и при выполнении.

Связанные страницы