mirror of
https://github.com/Ark0N/Codeman.git
synced 2026-10-04 22:49:41 +02:00
feat: Read My Mind phase 2, the predictor and the brain button
The feature as pitched in docs/readmymind-plan.md: pressing the header
brain button predicts the prompt you were about to type, from the case's
intent profile plus everything the session already knows.
Backend:
- readmymind-context.ts: pure budgeted context assembler (9 ranked
sources: pending approval dialog, user goals, last assistant turn tail,
recent prompts, tool activity, git workspace signals, away context,
sibling sessions, rethink state; 30 KB budget, whole-section drop from
the bottom of the ranking, trust tiers stated in the prompt)
- readmymind-collectors.ts: transcript tail reader (the live watcher
keeps only a 500-char snippet) and git signal collection (execFile,
2s timeout, skipped for remote-SSH cases)
- readmymind-predictor.ts: one-shot claude -p in a throwaway tmux
session, opus by default (readMyMindModel setting), strict JSON
contract with 1-3 suggestions (continue / verify / redirect), newline
stripping, 90s timeout; mutable singleton so route tests can stub it
- POST /api/sessions/:id/readmymind: claude-mode only (400), one
prediction in flight per session (409 CONFLICT), rethink body
{ steer, rejected }; ownership via findSessionOrFail
Frontend:
- readmymind-ui.js (loadorder 11.3): header brain button, marker-hidden
until readMyMindEnabled is ON, desktop only (phone key is phase 3);
modal with editable suggestion + rationale and Send / Insert /
Rethink / Dismiss; suggestion text rendered via value/textContent only
and nothing ever auto-sends
- App Settings -> Panels checkbox for readMyMindEnabled; en + zh-CN
strings
Verified end to end against a live isolated instance: transcript
capture, a real opus prediction grounded in the stated goals, rethink
steering, the 409, and the browser modal incl. Insert leaving the text
unsubmitted on the composer. 41 new unit/route tests; full test:ci
sweep green (4680 tests).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -10668,6 +10668,80 @@ kbd {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/* Read My Mind 🧠 header button: opt-in (`readMyMindEnabled`, synced, default
|
||||
OFF), revealed by applyHeaderVisibilitySettings(). Marker-class pattern:
|
||||
the base display rule is !important, so hiding must also be a class. */
|
||||
.btn-readmymind {
|
||||
display: inline-flex !important;
|
||||
}
|
||||
.btn-readmymind.btn-readmymind--hidden {
|
||||
display: none !important;
|
||||
}
|
||||
.btn-readmymind .readmymind-icon {
|
||||
font-size: 13px;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
/* Read My Mind modal: top suggestion in an editable single-line field with the
|
||||
kind badge beside it and the rationale below. */
|
||||
.modal-content.readmymind-modal {
|
||||
max-width: 560px;
|
||||
}
|
||||
.readmymind-loading {
|
||||
padding: 14px 4px;
|
||||
color: var(--text-dim);
|
||||
animation: readmymind-pulse 1.4s ease-in-out infinite;
|
||||
}
|
||||
@keyframes readmymind-pulse {
|
||||
0%, 100% { opacity: 0.45; }
|
||||
50% { opacity: 1; }
|
||||
}
|
||||
.readmymind-suggestion-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
.readmymind-kind {
|
||||
flex: 0 0 auto;
|
||||
font-size: 10px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.06em;
|
||||
padding: 3px 7px;
|
||||
border-radius: 9px;
|
||||
border: 1px solid var(--control-border);
|
||||
color: var(--text-dim);
|
||||
}
|
||||
.readmymind-kind-verify {
|
||||
color: var(--warning, #e5c07b);
|
||||
}
|
||||
.readmymind-kind-redirect {
|
||||
color: var(--accent);
|
||||
}
|
||||
.readmymind-prompt-input {
|
||||
flex: 1 1 auto;
|
||||
min-width: 0;
|
||||
font-family: var(--mono-font, monospace);
|
||||
font-size: 13px;
|
||||
padding: 8px 10px;
|
||||
background: var(--bg-dark);
|
||||
color: var(--text);
|
||||
border: 1px solid var(--control-border);
|
||||
border-radius: 8px;
|
||||
}
|
||||
.readmymind-prompt-input:focus {
|
||||
outline: none;
|
||||
border-color: var(--accent);
|
||||
}
|
||||
.readmymind-why {
|
||||
margin-top: 8px;
|
||||
font-size: 12px;
|
||||
color: var(--text-dim);
|
||||
}
|
||||
.readmymind-error {
|
||||
padding: 12px 4px;
|
||||
color: var(--text-dim);
|
||||
}
|
||||
|
||||
.approvals-badge {
|
||||
position: absolute;
|
||||
top: 2px;
|
||||
|
||||
Reference in New Issue
Block a user