03b61ed43e
The one Ask-Claude toolbar button now adapts: its label flips on selectionchange
(Edit Selection when live text is selected in the preview, Edit Document
otherwise), and a click resolves the preview selection to a SOURCE range via the
nearest data-src ancestors (INV-36) — the webview's sole mapping duty. A
selection touching no live-source block falls back to document scope. Per spec
§6.5 PUC-2/3 / §7.2 SLICE-4.
- webview (media/preview.ts): nearestSrc() DOM walk + selectionSrcRange()
block-union; updateAskLabel() on selectionchange + after each render; the
adaptive click posts { askClaude, scope:"selection", start, end } or falls back
to document scope. Sealed (INV-21): reads data-src only, posts intent.
- host: runEditAndPropose's range branch (already shared from SLICE-3) records one
single-range F4 proposal over the resolved block-union.
- host E2E: stubbed selection turn → exactly one proposal over the resolved range
(turn receives exactly the selected source; replaced == the range; doc
untouched); an unchanged replacement proposes nothing. (The webview DOM
selection→data-src lookup is sealed-sandbox → manual smoke, spec §6.8.)
205 unit + 51 host E2E green.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>