fix(pdf): render the pdf dispatch card (live browser-smoke gap)
The browser e2e check on the live dispatch session found the tool-pdf part rendered NO card: the artifact renderer registry had no pdf entry (the doc comment literally says "add your renderer here"), and the typed TeacherUITools union + the chat.tsx job-part enumerations (poll cadence, dispatch nudge, settle-sync) all missed the new tool kind. - PdfJobCard in job-card.tsx: the research JobCard idiom, kind pdf — registered in artifacts/index.ts. - ui-message.ts: pdf entry in TeacherUITools (fire-and-forget ack output). - chat.tsx: two mechanical "tool-pdf" additions to the research/demo/visual enumerations — UI-stream file, flagged for review at merge (same treatment as the activity-dock type-forced entries). - demos.test.tsx: live/settled dispatch-card renders + registry pin.
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
import type { ComponentType } from "react";
|
||||
import type { ArtifactPartProps } from "@/src/core";
|
||||
import { DemoCard } from "@/components/artifacts/demo-card";
|
||||
import { JobCard } from "@/components/artifacts/job-card";
|
||||
import { JobCard, PdfJobCard } from "@/components/artifacts/job-card";
|
||||
import { VisualCard } from "@/components/artifacts/visual-card";
|
||||
import { ProbeDoneCard } from "@/components/artifacts/probe-done-card";
|
||||
|
||||
@@ -19,6 +19,7 @@ import { ProbeDoneCard } from "@/components/artifacts/probe-done-card";
|
||||
*/
|
||||
export const artifactRenderers: Record<string, ComponentType<ArtifactPartProps>> = {
|
||||
research: JobCard,
|
||||
pdf: PdfJobCard, // sources v0 — live smoke 2026-09-19 caught the gap: without this the tool-pdf dispatch part rendered nothing
|
||||
// plan_* parts render nothing inline by design: the phase seam is a
|
||||
// message-level boundary, drawn by PhaseDivider in chat.tsx (the old
|
||||
// part-level plan_init divider retired with it).
|
||||
|
||||
@@ -18,6 +18,17 @@ export function JobCard({ part }: ArtifactPartProps) {
|
||||
return <DispatchCard toolCallId={part.toolCallId} kind="research" />;
|
||||
}
|
||||
|
||||
/**
|
||||
* The pdf dispatch box (sources v0) — the same async-protocol idiom as
|
||||
* JobCard: the ack output drives a DispatchCard (live "PDF reader" status
|
||||
* via the central jobs poll); the brief itself rides the steer message
|
||||
* and renders under the PDF-complete badge in the transcript.
|
||||
*/
|
||||
export function PdfJobCard({ part }: ArtifactPartProps) {
|
||||
if (part.state !== "output-available") return null;
|
||||
return <DispatchCard toolCallId={part.toolCallId} kind="pdf" />;
|
||||
}
|
||||
|
||||
/**
|
||||
* The PDF reading brief (sources v0) — markdown body + the consulted-pages
|
||||
* line. Exported: the steer card renders it under the PDF-complete badge,
|
||||
|
||||
+12
-2
@@ -549,7 +549,14 @@ export function Chat({
|
||||
(n, m) =>
|
||||
n +
|
||||
m.parts.filter(
|
||||
(p) => p.type === "tool-research" || p.type === "tool-demo" || p.type === "tool-visual",
|
||||
// sources v0 — "tool-pdf" added to the job-part enumerations
|
||||
// (mechanical, UI-stream review at merge): poll cadence +
|
||||
// dispatch nudge + settle-sync all key on these parts.
|
||||
(p) =>
|
||||
p.type === "tool-research" ||
|
||||
p.type === "tool-demo" ||
|
||||
p.type === "tool-visual" ||
|
||||
p.type === "tool-pdf",
|
||||
).length,
|
||||
0,
|
||||
),
|
||||
@@ -576,7 +583,10 @@ export function Chat({
|
||||
for (const m of messages) {
|
||||
for (const p of m.parts) {
|
||||
if (
|
||||
(p.type === "tool-research" || p.type === "tool-demo" || p.type === "tool-visual") &&
|
||||
(p.type === "tool-research" ||
|
||||
p.type === "tool-demo" ||
|
||||
p.type === "tool-visual" ||
|
||||
p.type === "tool-pdf") && // sources v0 — see the poll-cadence enumeration above
|
||||
p.toolCallId &&
|
||||
p.state !== "input-streaming" &&
|
||||
p.state !== "output-error"
|
||||
|
||||
Reference in New Issue
Block a user