fix: steer delivery renders bare in the transcript — no bubble, no model glue
Three refinements from live testing: - Steer messages no longer sit inside the user Message container (the bubble background + right alignment it gave artifact cards). chat.tsx renders SubagentSteerCard directly in the transcript column — full width, centered, same register as the teacher's artifacts. - Research steers render a quiet "Research complete · N sources" badge (the dispatch-settled idiom), not the full brief: briefs are long, the wake turn weaves them into the lesson anyway, and the full text stays persisted in the artifact part — a "view full research" affordance can be added later without any protocol change. Failures keep the failure card (the brief explains what went wrong). - The sub-agents' verification notes (visual/demo builder notes) are model-facing glue and no longer render on success; failure notes remain the error explanation. SSR-verified against a synthetic record: badge + SVG bare in the transcript (no is-user wrapper), notes/brief confined to the RSC payload. 229/229, typecheck, lint, build green.
This commit is contained in:
+13
-12
@@ -287,21 +287,22 @@ export function Chat({
|
||||
/>
|
||||
)}
|
||||
|
||||
{messages.map((m, mi) => (
|
||||
{messages.map((m, mi) =>
|
||||
m.role === "user" && isSubagentSteer(m) ? (
|
||||
// Sub-agent delivery (wake-pipeline steer): NO message bubble — the
|
||||
// artifact card sits in the transcript column directly, full width
|
||||
// and centered like the teacher's artifacts (contracts.ts "THE ASYNC
|
||||
// PROTOCOL" §4).
|
||||
<SubagentSteerCard key={m.id} message={m} />
|
||||
) : (
|
||||
<Message key={m.id} from={m.role} className={m.role === "assistant" ? "max-w-full" : undefined}>
|
||||
<MessageContent className={m.role === "assistant" ? "w-full" : undefined}>
|
||||
{m.role === "user" ? (
|
||||
isSubagentSteer(m) ? (
|
||||
// Sub-agent delivery (wake-pipeline steer): render the
|
||||
// artifact, never a learner bubble (contracts.ts §4).
|
||||
<SubagentSteerCard message={m} />
|
||||
) : (
|
||||
// User text renders plain: the model's LaTeX pipeline is not
|
||||
// applied to learner-authored text ($ stays $, no surprises).
|
||||
<div className="whitespace-pre-wrap">
|
||||
{m.parts.filter((p) => p.type === "text").map((p) => p.text).join("\n")}
|
||||
</div>
|
||||
)
|
||||
// User text renders plain: the model's LaTeX pipeline is not
|
||||
// applied to learner-authored text ($ stays $, no surprises).
|
||||
<div className="whitespace-pre-wrap">
|
||||
{m.parts.filter((p) => p.type === "text").map((p) => p.text).join("\n")}
|
||||
</div>
|
||||
) : (
|
||||
m.parts.map((part, pi) => {
|
||||
const isLastPart = mi === messages.length - 1 && pi === m.parts.length - 1;
|
||||
|
||||
Reference in New Issue
Block a user