Движок команд и история

Каждое изменение графа, человеком или помощником, это одна команда. Движок живёт в main (src/main/commands/commit.ts); схемы общие (src/shared/commands/types.ts).

Команда

ПолеЗначение
projectIdПроект, которому принадлежит граф.
actionIdНовый id этого действия. Тот же id, присланный снова, получает ответ из записи и никогда не применяется дважды.
expectedRevisionIdВерсия, которую видел отправитель. Если граф ушёл дальше, команда даёт конфликт.
actormanual (человек) или ai (помощник).
runIdnull у человека; id открытого хода у помощника.
payloadЧто сделать: add-node, remove-node, move-node, move-nodes, rename-node, connect, remove-edge, retarget-edge, set-parameter, annotate-node, set-component, set-process, import-workflow, open-native, create-subgraph, insert-subgraph, dissolve-subgraph, rename-subgraph, add-subgraph-io, remove-subgraph-io, rename-subgraph-io, edit-in-subgraph, add-group, remove-group, rename-group, restore-revision.

Что делает commitCommand

В одной транзакции SQLite (immediate, чтобы два писателя не перемешались):

  1. Разбирает запрос; запрос не по схеме получает rejected.
  2. Смотрит в applied_commands: тот же actionId с тем же содержимым это historical (возвращается сохранённый результат); с другим содержимым rejected.
  3. Проверяет исполнителя: у команды manual хода быть не должно; команда ai должна принадлежать ходу в состоянии running, который ждёт ровно текущую версию. Иначе conflict.
  4. Применяет содержимое к текущему графу. Нода, которую добавляет помощник, ставится так, чтобы не лечь на другую.
  5. Пишет новую строку в graph_revisions (весь граф, его документ, компоненты и название), переводит на неё projects.current_revision_id и записывает команду в applied_commands.
  6. Обновляет объяснения для новой версии и помечает открытые черновики устаревшими, когда их ноды пропали или открыт другой граф.
  7. Сдвигает expected_revision_id открытого хода: на новую версию для помощника, а когда человек правит во время хода, тоже на версию человека, чтобы ход продолжился от того, что сделал человек.

Ответ: applied, historical, conflict или rejected, всегда вместе с текущей проекцией (граф, версия, открытый ход). Полный диск или файл, который нельзя записать, откатывают транзакцию и возвращаются как rejected с причиной, чтобы человек узнал, что изменение не сохранилось.

Ходы

Ход (run) это один ответ помощника, который может менять граф (таблица runs).

ВызовЧто делает
startRunЗакрывает любой другой открытый ход проекта (один за раз) и открывает новый на текущей версии.
pauseRunrunning → paused; пока ход на паузе, его команды отклоняются.
resumeRunОткрывает самый новый ход на паузе на текущей версии или начинает новый.
cancelRunОстанавливает ход; построенное остаётся, и его можно отменить.
closeRunОтвет закончен: ноды хода раскладываются ещё одной командой, затем ход закрывается.
closeStaleRunsПри запуске закрывает ходы, оставленные открытыми прошлым сеансом.

Лимит шагов («Настройки ▸ Помощник ▸ Шагов на ответ») ставит ход на паузу на контрольной точке; «Продолжить» возобновляет его.

Отмена, повтор и история

  • Отмена и повтор это команды с содержимым restore-revision: старая версия становится новой. Ничего не переписывается, поэтому и саму отмену можно отменить.
  • Целая сборка помощника отменяется одним шагом: стек отмены в renderer объединяет команды одного хода (src/renderer/state/undoState.ts, src/renderer/commands/undo.ts).
  • История прореживается после команд (src/main/commands/history.ts): не больше 2000 версий на проект, меньше для большого графа (бюджет 256 МБ), но не меньше 200; версия на экране и версии, от которых зависят открытые ходы и черновики, хранятся всегда.

Тесты

tests/unit и tests/integration проверяют движок напрямую; aiHumanConflict.test.ts и chatRunLifecycle.test.ts ведут ход через конфликты и паузы; tests/e2e/undo-redo.test.ts и command-lifecycle.test.ts проверяют то же через окно.

См. также

Страница перенесена из wiki репозитория приложения (docs/wiki/dev/Command-Engine.ru.md, ревизия b8e3f71). То же руководство встроено в приложение: «Справка ▸ Руководство».

Чтобы обновить её, выполните npm run import, а затем npm run build в папке сайта.