feat(recovery,context): tier-2 intent-holder arbiter + remaining-delta pinning + surfaced signal events
- recovery: two-tier repair ladder — owner then arbiter (recovery stage recast
as intent-holder, holds initial intent, reconciles cross-file contract disputes)
with independent INTENT_ROUTE_BUDGET; RecoveryRoutingTest coverage
- context: remaining-delta checklist pinning (RemainingDelta{Pinning,Entry}Test)
- surface write-only events (session name, quality signals) into stats/browse
- parseToolArguments lenient-Json fallback for bare-key drift
- tools: ChildProcess seam
This commit is contained in:
@@ -573,7 +573,7 @@ func (m Model) launcherInput(w int) string {
|
||||
box := strings.Join(boxLines, "\n")
|
||||
|
||||
wf := lipgloss.NewStyle().Foreground(t.P.Accent2).Background(t.P.Bg).Render(m.launcherWfName())
|
||||
leftSub := " " + wf + t.span(" · ", t.P.Faint) + t.span(m.currentModel, t.P.Faint)
|
||||
leftSub := t.span(" ", t.P.Faint) + wf + t.span(" · ", t.P.Faint) + t.span(m.currentModel, t.P.Faint)
|
||||
hints := t.span("Tab wf · ⌥↵/^J newline · enter ↵ ", t.P.Faint)
|
||||
return box + "\n" + m.justify(leftSub, hints, w, t.P.Bg)
|
||||
}
|
||||
@@ -823,6 +823,23 @@ func (m Model) buildTranscriptRows(w int) ([]string, []int) {
|
||||
}
|
||||
case "tool":
|
||||
rows = append(rows, t.span(toolRowSummary(e.Content), t.P.Dim))
|
||||
case "thinking":
|
||||
// Collapsed by default to a single muted line so the reasoning trace doesn't bury
|
||||
// the answer; the palette "thinking" toggle reveals the full dimmed block.
|
||||
brain := lipgloss.NewStyle().Foreground(t.P.Faint).Background(t.P.Bg).Render("✼")
|
||||
if !m.thinkingShown {
|
||||
n := strings.Count(strings.TrimRight(e.Content, "\n"), "\n") + 1
|
||||
rows = append(rows, brain+t.span(" thinking ("+plural(n, "line")+") — palette: thinking", t.P.Faint))
|
||||
break
|
||||
}
|
||||
lines := wrap(e.Content, w-2)
|
||||
for i, ln := range lines {
|
||||
if i == 0 {
|
||||
rows = append(rows, brain+t.span(" ", t.P.Bg)+t.span(ln, t.P.Faint))
|
||||
} else {
|
||||
rows = append(rows, t.span(" ", t.P.Bg)+t.span(ln, t.P.Faint))
|
||||
}
|
||||
}
|
||||
case "narration_llm":
|
||||
diamond := lipgloss.NewStyle().Foreground(t.P.Accent).Background(t.P.Bg).Bold(true).Render("◆")
|
||||
lines := wrap(e.Content, w-2)
|
||||
@@ -913,7 +930,7 @@ func (m Model) eventRows(w, h int) []string {
|
||||
catCell := lipgloss.NewStyle().Foreground(t.categoryColor(cat)).Background(t.P.BgPanel).
|
||||
Render(" " + padRaw(cat, 9) + " ")
|
||||
evRows = append(evRows,
|
||||
t.span(e.Time+" ", t.P.Faint)+catCell+" "+
|
||||
t.span(e.Time+" ", t.P.Faint)+catCell+t.span(" ", t.P.Bg)+
|
||||
t.span(padRaw(e.Type, 18), t.P.Fg)+t.span(e.Detail, t.P.Dim))
|
||||
}
|
||||
// Show the latest events that fit under the 2-line header (box inner = h-2).
|
||||
|
||||
Reference in New Issue
Block a user