feat(readmymind): rethink steer note (phase 3 part 2)

Adds the optional free-text steer note to the Read My Mind modal: a
dashed input under the suggestions ("no, I meant the mobile bug") that
rides along as `steer` on every Rethink. The API already accepted it;
this wires the frontend end of the contract.

- Shown whenever Rethink is live (ready AND empty-result phases),
  hidden only while a prediction runs; typed text survives re-runs.
- Enter in the field triggers Rethink, mirroring the prompt field's
  Enter-to-send; a fresh open clears it with the rethink memory.
- Trimmed and capped to the schema's 2000 chars on the way out; a
  plain open still sends an empty body (neither steer nor rejected).
- zh-CN strings for the placeholder and aria-label, phone-sized
  touch target in mobile.css, static guards in the phase-3 test.

Verified with a browser E2E against a live dev server (stubbed predict
endpoint): payload contents, phase visibility, Enter wiring, and
reset-on-reopen all asserted with real keystrokes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Codeman maintainer
2026-08-10 10:41:39 +02:00
parent 752374abc7
commit 831af88579
9 changed files with 78 additions and 8 deletions
+26
View File
@@ -10901,6 +10901,32 @@ kbd {
white-space: nowrap;
font-family: var(--mono-font, monospace);
}
/* Rethink steer note: the user's own words about what they actually meant,
sent as `steer` on the next re-run (readmymind-ui.js _readMyMindPredict).
Dashed border marks it as the optional side channel, distinct from the
primary suggestion field above; it solidifies on focus. */
.readmymind-steer-row {
margin-top: 10px;
}
.readmymind-steer-input {
width: 100%;
min-width: 0;
font-size: 12px;
padding: 7px 10px;
background: transparent;
color: var(--text);
border: 1px dashed var(--control-border);
border-radius: 8px;
}
.readmymind-steer-input:focus {
outline: none;
border-style: solid;
border-color: var(--accent);
background: var(--bg-dark);
}
.readmymind-steer-input::placeholder {
color: var(--text-dim);
}
/* Keyboard-accessory 🧠 key: the phone surface for the same opt-in setting
(the header 🧠 button stays phone-hidden in mobile.css). The key ships in