From 3acad63fb786575222d3bea15e54dad1069d092e Mon Sep 17 00:00:00 2001 From: megaproxy Date: Tue, 26 May 2026 12:46:19 +0100 Subject: [PATCH] Session log: MCP v2 PR-2 (tree-shape writes) Note the require_visible_leaf factor-out, the non-interactive data-loss handling for apply_preset, and PresetName as a typed enum so the tool schema gives Claude autocomplete. --- memory.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/memory.md b/memory.md index 454f242..5b7e39f 100644 --- a/memory.md +++ b/memory.md @@ -51,6 +51,18 @@ Durable memory for this project. Read at session start, update before session en ## Session log +### 2026-05-26 — MCP v2 PR-2: tree-shape writes (close, swap, promote, apply_preset) + +Commit `e0ce223`. Four more tools wired through the existing PR-1b dispatcher pipeline (`dispatch_action` → policy check → confirm modal → audit), all touching the layout tree but not PTYs or spawn. Mechanically the same shape as `set_label`: define args struct on backend, validate via `require_visible_leaf` (factored out — 5 tools now use it), dispatch with stable `args_repr`, frontend `runMcpHandler` case applies the mutation via the same setters the UI uses. + +**`apply_preset`'s data-loss path is non-interactive.** If applying the preset would drop panes and the caller didn't pass `allow_drops: true`, the frontend handler throws with a descriptive message listing the labels of the panes that would be killed. Claude sees the error, decides whether to retry with `allow_drops: true`. Avoids ambushing the user with a destructive confirm modal — the user already approved the high-level "reshape" action; the per-pane consequences are surfaced to Claude, not them. The audit log shows the failed call so the user still sees what was attempted. + +**`PresetName` is a typed enum** (`single | two_columns | three_columns | two_rows | two_by_two`) with `serde(rename_all = "snake_case")` so Claude's tool schema gets autocomplete and the JSON wire form matches `apply_preset(two_columns)` style policy rules. + +**`promote_pane` errors gracefully** when the parent shares orientation with the grandparent — same "no perpendicular split above it" condition the Ctrl+Shift+P keyboard shortcut already toasts. Reuses the existing `promoteLeaf(tree, id) === null` check. + +5 of 9 planned v2 tools live now. PR-3 is the materially harder one (spawn_pane / write_pane / connect_host + rate limiter + SSH-specific confirm treatment); PR-4 is `add_host` + `extraArgs` sanitiser. + ### 2026-05-26 — MCP v2 PR-1 + PR-1b: policy engine, audit log, dispatcher, `set_label` end-to-end First two of four planned PRs for the MCP write surface. Shipped via fan-out (3 Sonnet agents in parallel + 1 Haiku for fuzz tests, then sequential integration by me). Two clean commits: `464c576` (PR-1 foundation) and `26ffe88` (PR-1b dispatcher + bug fixes).