Let the reader choose Owliver's language, and stop the suggestion row going silent
Some checks failed
CI / check (pull_request) Failing after 5m8s

Two changes to the assistant panel.

THE LANGUAGE SELECTOR. An account setting in the header menu, not a property of
the conversation: somebody who reads in Spanish reads in Spanish on every page
and after every reload, and making it per-thread would ask them to set it again
each time the panel opened. Held in localStorage and outside React, so the
Owliver panel — a different subtree from the header — sees the change without a
provider spanning both, and a second tab picks it up.

A TAG is sent, never a sentence, and the field is omitted entirely when the
choice is English. The backend maps it onto a closed set
(internal/runtime/language.go holds the same list) and an unrecognised tag
answers in English. The panel therefore cannot write prompt text from here,
which is the point: the selected string SELECTS a directive rather than
becoming one.

THE SUGGESTION ROW. It appeared exactly once per conversation and was silent
after that, whatever was asked. Every chip ever SHOWN was banned permanently in
a set that only grew; the server keeps returning the top of the same small
catalogue, so by the second turn every suggestion was already in it, the filter
emptied the list, and an empty list draws no row.

Asked and offered are not the same thing. A question this thread actually PUT
is excluded for good — it has an answer on screen and offering to repeat it is
not a follow-up. A chip merely DISPLAYED and passed over is held back only from
the turn directly after it, which is enough to stop the row redrawing verbatim
under consecutive answers; beyond that it is offerable again, because ignoring
a suggestion is not the same as having covered it.

Verified: 1710/1710 skill-checks, a clean typecheck, build and lint.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-10-06 15:27:02 +05:30
parent 1ef0c6fc8a
commit 8ac4e1ee88
6 changed files with 304 additions and 14 deletions

View File

@@ -5755,6 +5755,48 @@ console.log('\n── Follow-ups ──');
question: 'x', history: [],
refresh: async () => [PAGE[0], PAGE[0], PAGE[1]],
})).length === 2);
/* The defect that made the row appear exactly once per conversation: every
chip ever shown was banned for good, so the second turn filtered out the
same top-ranked catalogue the first turn had consumed and the row went
silent for the rest of the thread. Offered is not asked — a suggestion
passed over, with an answer since, is offerable again. */
record('a chip offered earlier, but not under the last answer, comes back',
JSON.stringify(said(await nextSteps({
question: 'x',
history: [
{ role: 'user', text: 'a' },
{ role: 'assistant', followUp: [PAGE[0]] },
{ role: 'user', text: 'b' },
{ role: 'assistant', followUp: [PAGE[1]] },
],
refresh: async () => [PAGE[0], PAGE[1]],
}))) === JSON.stringify([PAGE[0].prompt]));
/* ...while the row directly above is still never redrawn verbatim. */
record('...but the row under the answer directly above is not repeated',
(await nextSteps({
question: 'x',
history: [
{ role: 'user', text: 'a' },
{ role: 'assistant', followUp: [PAGE[0], PAGE[1]] },
],
refresh: async () => [PAGE[0], PAGE[1]],
})) === undefined);
/* A question actually put stays excluded however long ago it was asked —
that exclusion is the permanent one. */
record('a question asked earlier in the thread is never offered back',
(await nextSteps({
question: 'x',
history: [
{ role: 'user', text: 'How healthy is the platform right now?' },
{ role: 'assistant', followUp: [] },
{ role: 'user', text: 'b' },
{ role: 'assistant', followUp: [] },
],
refresh: async () => [PAGE[0]],
})) === undefined);
}
console.log('\n── Streaming ──');