Surface every outstanding suggestion as a card in the right-hand
whitespace, vertically aligned to the text it flags — so the writer sees
the whole queue at once instead of hovering each highlight. Cards stack
with collision avoidance, link both ways with their highlight (hover/click
↔ soft text wash, driven through the decoration plugin so it survives
edit repaints), and carry the same Accept / Dismiss / Ask Petal actions.
The rail is a progressive enhancement: it mounts only when there's room
beside the editor, otherwise the existing inline hover card is unchanged.
Stacked cards that reach the bottom-right corner tuck behind the
companion mascot (z-order).
When a card is expanded, the Ask Petal bubble now opens with the
Simplified-Chinese translation of the explanation (the English stays in
the card body) instead of repeating the same text twice — a new
POST /api/suggestions/{id}/translate one-shot LLM endpoint, loaded
lazily on open with an English fallback.
Verified live against the local LLM via the uitest harness: rail
stacking, hover↔text wash, expand/Ask Petal, accept-from-rail, narrow
fallback, and the Mandarin bubble.
Claude-Session: https://claude.ai/code/session_016Yr6jELuRc7hyzYLccQKZd
24 lines
702 B
Go
24 lines
702 B
Go
package llm
|
|
|
|
import (
|
|
"context"
|
|
)
|
|
|
|
// RunTranslate renders a short English explanation into Simplified Chinese. It
|
|
// is a one-shot Complete (the result seeds the Ask Petal bubble), kept at a low
|
|
// temperature so the translation is faithful rather than creative. Output is
|
|
// trimmed of any stray surrounding quotes the model may add.
|
|
func RunTranslate(ctx context.Context, client LLMClient, text string) (string, error) {
|
|
out, err := client.Complete(ctx, CompletionRequest{
|
|
Messages: TranslateMessages(text),
|
|
MaxTokens: 512,
|
|
Temperature: 0.2,
|
|
TopP: 0.9,
|
|
RepetitionPenalty: 1.1,
|
|
})
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return cleanRewrite(out), nil
|
|
}
|