The orchestrator's get_screen_contents tool flattened the terminal grid
to plain text, discarding every cell's rendering attributes. Inline shell
suggestions and ghost completions (zsh-autosuggestions, fish autosuggest,
Claude Code's suggested reply) are rendered faint, so they came through
byte-for-byte identical to text the user actually typed, which routinely
fooled an agent into mistaking a suggestion for an entered command.
Capture the per-cell faint bit (via a new ScreenCharIsFaint accessor,
since Swift can't read C bitfields) and the per-character grid coords,
then weave markup into the extracted text:
- faint runs wrapped in dim markers
- a cursor marker spliced at the cursor position
- images collapsed to an image placeholder
All three use U+27E8/U+27E9 angle brackets, which effectively never occur
in real terminal output. The tool description documents the tokens.
extractScreenText/cursorMarkupIndex now take a VT100Screen instead of a
PTYSession so the logic is unit-testable; added tests covering each
markup end-to-end and composed.