Skip to content

Commit a0c6330

Browse files
committed
feat(frontend): restore Event Flow section in Learn panel
Add back the Event Flow collapsible section showing SSE event sequences for each pattern. Adds eventFlow data to all 7 pattern content entries.
1 parent 06d71c7 commit a0c6330

File tree

2 files changed

+102
-0
lines changed

2 files changed

+102
-0
lines changed

frontend/src/components/LearnView.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ const iconSteps = (
2525
</svg>
2626
);
2727

28+
const iconStream = (
29+
<svg className="h-3.5 w-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
30+
<path strokeLinecap="round" strokeLinejoin="round" d="M17.25 6.75 22.5 12l-5.25 5.25m-10.5 0L1.5 12l5.25-5.25m7.5-3-4.5 16.5" />
31+
</svg>
32+
);
33+
2834
const iconAgents = (
2935
<svg className="h-3.5 w-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2}>
3036
<path strokeLinecap="round" strokeLinejoin="round" d="M15 19.128a9.38 9.38 0 0 0 2.625.372 9.337 9.337 0 0 0 4.121-.952 4.125 4.125 0 0 0-7.533-2.493M15 19.128v-.003c0-1.113-.285-2.16-.786-3.07M15 19.128v.106A12.318 12.318 0 0 1 8.624 21c-2.331 0-4.512-.645-6.374-1.766l-.001-.109a6.375 6.375 0 0 1 11.964-3.07M12 6.375a3.375 3.375 0 1 1-6.75 0 3.375 3.375 0 0 1 6.75 0Zm8.25 2.25a2.625 2.625 0 1 1-5.25 0 2.625 2.625 0 0 1 5.25 0Z" />
@@ -138,6 +144,13 @@ function PatternContentView({ pattern, onTryPrompt }: PatternContentViewProps) {
138144
</ol>
139145
</CollapsibleSection>
140146

147+
{/* Event Flow */}
148+
<CollapsibleSection title="Event Flow" icon={iconStream}>
149+
<pre className="text-[10px] leading-relaxed bg-[var(--color-surface-tertiary)] rounded-lg p-3 overflow-x-auto font-mono text-[var(--color-text-secondary)]">
150+
<code>{pattern.eventFlow}</code>
151+
</pre>
152+
</CollapsibleSection>
153+
141154
{/* Agent Roles */}
142155
<CollapsibleSection title="Agent Roles" icon={iconAgents}>
143156
<div className="overflow-x-auto">

frontend/src/data/pattern-content.ts

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export interface PatternContent {
1919
whenToUse: string[];
2020
architectureMermaid: string;
2121
howItWorks: string[];
22+
eventFlow: string;
2223
agents: PatternAgent[];
2324
tradeoffs: {
2425
pros: string[];
@@ -54,6 +55,14 @@ const router: PatternContent = {
5455
"The matched specialist agent processes the original input with domain-specific expertise",
5556
"The specialist's streamed response becomes the final output",
5657
],
58+
eventFlow: `agent_start {agent: "router", role: "classifier"}
59+
chunk {agent: "router", content: "BILLING"}
60+
agent_end {agent: "router", ...}
61+
handoff {from: "router", to: "billing", reason: "billing intent detected"}
62+
agent_start {agent: "billing", role: "specialist"}
63+
chunk {agent: "billing", content: "I can help with your invoice..."}
64+
agent_end {agent: "billing", ...}
65+
done {totalUsage: {...}}`,
5766
agents: [
5867
{
5968
name: "router",
@@ -129,6 +138,18 @@ const pipeline: PatternContent = {
129138
"Output passes to the Editor, who refines for clarity, grammar, and coherence",
130139
"The editor's output is the final result",
131140
],
141+
eventFlow: `agent_start {agent: "researcher", role: "research expert"}
142+
chunk {agent: "researcher", content: "...research findings..."}
143+
agent_end {agent: "researcher", ...}
144+
handoff {from: "researcher", to: "writer", reason: "passing to next stage"}
145+
agent_start {agent: "writer", role: "content writer"}
146+
chunk {agent: "writer", content: "...draft article..."}
147+
agent_end {agent: "writer", ...}
148+
handoff {from: "writer", to: "editor", reason: "passing to next stage"}
149+
agent_start {agent: "editor", role: "editor"}
150+
chunk {agent: "editor", content: "...polished article..."}
151+
agent_end {agent: "editor", ...}
152+
done {totalUsage: {...}}`,
132153
agents: [
133154
{
134155
name: "researcher",
@@ -206,6 +227,20 @@ const supervisor: PatternContent = {
206227
"Retry loop: if output is inadequate, the worker retries with the supervisor's feedback appended (up to 3 attempts)",
207228
"Final output: the last worker's accepted output becomes the pattern's result",
208229
],
230+
eventFlow: `agent_start {agent: "supervisor", role: "planner"}
231+
chunk {agent: "supervisor", content: "Plan: search -> analysis -> summary"}
232+
agent_end {agent: "supervisor", ...}
233+
handoff {from: "supervisor", to: "search", reason: "Dispatching search task"}
234+
agent_start {agent: "search", role: "information gatherer"}
235+
chunk {agent: "search", content: "...findings..."}
236+
agent_end {agent: "search", ...}
237+
handoff {from: "search", to: "supervisor", reason: "Reviewing search output"}
238+
agent_start {agent: "supervisor", role: "reviewer"}
239+
chunk {agent: "supervisor", content: "Review: adequate. ..."}
240+
agent_end {agent: "supervisor", ...}
241+
handoff {from: "supervisor", to: "analysis", reason: "Dispatching analysis task"}
242+
...
243+
done {totalUsage: {...}}`,
209244
agents: [
210245
{
211246
name: "supervisor",
@@ -286,6 +321,20 @@ const debate: PatternContent = {
286321
"This repeats for 2 rounds (configurable), with each debater seeing the full transcript so far",
287322
"After all rounds, the judge receives the complete debate transcript and delivers a verdict with reasoning",
288323
],
324+
eventFlow: `agent_start {agent: "bull", role: "debater"}
325+
chunk {agent: "bull", content: "...arguments for..."}
326+
agent_end {agent: "bull", ...}
327+
handoff {from: "bull", to: "bear", reason: "round 1"}
328+
agent_start {agent: "bear", role: "debater"}
329+
chunk {agent: "bear", content: "...arguments against..."}
330+
agent_end {agent: "bear", ...}
331+
handoff {from: "bear", to: "bull", reason: "next round"}
332+
...
333+
handoff {from: "bear", to: "judge", reason: "debate complete"}
334+
agent_start {agent: "judge", role: "judge"}
335+
chunk {agent: "judge", content: "...verdict and reasoning..."}
336+
agent_end {agent: "judge", ...}
337+
done {totalUsage: {...}}`,
289338
agents: [
290339
{
291340
name: "bull",
@@ -368,6 +417,14 @@ const swarm: PatternContent = {
368417
"The target agent can also hand off to another agent if needed",
369418
"The chain continues until an agent responds without a handoff (max 5 iterations)",
370419
],
420+
eventFlow: `agent_start {agent: "triage", role: "triage"}
421+
chunk {agent: "triage", content: "...I'll connect you..."}
422+
agent_end {agent: "triage", ...}
423+
handoff {from: "triage", to: "billing", reason: "triage handed off to billing"}
424+
agent_start {agent: "billing", role: "specialist"}
425+
chunk {agent: "billing", content: "...I can help with your invoice..."}
426+
agent_end {agent: "billing", ...}
427+
done {totalUsage: {...}}`,
371428
agents: [
372429
{
373430
name: "triage",
@@ -450,6 +507,22 @@ const mapReduce: PatternContent = {
450507
"Fan-in \u2014 a single handoff event signals all mappers are done",
451508
"Reduce \u2014 the ReducerAgent synthesizes all mapper outputs into one coherent response",
452509
],
510+
eventFlow: `agent_start {agent: "splitter", role: "splitter"}
511+
chunk {agent: "splitter", content: "...subtask plan..."}
512+
agent_end {agent: "splitter", ...}
513+
handoff {from: "splitter", to: "mapper-1", reason: "fan-out"}
514+
handoff {from: "splitter", to: "mapper-2", reason: "fan-out"}
515+
agent_start {agent: "mapper-1", role: "mapper"}
516+
agent_start {agent: "mapper-2", role: "mapper"}
517+
chunk {agent: "mapper-1", content: "...analysis A..."}
518+
chunk {agent: "mapper-2", content: "...analysis B..."}
519+
agent_end {agent: "mapper-1", ...}
520+
agent_end {agent: "mapper-2", ...}
521+
handoff {from: "mappers", to: "reducer", reason: "fan-in"}
522+
agent_start {agent: "reducer", role: "reducer"}
523+
chunk {agent: "reducer", content: "...synthesis..."}
524+
agent_end {agent: "reducer", ...}
525+
done {totalUsage: {...}}`,
453526
agents: [
454527
{
455528
name: "splitter",
@@ -524,6 +597,22 @@ const reflection: PatternContent = {
524597
"The loop repeats until pass or max iterations (3) are reached",
525598
"On the final iteration, the critic is skipped \u2014 the generator's output is the final answer",
526599
],
600+
eventFlow: `agent_start {agent: "generator", role: "content generator"}
601+
chunk {agent: "generator", content: "...initial draft..."}
602+
agent_end {agent: "generator", ...}
603+
handoff {from: "generator", to: "critic", reason: "iteration 1 — reviewing"}
604+
agent_start {agent: "critic", role: "content critic"}
605+
chunk {agent: "critic", content: "...evaluation...{verdict: revise}"}
606+
agent_end {agent: "critic", ...}
607+
handoff {from: "critic", to: "generator", reason: "revision needed: ..."}
608+
agent_start {agent: "generator", role: "content generator"}
609+
chunk {agent: "generator", content: "...revised draft..."}
610+
agent_end {agent: "generator", ...}
611+
handoff {from: "generator", to: "critic", reason: "iteration 2 — reviewing"}
612+
agent_start {agent: "critic", role: "content critic"}
613+
chunk {agent: "critic", content: "...evaluation...{verdict: pass}"}
614+
agent_end {agent: "critic", ...}
615+
done {totalUsage: {...}}`,
527616
agents: [
528617
{
529618
name: "generator",

0 commit comments

Comments
 (0)