Expose owned C breakpoints through shared MCP session

This commit is contained in:
Александр Петров
2026-09-17 23:03:59 +03:00
parent 0ade3b4821
commit 113d468c48
12 changed files with 78 additions and 16 deletions
+3 -2
View File
@@ -280,12 +280,13 @@ Quick wins:
## Прочий backlog
- [ ] **Довести MCP C-уровня до полного безопасного контракта.** Первый
stdio-адаптер с 26 инструментами использует общую sdbg-сессию и
stdio-адаптер с 27 инструментами использует общую sdbg-сессию и
owner ID личных точек. Полный план и матрица всех 30 raw-возможностей —
[mcp-convergence-plan.md](mcp-convergence-plan.md).
control lease для DAP/MCP и cleanup точек по истечении heartbeat
проверены живым прогоном. Привязка RPC к session/build/generation и
экранные API и одиночный `press_key` уже добавлены. Далее очередь
экранные API, одиночный `press_key` и читающий список C-точек уже
добавлены. Далее очередь
строкового ввода, управляемые поля портов и мышь, затем доказанные
watchpoints, запись typed values, disassemble_src и batch-загрузка
точек. Raw `mame_mcp.py` с `-plugin mamebridge` не подключать к тому же
+3 -2
View File
@@ -125,7 +125,7 @@ stdio MCP-адаптер C-уровня. Эксклюзивное владени
проверяет сигнатуру entry и запускает session server. Закрытие DAP
завершает только созданные им server/MAME, удаляет временный каталог и
свой Unix socket (с проверкой inode, чтобы не удалить новый сеанс).
- `sdbg_mcp.py` предоставляет 26 инструментов через официальный MCP SDK
- `sdbg_mcp.py` предоставляет 27 инструментов через официальный MCP SDK
2.x поверх того же session server: статус, C-позиция, регистры, logical
memory, переменные, события/логи, личные точки и команды исполнения.
MCP-точки имеют owner ID и не могут удалить точки VS Code; при обычном
@@ -136,7 +136,7 @@ stdio MCP-адаптер C-уровня. Эксклюзивное владени
шага после клавиши.
Повторный запуск на том же фиксированном socket после прежнего stale-файла
прошёл; после Stop путь удалён.
В автономном режиме доступны 28 инструментов: официальный MCP-клиент
В автономном режиме доступны 29 инструментов: официальный MCP-клиент
запустил `hello`, ввёл `x` через публичный `press_key` во время `getchar()`
и остановился на следующей C-строке. Остальные raw-возможности ввода
перечислены в [матрице](mcp-capability-matrix.md).
@@ -294,6 +294,7 @@ commit `b0c4527c2edb1ee177fd09b3c412b65b385bf35b`:
| RPC identity и экран C-MCP, 2026-09-17 | Запросы после handshake привязаны к session/build; мутации сверяют generation. 25 C-инструментов: в живом DAP+MCP-прогоне проверены raw program/logical memory, VRAM/share, порты, пиксели и PNG; при running `hello` MCP снял кадр с `Press any key to exit...`, затем `x` завершил шаг через `getchar()` |
| Автономный MCP, 2026-09-17 | `start_session` ответил за 5–7 мс, затем официальный MCP-клиент дождался DSS→`hello.exe``main`; DAP attach увидел тот же PC, disconnect не завершил MAME. Повторный start отклонён, stop удалил socket и процесс MAME. Codex/Claude UI ещё не проверены |
| Публичный MCP `press_key`, 2026-09-17 | В автономном видимом MAME официальный MCP-клиент поставил C-точку перед `getchar()`, продолжил `hello`, ввёл `x` через `press_key` и остановился на следующей строке 63. В автономном режиме доступны 28 инструментов; строковый ввод и мышь остаются в плане |
| Список C-точек MCP, 2026-09-17 | В автономном видимом MAME MCP увидел собственную точку перед `getchar()` с owner и адресом; `list_breakpoints` также отдаёт guard-условие банка из bridge, если оно есть. Всего 29 автономных инструментов; вручную созданные debugger-точки пока не перечисляются |
| 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 не участвует |
+1 -1
View File
@@ -536,7 +536,7 @@ console_log и загрузка набора точек. Возвращать bu
в арбитраж, а не обходят его.
Первый stdio MCP-адаптер уже работает через общий session server и отдаёт
26 проверенных C-инструментов (28 при автономном start/stop). У личных MCP-точек owner ID; удаление чужой
27 проверенных C-инструментов (29 при автономном start/stop). У личных MCP-точек owner ID; удаление чужой
DAP-точки отклоняется. Совместный живой прогон подтвердил чтение состояния,
точки и последующее срабатывание DAP-точки. Добавлен control lease для
команд CPU и ввода; передача MCP→DAP и cleanup точки владельца без heartbeat
+2 -2
View File
@@ -16,7 +16,7 @@
| `write_memory` | — | Нужны lease, проверка адреса/банка и инвалидация C-карты |
| `set_breakpoint` | `set_line_breakpoint`, `set_function_breakpoint` | Только проверенные C-адреса; произвольный raw-адрес и условие ещё не покрыты |
| `clear_breakpoint` | `clear_breakpoint`, `clear_my_breakpoints` | Только логические ID текущего владельца, не MAME ID |
| `list_breakpoints` | — | Нужен структурированный список с owner и bank guard |
| `list_breakpoints` | `list_breakpoints` | Проверено на `hello`: логические C-точки всех владельцев, owner, адреса/банк и фактическое guard-условие только для чтения. Точки из родного окна MAME сюда не входят |
| `set_watchpoint` | — | Нужны owner, space/access, bank guard и проверка PC при попадании |
| `clear_watchpoint` | — | Зависит от owner-модели watchpoint |
| `step` | `step_instruction` | Один машинный шаг проверен; счётчик `count` ещё не поддержан |
@@ -44,7 +44,7 @@
с `--waitkey --emulated-key --screen-mcp-python` проверяет экран работающего
`hello` во время `getchar()` и последующий ввод. Автономный
`run_managed_mcp_probe.py` через официальный MCP-клиент проверяет
`press_key("x")` и остановку на строке после `getchar()`.
`list_breakpoints`, `press_key("x")` и остановку на строке после `getchar()`.
`run_raw_mcp_hello_probe.py`
проверяет отдельный raw plugin на том же приложении. Несколько процессов MAME
с MCP одновременно не проверялись.
+6 -2
View File
@@ -11,8 +11,8 @@
`MAME.HT/plugins/mamebridge` вместе с `src/mame_mcp.py` публикует 30
raw-инструментов. Удалённый на этапе А `src/mame_bridge.lua` использовал тот
же Python frontend, но обрабатывал только 16 команд и не отвечал при hard-stop.
`toolchain/sdbg_mcp.py` публикует 26 C-инструментов через общую с DAP сессию
(28 в автономном режиме с командами start/stop).
`toolchain/sdbg_mcp.py` публикует 27 C-инструментов через общую с DAP сессию
(29 в автономном режиме с командами start/stop).
**Цель — покрыть возможности всех 30 raw-инструментов в C-сессии, а не
механически скопировать имена и небезопасную семантику.** Полный raw MCP
остаётся отдельным режимом для задач без C-пакета и других машин MAME.
@@ -148,6 +148,10 @@ pass-through и особенности адресов перечислены п
официальный MCP-клиент ввёл `x` в ожидающий `getchar()` и попал на следующую
C-строку. Очередь строки, другие имена физических клавиш и мышь ещё не
реализованы; поэтому строка raw `press_key` покрыта частично.
Читающий `list_breakpoints` теперь показывает логические C-точки всех
владельцев, адреса и полученные от MAME условия банковской страницы;
удалять чужие точки он не позволяет. Живой MCP-прогон увидел личную точку
перед `getchar()`. Точки, вручную созданные в родном debugger, пока вне списка.
## Г. Сделать запуск пригодным для Codex и Claude без VS Code
+10 -2
View File
@@ -77,7 +77,8 @@ MCP-сервером MAME и удаляет socket. Закрытие самог
`read_memory`, `read_program_memory`, `list_ports`, `list_shares`, `read_share`, `read_vram`,
`read_screen_pixels`, `screenshot`, `press_key`, `list_variables`, `read_variable`, `recent_events`,
`mame_console_tail`, `set_line_breakpoint`, `set_function_breakpoint`,
`clear_breakpoint`, `clear_my_breakpoints`, `claim_control`, `release_control`,
`list_breakpoints`, `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` и
@@ -85,7 +86,7 @@ MCP-сервером MAME и удаляет socket. Закрытие самог
`recent_events` с курсором `last`. Логи `SDBG_LOG` приходят как события
`output`; журнал ограничен 1024 событиями и сообщает `first`/`last`/`lost`.
Число 26 в attach-режиме (28 в автономном с `start_session`/`stop_session`)
Число 27 в attach-режиме (29 в автономном с `start_session`/`stop_session`)
не означает полного переноса более нового `-plugin mamebridge`:
его `src/mame_mcp.py` публикует 30 raw-инструментов, ориентированных на
машину MAME. Здесь инструменты сгруппированы по операциям C-сессии, а
@@ -139,6 +140,13 @@ MCP-прогон ввёл `x` в ожидающий `getchar()` и дошёл д
его. Набор строки, произвольные имена клавиш, мышь и порты ввода ещё не
публичны в C-MCP.
`list_breakpoints` возвращает логические ID, владельца (`mcp:…`, `dap` или
`build`), вид C-точки, адреса и фактические условия банковской страницы для
всех точек общей сессии. Это чтение доступно и при running CPU. Точки,
поставленные вручную в родном debugger MAME, в этот список не входят.
Инструмент не даёт удалить чужую точку: `clear_breakpoint` по-прежнему
проверяет owner.
После первого `session_status` клиент отправляет session ID и build ID в
каждом RPC; команды, меняющие CPU/точки, дополнительно сверяют generation.
При замене сеанса или устаревшей generation команда отклоняется без
+1 -1
View File
@@ -175,7 +175,7 @@ launcher задаёт этому процессу `SDL_NO_SIGNAL_HANDLERS=1`, е
фиксированный `"socket": "/tmp/sprinter-sdbg-hello.sock"` и подключите
`toolchain/sdbg_mcp.py` после остановки в `main`. MCP использует тот же
session server; его личные точки не заменяют точки VS Code. Порядок запуска,
26 доступных инструментов и ограничения совместного управления описаны в
27 доступных инструментов и ограничения совместного управления описаны в
[руководстве по MCP](sdbg-mcp.md).
Команда палитры `Sprinter: Build Active Project` собирает приложение по