Verify visible hello MCP run and add shared control lease
This commit is contained in:
+7
-5
@@ -280,16 +280,18 @@ Quick wins:
|
||||
## Прочий backlog
|
||||
|
||||
- [ ] **Довести MCP C-уровня до полного безопасного контракта.** Первый
|
||||
stdio-адаптер с 16 инструментами использует общую sdbg-сессию и
|
||||
stdio-адаптер с 18 инструментами использует общую sdbg-сессию и
|
||||
owner ID личных точек. Полный план и матрица всех 30 raw-возможностей —
|
||||
[mcp-convergence-plan.md](mcp-convergence-plan.md). Следующее:
|
||||
эксклюзивный control lease для
|
||||
DAP/MCP, heartbeat/очистка точек при аварийном выходе MCP, безопасные
|
||||
control lease для DAP/MCP и cleanup точек по истечении heartbeat
|
||||
проверены живым прогоном. Далее проверка
|
||||
session ID изменяющих команд, безопасные
|
||||
input/screenshot/console API через session server, затем доказанные
|
||||
watchpoints, запись typed values, disassemble_src и batch-загрузка
|
||||
точек. Raw `mame_mcp.py` с `-plugin mamebridge` не подключать к тому же
|
||||
MAME в обход общей сессии; старый `mame_bridge.lua` удалить лишь после
|
||||
проверки 16 общих команд и обновления ссылок.
|
||||
MAME в обход общей сессии. Старый `mame_bridge.lua` удалён из MAME.HT
|
||||
после сверки 16 общих команд и живых MCP-прогонов; доказательства — в
|
||||
[mcp-convergence-plan.md](mcp-convergence-plan.md).
|
||||
Отдельно мигрировать raw `mame_mcp.py` с FastMCP SDK 1.x на MCPServer
|
||||
SDK 2.x, если этот standalone-интерфейс сохраняется; сейчас окружения
|
||||
raw и C-адаптера разделены.
|
||||
|
||||
@@ -125,7 +125,7 @@ stdio MCP-адаптер C-уровня. Эксклюзивное владени
|
||||
проверяет сигнатуру entry и запускает session server. Закрытие DAP
|
||||
завершает только созданные им server/MAME, удаляет временный каталог и
|
||||
свой Unix socket (с проверкой inode, чтобы не удалить новый сеанс).
|
||||
- `sdbg_mcp.py` предоставляет 16 инструментов через официальный MCP SDK
|
||||
- `sdbg_mcp.py` предоставляет 18 инструментов через официальный MCP SDK
|
||||
2.x поверх того же session server: статус, C-позиция, регистры, logical
|
||||
memory, переменные, события/логи, личные точки и команды исполнения.
|
||||
MCP-точки имеют owner ID и не могут удалить точки VS Code; при обычном
|
||||
@@ -284,6 +284,9 @@ commit `b0c4527c2edb1ee177fd09b3c412b65b385bf35b`:
|
||||
| Source Shift+F11 | Из `worker` bank 1 выполнен выход через trampoline в `main:6`, `0x42c9` |
|
||||
| VS Code stdio DAP launch, 2026-09-15 | Local pyenv shim → DAP → изолированный MAME/DSS → `hello` → `main:17`, PC=`0x8224`; `false_hits=0`, штатный disconnect |
|
||||
| MAME.HT 0.289, 2026-09-17 | Чистая сборка `make SUBTARGET=sprinter SOURCES=src/mame/sinclair/sprinter.cpp` и отдельные рецепты `stock`/`sdbg` создали `sprinter`; DAP в `sdbg` и `osx` на patched, а также `osx` на stock дождался DSS и остановился в `hello.c:17` без ложных точек. `getchar()` получил `x`, общий DAP/MCP сохранил ownership точек. Raw `mamebridge` через официальный MCP stdio-клиент перечислил 30 инструментов и ответил на `status`/`read_registers` при остановленном CPU; устаревший `resp_1.txt` не подменил ответ после перезапуска frontend |
|
||||
| Raw MCP plugin/legacy, 2026-09-17 | Все 16 команд удалённого `mame_bridge.lua` найдены в plugin dispatch; MCP stdio-прогоны проверили общий running-набор. Plugin на `hello` прошёл DSS→`main`, запись/восстановление `errno`, реальное срабатывание watchpoint, ввод `x` до строки 63 после `getchar()`, машинные over/out, снимок и пиксели. После удаления legacy-файла оба plugin-пробника повторно прошли |
|
||||
| Видимый raw MCP `hello`, 2026-09-17 | `tests/sdbg/run_raw_mcp_hello_probe.py` запустил MAME.HT с `-video soft -window`; кадр работающего `hello` показал весь текст и `Press any key to exit...`, затем ввод `x` довёл PC до `hello.c:63` |
|
||||
| Control lease DAP/MCP, 2026-09-17 | 18 C-инструментов, `claim_control`/`release_control`, 30-секундный lease с heartbeat; живой DAP+MCP-прогон подтвердил передачу управления обратно DAP и попадание в его точку. Второй видимый прогон дождался `owner_expired`, проверил удаление orphan-точки MCP и отсутствие ложной остановки; отпускание клавиш проверено unit-тестом |
|
||||
| F10 через `getchar()`, 2026-09-15 | Асинхронный `next` ответил за 21,49 мс; при ручном `x` в окне MAME `hello.c:62` → `:63`, возврат `DE.low=0x78`; обе клавиатуры включены в изолированном cfg |
|
||||
| VS Code TaskProvider Build, 2026-09-15 | Одиннадцать Node-проверок: выбор Makefile рядом с пакетом/в `build/`, команда make с Python shim, SDCC matcher, успешный и неуспешный код задачи, pyenv вне workspace; реальный make в `tests/hello` прошёл, VS Code показал Build → MAME/DSS → `main` |
|
||||
| Ошибочная debug-сборка, 2026-09-15 | Изолированный `fault.c` вернул код 2 от make, `file:1: error 20` сохранился, Python traceback удалён; MAME не участвует |
|
||||
@@ -377,10 +380,10 @@ Crash reports в 19:22/19:23 относились к неподдержанно
|
||||
строит проверенное условие через I/O port. После штатных прогонов в 20:43 и
|
||||
позже новых `mame.arm-*.ips` не появилось.
|
||||
|
||||
Далее по плану: арбитраж управления CPU и lease/cleanup для MCP-точек при
|
||||
Далее по плану: завершить арбитраж управления CPU и cleanup для MCP-точек при
|
||||
аварийном выходе клиента, затем безопасный restart и расширенные выражения.
|
||||
Низкоуровневые MAME MCP-инструменты (`src/mame_mcp.py` с новым
|
||||
`-plugin mamebridge` либо старым `mame_bridge.lua`) нельзя просто перенести: они должны
|
||||
Низкоуровневые MAME MCP-инструменты (`src/mame_mcp.py` с
|
||||
`-plugin mamebridge`) нельзя просто перенести: они должны
|
||||
проходить через общий session server и получить проверенный контракт для
|
||||
ввода, скриншотов, записи/watchpoints. VSIX уже упакован;
|
||||
для IDE ещё нужны Run-команда, выбор профиля
|
||||
|
||||
@@ -536,12 +536,14 @@ console_log и загрузка набора точек. Возвращать bu
|
||||
в арбитраж, а не обходят его.
|
||||
|
||||
Первый stdio MCP-адаптер уже работает через общий session server и отдаёт
|
||||
16 проверенных C-инструментов. У личных MCP-точек owner ID; удаление чужой
|
||||
18 проверенных C-инструментов. У личных MCP-точек owner ID; удаление чужой
|
||||
DAP-точки отклоняется. Совместный живой прогон подтвердил чтение состояния,
|
||||
точки и последующее срабатывание DAP-точки. Эксклюзивный control lease,
|
||||
cleanup при аварийном выходе MCP и остальные интерфейсы этого раздела ещё
|
||||
не реализованы. Настройка и точный список — [sdbg-mcp.md](sdbg-mcp.md);
|
||||
проверка legacy Lua и перенос всех raw MCP-возможностей в общую сессию —
|
||||
точки и последующее срабатывание DAP-точки. Добавлен control lease для
|
||||
команд CPU и ввода; передача MCP→DAP и cleanup точки владельца без heartbeat
|
||||
проверены живым прогоном;
|
||||
остальные интерфейсы этого раздела ещё не реализованы.
|
||||
Настройка и точный список — [sdbg-mcp.md](sdbg-mcp.md);
|
||||
результат удаления legacy Lua и перенос всех raw MCP-возможностей в общую сессию —
|
||||
[mcp-convergence-plan.md](mcp-convergence-plan.md).
|
||||
|
||||
### 8.2 DAP MVP и развитие
|
||||
|
||||
@@ -8,10 +8,10 @@
|
||||
проверку C-карты, банки, события и владение точками. Один процесс MAME не
|
||||
загружает одновременно `mamebridge` и `sdbgbridge`.
|
||||
|
||||
Сейчас `MAME.HT/plugins/mamebridge` вместе с `src/mame_mcp.py` публикует 30
|
||||
raw-инструментов. Старый `src/mame_bridge.lua` использует тот же Python
|
||||
frontend, но обрабатывает только 16 команд и не отвечает при hard-stop.
|
||||
`toolchain/sdbg_mcp.py` публикует 16 C-инструментов через общую с DAP сессию.
|
||||
`MAME.HT/plugins/mamebridge` вместе с `src/mame_mcp.py` публикует 30
|
||||
raw-инструментов. Удалённый на этапе А `src/mame_bridge.lua` использовал тот
|
||||
же Python frontend, но обрабатывал только 16 команд и не отвечал при hard-stop.
|
||||
`toolchain/sdbg_mcp.py` публикует 18 C-инструментов через общую с DAP сессию.
|
||||
**Цель — покрыть возможности всех 30 raw-инструментов в C-сессии, а не
|
||||
механически скопировать имена и небезопасную семантику.** Полный raw MCP
|
||||
остаётся отдельным режимом для задач без C-пакета и других машин MAME.
|
||||
@@ -60,6 +60,20 @@ C-MCP, ограничения совместной работы с DAP и жив
|
||||
проверяемых ссылок на удалённый script в текущем способе запуска нет. До
|
||||
этого шага считать legacy устаревшим, но не удалённым.
|
||||
|
||||
**Статус А, 2026-09-17 — выполнено.** Сравнение Lua-dispatch показало 16/16
|
||||
общих команд. Последовательные MCP stdio-прогоны на MAME.HT проверили
|
||||
регистры, память, дизассемблирование, консоль, точки/watchpoints и
|
||||
resume/pause у legacy при running CPU и plugin при stop. На реальном `hello`
|
||||
plugin прошёл DSS→`main`, запись и восстановление `errno`, попадание в
|
||||
watchpoint, ввод `x` через `getchar()` и машинные шаги over/out. Старый
|
||||
frame notifier не смог обслужить запрос после service-stop в `main`, что
|
||||
подтвердило известное ограничение. Файл удалён из активного дерева MAME.HT;
|
||||
после удаления оба plugin-пробника повторно прошли. Повторный прогон `hello`
|
||||
с `-video soft -window` показал вывод программы и `Press any key to exit...`
|
||||
на снимке работающего экрана; затем `x` довёл PC до строки после `getchar()`.
|
||||
Пробник `tests/sdbg/run_raw_mcp_hello_probe.py` теперь по умолчанию использует
|
||||
видимое окно, а `--proof` сохраняет снимок вне временного каталога сессии.
|
||||
|
||||
## Б. Подготовить общую C-сессию к расширению
|
||||
|
||||
1. Ввести control lease между DAP и MCP для `continue`, `pause`, шагов,
|
||||
@@ -82,6 +96,21 @@ C-MCP, ограничения совместной работы с DAP и жив
|
||||
**Выход Б:** два MCP-клиента и DAP читают одну сессию; конкурентные мутации
|
||||
сериализованы, а потеря клиента не оставляет его точек или нажатых клавиш.
|
||||
|
||||
**Промежуточный статус Б, 2026-09-17.** В session server добавлен 30-секундный
|
||||
control lease: команды CPU и ввод принимаются от текущего владельца, чужие
|
||||
получают явный отказ. MCP предоставляет `claim_control`/`release_control` и
|
||||
продлевает lease фоновым heartbeat; DAP продлевает его при опросе событий и
|
||||
освобождает при disconnect. Каждый процесс session server выдаёт новый
|
||||
`session_id`. Unit-тест проверил конфликт, освобождение и истечение lease;
|
||||
живой DAP+MCP-прогон проверил передачу управления обратно VS Code и попадание
|
||||
в его точку. Сервер теперь также удаляет личные MCP-точки и отпускает
|
||||
удерживаемые клавиши после истечения heartbeat. Живой прогон с владельцем
|
||||
без heartbeat подтвердил событие `owner_expired`, удаление точки и отсутствие
|
||||
ложной остановки в `hello.c:62` после возобновления DAP.
|
||||
**Этап Б не закрыт:** ещё нужны защита
|
||||
всех мутаций, проверка session ID в каждом изменяющем запросе и безопасная
|
||||
invalidation при reset/load.
|
||||
|
||||
## В. Перенести 30 возможностей raw MCP по группам
|
||||
|
||||
| Raw-инструменты | Реализация в общей сессии и проверка |
|
||||
|
||||
+18
-12
@@ -2,11 +2,10 @@
|
||||
|
||||
`toolchain/sdbg_mcp.py` подключается к уже работающей `sdbg_server.py` через
|
||||
Unix socket. Это отдельный stdio MCP-сервер для C-уровня: он использует ту же
|
||||
сессию, карту сборки и журнал, что VS Code/DAP. В репозитории MAME есть две
|
||||
Lua-реализации **другого**, raw MCP-моста: `src/mame_bridge.lua`
|
||||
(`-autoboot_script`) и более новый `-plugin mamebridge`. Оба обслуживают
|
||||
один `src/mame_mcp.py` и одинаковый файловый транспорт, но legacy Lua
|
||||
обрабатывает только 16 из 30 публикуемых Python-команд. Plugin использует
|
||||
сессию, карту сборки и журнал, что VS Code/DAP. В MAME.HT отдельно работает
|
||||
raw MCP-мост `-plugin mamebridge` с `src/mame_mcp.py`. Старый
|
||||
`src/mame_bridge.lua` удалён после проверки: он обрабатывал лишь 16 из 30
|
||||
публикуемых Python-команд и не отвечал при остановленном CPU. Plugin использует
|
||||
`register_periodic` и отвечает даже при остановленном CPU. Ни один из этих
|
||||
вариантов не должен одновременно управлять тем же MAME в обход sdbg-сессии.
|
||||
`src/mame_mcp.py` всё ещё импортирует `FastMCP` по пути SDK 1.x;
|
||||
@@ -48,7 +47,8 @@ MCP-сервер заново вместе с новой DAP-сессией. А
|
||||
Доступные инструменты: `session_status`, `where`, `read_registers`,
|
||||
`read_memory`, `list_variables`, `read_variable`, `recent_events`,
|
||||
`mame_console_tail`, `set_line_breakpoint`, `set_function_breakpoint`,
|
||||
`clear_breakpoint`, `clear_my_breakpoints`, `continue_execution`,
|
||||
`clear_breakpoint`, `clear_my_breakpoints`, `claim_control`, `release_control`,
|
||||
`continue_execution`,
|
||||
`pause_execution`, `step_instruction`, `step_source`. Ответы SDK 2.x содержат
|
||||
`structuredContent`. `step_source` принимает `into`, `over` или `out` и
|
||||
возвращает принятие команды; итоговую остановку получите через
|
||||
@@ -71,8 +71,8 @@ MCP-сервер заново вместе с новой DAP-сессией. А
|
||||
Это следующий этап, а не запрет на функции raw MCP. Нельзя просто загрузить
|
||||
`mamebridge` рядом с `sdbgbridge`: два независимых обработчика начнут менять
|
||||
CPU и точки без общего owner ID и журнала.
|
||||
Поэтапные проверки перед удалением legacy Lua и перенос всех 30 возможностей
|
||||
в общую C-сессию описаны в [плане сведения MCP](mcp-convergence-plan.md).
|
||||
Результаты удаления legacy Lua и этапы переноса всех 30 возможностей в общую
|
||||
C-сессию описаны в [плане сведения MCP](mcp-convergence-plan.md).
|
||||
|
||||
Чтение памяти принимает десятичный адрес или `0xHEX`, 1–256 байт logical
|
||||
Z80 memory, только при остановленном CPU, без side effects. Ответ содержит
|
||||
@@ -86,10 +86,16 @@ generation и страницы банков; диапазон не может п
|
||||
удалить DAP-точку отвергается и точка VS Code срабатывает после выхода MCP.
|
||||
Удаление личной точки при running CPU отдельно проверено на ожидании
|
||||
`getchar()`; оно не ставит CPU на паузу и не блокирует ввод.
|
||||
Общий session server сериализует команды, но эксклюзивного владельца
|
||||
управления CPU пока нет: не посылайте `continue`/`step` одновременно из MCP
|
||||
и VS Code. При аварийном завершении MCP его точки могут остаться до конца
|
||||
сессии MAME; нужна отдельная lease/cleanup-механика. Несколько одновременно
|
||||
Общий session server выдаёт 30-секундный control lease первому владельцу
|
||||
команды CPU; MCP может захватить/освободить его явно. Фоновый heartbeat MCP
|
||||
и опрос событий DAP продлевают активный lease. Конкурентная команда получает
|
||||
отказ с именем владельца, после штатного закрытия lease освобождается.
|
||||
При аварийном завершении MCP lease истекает за 30 секунд; сервер удаляет
|
||||
личные точки и отпускает удерживаемые клавиши. Живой прогон с владельцем без
|
||||
heartbeat подтвердил удаление его точки и отсутствие ложной остановки после
|
||||
возобновления DAP; освобождение удерживаемой клавиши пока проверено только
|
||||
unit-тестом.
|
||||
Несколько одновременно
|
||||
запущенных MAME с MCP не проверялись и не гарантируются; это отложенный тест.
|
||||
|
||||
Проверка совместной работы с DAP и реальным MAME:
|
||||
|
||||
Reference in New Issue
Block a user