fix(blocks): one block definition service for delete, rename and purge on every path

new src/scene/block_service.rs (references, delete, rename, purge candidates, name validation, one error type and message). The command-line RENAME, palette Remove, plugin API, control/MCP block_delete and PURGE all use it. Layout, xref, dynamic-block, anonymous and open-in-editor records are protected; PURGE removes an anonymous block only when nothing references it. PROTOCOL CHANGE: control/MCP block_delete refuses a referenced block unless force=true (erases referencing INSERTs in one undo step). New REST route DELETE /api/v1/blocks/{name}?force=true. MCP tool digest re-pinned. Undo labels are Delete block X, Rename block X to Y and Purge.
This commit is contained in:
Karim Jerbi committed 2026-10-12 07:25:11 +01:00
1 parent 5dfa41c032
commit 2b50b6c858
16 files changed
+2701 -262

No files matched your search

+19 -1
View File
@@ -551,11 +551,29 @@ fn block_delete_and_define_replace_manage_definitions() {
assert_eq!(count_type(&mut app, "Line"), 0, "old children erased");
assert_eq!(count_type(&mut app, "Circle"), 0, "old children erased");
// A definition the insert still points at is refused; "force":true erases
// the referencing inserts in the same undo step.
let r = app.automation_op(&format!(
r#"{{"protocol":1,"op":"block_delete","request_id":"bl1b","document_id":{doc},"name":"MARK"}}"#
));
assert_eq!(r["ok"], false);
assert_eq!(r["code"], "block_referenced");
assert_eq!(
count_type(&mut app, "Insert"),
1,
"the insert survived the refusal"
);
// Delete removes the insert, the markers, the children and the record.
let r = app.automation_op(&format!(
r#"{{"protocol":1,"op":"block_delete","request_id":"bl2","document_id":{doc},"name":"MARK"}}"#
r#"{{"protocol":1,"op":"block_delete","request_id":"bl2","document_id":{doc},"name":"MARK","force":true}}"#
));
assert_eq!(r["ok"], true, "{}", r["error"]);
assert_eq!(
r["result"]["references"].as_u64().unwrap(),
1,
"the forced delete reports what it overrode"
);
assert!(
r["result"]["erased"].as_u64().unwrap() >= 3,
"insert + markers + child"