Gate canvas existence on the persisted revision id, not content
truthiness: an empty-string canvas is a valid kind:40100 revision (and
restore can republish one), so keying existence, the Create/Edit label,
and the History section on content hid retained history for an existing
empty canvas.
Bound get_canvas_history's page size to the relay read maximum. A
request above 1,000 is silently clamped by the relay, which made
`events.len() == page_size` false and nulled the cursor even when older
revisions remained, stranding them behind an unreachable page. Reject
outside 1..=1000.
Reset the shared restore mutation on revision selection change so a
failed restore's error can no longer render under a different row.
Co-authored-by: Will Pfleger <pfleger.will@gmail.com>
Signed-off-by: Will Pfleger <pfleger.will@gmail.com>