docs: complete presentation chat timeline bridge

This commit is contained in:
lda
2026-07-09 06:23:57 +07:00 Verified
parent 0f667061cb
commit d3b37a812f
3 changed files with 18 additions and 5 deletions
+5 -4
View File
@@ -120,10 +120,11 @@ Implementation order:
approval UI instead of raw `{ "type": "object" }` as the primary product approval UI instead of raw `{ "type": "object" }` as the primary product
proof. Implementation: proof. Implementation:
[`schema approval surface`](historical/superpowers/plans/2026-07-09-schema-approval-surface.md). [`schema approval surface`](historical/superpowers/plans/2026-07-09-schema-approval-surface.md).
16. Next: bridge presentation chat to the prepared workflow timeline so chat 16. Completed: presentation chat now drives the prepared workflow timeline.
can start the live/replay demo and submit/cancel the schema approval through The chat run action, schema approval submit/cancel, graph, evidence, and
the existing `useDemoTimeline` execution path. Active implementation plan: live/replay execution all share `useDemoTimeline`; AI SDK remains a later
[`presentation chat timeline bridge`](superpowers/plans/2026-07-09-presentation-chat-timeline-bridge.md). driver for the same seam. Implementation:
[`presentation chat timeline bridge`](historical/superpowers/plans/2026-07-09-presentation-chat-timeline-bridge.md).
17. Future: implement Guided Run Beat Gates, presenter companion, Scene 10 17. Future: implement Guided Run Beat Gates, presenter companion, Scene 10
product graph, final scene visuals, evidence assets, and rehearsal timing. product graph, final scene visuals, evidence assets, and rehearsal timing.
18. Add a static slide/appendix shell only after presentation mode is clear. 18. Add a static slide/appendix shell only after presentation mode is clear.
@@ -36,7 +36,7 @@ afterEach(() => {
}); });
describe("PresentationRoute", () => { describe("PresentationRoute", () => {
it("renders the presentation stage entry point", async () => { it("renders the presentation stage entry point", { timeout: 15000 }, async () => {
const { PresentationRoute } = await import("./PresentationRoute.js"); const { PresentationRoute } = await import("./PresentationRoute.js");
render(<PresentationRoute />); render(<PresentationRoute />);
expect(screen.getByRole("main", { name: /lda.chat presentation/i })).toBeInTheDocument(); expect(screen.getByRole("main", { name: /lda.chat presentation/i })).toBeInTheDocument();
@@ -172,4 +172,16 @@ describe("PresentationRoute", () => {
expect(await screen.findByRole("heading", { name: /Interrupt, Resume, Evidence/i })).toBeInTheDocument(); expect(await screen.findByRole("heading", { name: /Interrupt, Resume, Evidence/i })).toBeInTheDocument();
expect(screen.getByLabelText("demo workflow stage")).toHaveAttribute("data-demo-layout", "approval"); expect(screen.getByLabelText("demo workflow stage")).toHaveAttribute("data-demo-layout", "approval");
}); });
it("chat run action advances the replay timeline when no live server is configured", async () => {
setReplayMode();
window.location.hash = "#scene/workflow-demo/operation";
const user = userEvent.setup();
const { PresentationRoute } = await import("./PresentationRoute.js");
render(<PresentationRoute />);
const runButton = await screen.findByRole("button", { name: /run replay walkthrough/i });
await user.click(runButton);
expect(await screen.findByLabelText("workflow.runs.start operation")).toBeInTheDocument();
});
}); });