Commit f4c7b80
fix(cockpit-langgraph): make the subgraphs example demonstrate real nesting (#838)
The `cockpit/langgraph/subgraphs` example advertised subagent delegation it
could never perform. `app.config.ts` set no `subagentToolNames`, and the graph
added a compiled subgraph as a plain node — which emits a `research:<uuid>`
namespace, not `tools:<id>`. The SubagentTracker only registers delegation
tool calls, so `agent.subagents()` was permanently empty and the sidebar always
rendered "No active subagents". The manual e2e asserted exactly that empty
state and nothing else. The parent's edges were unconditional, so nothing
decided anything, and both graphs were bare `MessagesState` with no boundary.
Kept the plain subgraph-as-node pattern rather than converting to the tool-call
path: `cockpit/chat/subagents` already demonstrates tool-call delegation end to
end, and this is the repo's only example of LangGraph's actual composition
primitive. The website docs already state the rule
(docs/langgraph/guides/subgraphs.mdx:114 — "Plain subgraph nodes do not appear
in this map"); the example now agrees with them instead of contradicting them.
Backend:
- `orchestrate` makes a structured routing decision; a conditional edge enters
the child graph or skips straight to `answer`.
- The child's state (`ResearchState`) has no `messages` key, so it exchanges
only `research_topic` / `research_brief` with the parent and can neither read
nor append to the transcript.
- `answer` is the sole transcript-writing node.
Frontend:
- Sidebar reads the parent's own state via a typed `agent.value()` instead of
the map that can never fill, and says plainly why.
- `transcriptNodeNames: ['answer']`. Verified live: without it the message list
transiently grows to 3 as the child's tokens merge in and its internal brief
renders as a chat bubble, before the parent's `values` event collapses it
back to 2. Self-correcting end state, so no final-state assertion catches it.
Tests: three e2e specs replacing the smoke test — the research branch populates
the sidebar, the child's brief never reaches the transcript (paired with a
positive sidebar assertion so it can't pass vacuously), and the direct branch
skips the child and still answers. The manual live-LLM spec asserts the branch
that ran rather than an empty state.
Verified: e2e 3/3 green; production build green; both branches driven against a
real model in Chrome, with the transcript boundary checked from the live DOM.
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>1 parent d2e5ce7 commit f4c7b80
12 files changed
Lines changed: 567 additions & 173 deletions
File tree
- cockpit/langgraph/subgraphs
- angular
- e2e
- fixtures
- manual
- prompts
- src
- app
- python
- docs
- prompts
- src
Lines changed: 33 additions & 5 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
5 | | - | |
6 | | - | |
| 4 | + | |
7 | 5 | | |
8 | | - | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
9 | 37 | | |
10 | 38 | | |
11 | 39 | | |
12 | | - | |
| 40 | + | |
Lines changed: 33 additions & 9 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
1 | 7 | | |
2 | 8 | | |
3 | | - | |
| 9 | + | |
4 | 10 | | |
5 | 11 | | |
6 | 12 | | |
7 | 13 | | |
8 | 14 | | |
9 | | - | |
10 | | - | |
11 | | - | |
12 | | - | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
13 | 29 | | |
14 | 30 | | |
15 | | - | |
16 | | - | |
| 31 | + | |
| 32 | + | |
17 | 33 | | |
18 | | - | |
19 | | - | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
20 | 44 | | |
21 | 45 | | |
Lines changed: 54 additions & 6 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
4 | 3 | | |
5 | | - | |
6 | | - | |
7 | | - | |
8 | | - | |
9 | | - | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
10 | 58 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
4 | 6 | | |
5 | | - | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
| 6 | + | |
6 | 7 | | |
7 | 8 | | |
8 | 9 | | |
9 | | - | |
| 10 | + | |
10 | 11 | | |
11 | 12 | | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
12 | 25 | | |
13 | 26 | | |
14 | 27 | | |
| |||
0 commit comments