Edit a page in place by search-and-replace over the markdown that xtiles_get_view_content returns. Workflow: (1) read the page, (2) copy the exact substring to change, (3) send replacements. All replacements apply atomically against the markdown as read; old_str must match exactly once. An empty new_str deletes what old_str matched. AMBIGUITY IS NOT YOURS TO RESOLVE: when the text the user wants changed appears more than once and they did not say which one — or said "all of them" — quote the occurrences back with their surrounding text and ask, before sending anything. Making each old_str unique by adding a neighbouring word satisfies this tool and still edits every occurrence, which is the outcome the user was never asked about. HEADING LEVELS ARE NOT ORDINARY MARKDOWN — read this before editing any heading: ## is the page title and CANNOT be patched at all; ### is a tile heading — patch it to rename a tile; #### and ##### are H1 and H2 heading blocks INSIDE a tile. Never write # or ## in new_str, and never change a ### to fewer hashes: that says "start a new page here", and is rejected. Changing #### to ##### is accepted but does nothing — the stored heading size is kept. ONE old_str MAY COVER SEVERAL BLOCKS, and may cross tile headings — quote the whole stretch you want to change, heading and body together, and the edits are worked out per block. It may also cover only PART of a block; the rest of that block is kept. Reordering works: write the blocks in the new order and they are moved, not rebuilt. Merging two blocks into one line, or splitting one across two lines, works as well. EDIT NORMALLY: paragraphs, bulleted and numbered lists, checklists, tasks (including their assignee), quotes, code blocks, headings, an image caption, and a link label or url. CANNOT be changed through the text (they are kept as they are, so an edit around them is safe): a file block, a divider, and everything markdown does not spell out — a link display style, a table column type or colour. TABLES: quote the rows you are changing, or the whole table. Column types and options are kept. A table cannot become non-table content — delete it and add the new content instead. Collection (database) pages cannot be patched at all — their rows are edited through the collection API. Returns the updated markdown on success; on rejection the error says what to do instead.