Add asynchronous machine over and out to shared MCP

This commit is contained in:
Александр Петров
2026-09-17 23:32:46 +03:00
parent 259c782190
commit a8d0692eb2
15 changed files with 241 additions and 19 deletions
+3 -1
View File
@@ -280,7 +280,7 @@ Quick wins:
## Прочий backlog
- [ ] **Довести MCP C-уровня до полного безопасного контракта.** Первый
stdio-адаптер с 29 инструментами использует общую sdbg-сессию и
stdio-адаптер с 31 инструментом использует общую sdbg-сессию и
owner ID личных точек. Полный план и матрица всех 30 raw-возможностей —
[mcp-convergence-plan.md](mcp-convergence-plan.md).
control lease для DAP/MCP и cleanup точек по истечении heartbeat
@@ -288,6 +288,8 @@ Quick wins:
экранные API, одиночный `press_key` и читающий список C-точек уже
добавлены; logical Z80 disassembly и ограниченный `type_string`
проверены, машинный `step_instruction(count=1..64)` проверен на `hello`.
Машинные `over(count)`/`out` добавлены отдельно от C source-step;
они асинхронны, поскольку могут ждать пользовательский ввод.
Далее natural keyboard, управляемые поля портов и мышь,
затем доказанные
watchpoints, запись typed values, disassemble_src и batch-загрузка
+3 -2
View File
@@ -125,7 +125,7 @@ stdio MCP-адаптер C-уровня. Эксклюзивное владени
проверяет сигнатуру entry и запускает session server. Закрытие DAP
завершает только созданные им server/MAME, удаляет временный каталог и
свой Unix socket (с проверкой inode, чтобы не удалить новый сеанс).
- `sdbg_mcp.py` предоставляет 29 инструментов через официальный MCP SDK
- `sdbg_mcp.py` предоставляет 31 инструмент через официальный MCP SDK
2.x поверх того же session server: статус, C-позиция, регистры, logical
memory, переменные, события/логи, личные точки и команды исполнения.
MCP-точки имеют owner ID и не могут удалить точки VS Code; при обычном
@@ -136,7 +136,7 @@ stdio MCP-адаптер C-уровня. Эксклюзивное владени
шага после клавиши.
Повторный запуск на том же фиксированном socket после прежнего stale-файла
прошёл; после Stop путь удалён.
В автономном режиме доступен 31 инструмент: официальный MCP-клиент
В автономном режиме доступны 33 инструмента: официальный MCP-клиент
запустил `hello`, ввёл `x` через публичный `press_key` во время `getchar()`
и остановился на следующей C-строке. Остальные raw-возможности ввода
перечислены в [матрице](mcp-capability-matrix.md).
@@ -298,6 +298,7 @@ commit `b0c4527c2edb1ee177fd09b3c412b65b385bf35b`:
| Logical Z80 disassembly MCP, 2026-09-17 | Через официальный MCP-клиент в видимом MAME прочитаны инструкции `main` с `0x8224` (`call $852C`); байты памяти до/после совпали. Адрес/длина ограничены, возвращаются bank_pages и generation. Всего 30 автономных инструментов; raw program disassembly ещё не поддержано |
| Строковый ввод MCP, 2026-09-17 | `tests/gets` с C-картой в видимом MAME получил `Ab9` и Enter через один MCP `type_string`; скриншот показал ввод и печать строки, CPU остановился на строке 16 после `gets()`. 31 автономный инструмент; natural keyboard/мышь остаются в плане |
| Счётчик машинных шагов MCP, 2026-09-17 | На видимом `hello` официальный MCP-клиент передал `step_instruction(count=3)`, получил следующую остановку и затем довёл приложение до `getchar()` и выхода; диапазон 1..64 проверяется клиентом, сервером и Lua backend |
| Машинные over/out MCP, 2026-09-17 | На видимом `hello` `over 1` перешагнул call пролога, `over count` дошёл до следующего call, `out` из `_gettextmode` вернулся в caller. `out` из `___sdcc_enter_ix` ждать нельзя: helper делает tail-jump `jp (hl)`; отдельный MCP-прогон получил асинхронный ответ за 8 мс и успешно прервал его Pause. Исправлена передача десятичных count для MAME console (`#`) и длины `dasm` |
| 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 не участвует |
+3 -1
View File
@@ -536,7 +536,7 @@ console_log и загрузка набора точек. Возвращать bu
в арбитраж, а не обходят его.
Первый stdio MCP-адаптер уже работает через общий session server и отдаёт
29 проверенных C-инструментов (31 при автономном start/stop). У личных MCP-точек owner ID; удаление чужой
31 проверенный C-инструмент (33 при автономном start/stop). У личных MCP-точек owner ID; удаление чужой
DAP-точки отклоняется. Совместный живой прогон подтвердил чтение состояния,
точки и последующее срабатывание DAP-точки. Добавлен control lease для
команд CPU и ввода; передача MCP→DAP и cleanup точки владельца без heartbeat
@@ -546,6 +546,8 @@ VRAM доступны через общий bridge, что подтвержде
ввёл `Ab9` и Enter в `gets()` с остановкой после печати строки;
машинный `step_instruction` принимает ограниченный `count` 1..64, не меняя
семантику DAP source-step;
машинные `step_over_instruction(count)` и `step_out_instruction()` выделены
отдельно от C-шагов и возвращают принятие команды асинхронно, сохраняя Pause;
остальные интерфейсы этого раздела ещё не реализованы.
Автономный MCP `start_session` поднимает DSS→EXE→`main` без VS Code;
DAP attach к созданному socket и последующий `stop_session` проверены.
+2 -2
View File
@@ -20,8 +20,8 @@
| `set_watchpoint` | — | Нужны owner, space/access, bank guard и проверка PC при попадании |
| `clear_watchpoint` | — | Зависит от owner-модели watchpoint |
| `step` | `step_instruction` | Проверено на `hello` с `count=3`: 1..64 машинных инструкций при stop, общий control lease и событие остановки; при breakpoint возможно раннее завершение |
| `step_over` | `step_source(kind="over")` | Проверен C-шаг F10; raw машинный `over count` пока отличается |
| `step_out` | `step_source(kind="out")` | Проверен C-выход; raw выход из одного машинного frame отличается |
| `step_over` | `step_over_instruction` | Проверено на `hello`: машинный `over count=1..64` отдельно от C-F10, асинхронное завершение через события; длинный вызов можно прервать Pause |
| `step_out` | `step_out_instruction` | Проверено на возвращаемом `_gettextmode`: машинный `out` отдельно от C Shift+F11, асинхронное завершение. Вызов через tail-jump (`___sdcc_enter_ix`) может длиться до следующего RET; нужен Pause |
| `resume` | `continue_execution` | Проверено с control lease и DAP-событиями |
| `pause` | `pause_execution` | Проверено с control lease |
| `status` | `session_status`, `where` | Проверено; C-статус содержит session/build/generation |
+13 -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` публикует 29 C-инструментов через общую с DAP сессию
(31 в автономном режиме с командами start/stop).
`toolchain/sdbg_mcp.py` публикует 31 C-инструмент через общую с DAP сессию
(33 в автономном режиме с командами start/stop).
**Цель — покрыть возможности всех 30 raw-инструментов в C-сессии, а не
механически скопировать имена и небезопасную семантику.** Полный raw MCP
остаётся отдельным режимом для задач без C-пакета и других машин MAME.
@@ -169,6 +169,17 @@ C-строке. Это покрывает типовой строковый вв
сохраняет control lease и событие остановки. Живой автономный MCP-прогон
выполнил `count=3` в `main`, затем продолжил `hello` до `getchar()` и вышел
через клавишу. DAP source-step не менялся.
Отдельные машинные `step_over_instruction(count=1..64)` и
`step_out_instruction()` теперь асинхронны: MAME-команда может ждать ввод,
поэтому RPC не держит lock до остановки; события и Pause остаются доступны.
Живой `hello` подтвердил `over` через call, счётчик `over` до второго call и
`out` из возвращаемой функции `_gettextmode`. Вызов `out` из
`___sdcc_enter_ix` выявил tail-jump вместо RET и не останавливался быстро:
именно поэтому машинные over/out не должны быть синхронными. Отдельный живой
MCP-прогон получил ответ `out` за 8 мс и остановил долгий выход через Pause.
Консоль MAME
считает числа без префикса шестнадцатеричными; для `over count` и длины
`dasm` backend теперь передаёт явный десятичный префикс `#`.
## Г. Сделать запуск пригодным для Codex и Claude без VS Code
+11 -3
View File
@@ -82,7 +82,8 @@ MCP-сервером MAME и удаляет socket. Закрытие самог
`list_breakpoints`, `clear_breakpoint`, `clear_my_breakpoints`,
`claim_control`, `release_control`,
`continue_execution`,
`pause_execution`, `step_instruction`, `step_source`. Ответы SDK 2.x содержат
`pause_execution`, `step_instruction`, `step_over_instruction`,
`step_out_instruction`, `step_source`. Ответы SDK 2.x содержат
`structuredContent`. `step_source` принимает `into`, `over` или `out` и
возвращает принятие команды; итоговую остановку получите через
`recent_events` с курсором `last`. Логи `SDBG_LOG` приходят как события
@@ -90,9 +91,16 @@ MCP-сервером MAME и удаляет socket. Закрытие самог
`step_instruction(count)` синхронно выполняет 1..64 машинных шагов
(`count=1` по умолчанию) и возвращает позицию остановки. Если раньше
сработает breakpoint, выполнение может остановиться до заданного числа.
Команды DAP F11/F10/Shift+F11 сохраняют прежнюю C-семантику.
`step_over_instruction(count=1..64)` и `step_out_instruction()` дают именно
машинную семантику MAME. Они отвечают сразу `accepted`; итоговую остановку
получайте через `recent_events` или `session_status`, при долгом вызове
доступен `pause_execution`. Например, `out` из `___sdcc_enter_ix` не
останавливается быстро: этот helper возвращает управление через `jp (hl)`,
а не через `ret`. Живой тест проверил `over` через такой вызов и `out` из
возвращаемого `_gettextmode`. Команды DAP F11/F10/Shift+F11 сохраняют
прежнюю C-семантику.
Число 29 в attach-режиме (31 в автономном с `start_session`/`stop_session`)
Число 31 в attach-режиме (33 в автономном с `start_session`/`stop_session`)
не означает полного переноса более нового `-plugin mamebridge`:
его `src/mame_mcp.py` публикует 30 raw-инструментов, ориентированных на
машину MAME. Здесь инструменты сгруппированы по операциям C-сессии, а
+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. Порядок запуска,
29 доступных инструментов и ограничения совместного управления описаны в
31 доступный инструмент и ограничения совместного управления описаны в
[руководстве по MCP](sdbg-mcp.md).
Команда палитры `Sprinter: Build Active Project` собирает приложение по