Repository navigation
Commit 471855d
feat(examples/chat): /hero route — replayed LangGraph walkthrough with live takeover (#976)
* docs(specs): homepage rebuild design — category hero, live take-over demo, install dialog
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* docs(specs): homepage rebuild — pin /hero route design to verified adapter and demo APIs
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* docs(plans): homepage rebuild — hero demo route and website implementation plans
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* feat(examples/chat): hero recording types and validator
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* feat(examples/chat): HeroReplayTransport plays recorded runs with clamped pacing
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* feat(examples/chat): HeroRecordingTransport captures live runs for the hero fixture
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* fix(examples/chat): avoid require-yield lint error in HeroRecordingTransport
joinStream's no-op fallback used an empty async generator, which trips
@typescript-eslint's require-yield rule. Replace it with a plain
AsyncIterable object instead.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* feat(examples/chat): HeroScriptRunner drives the walkthrough through a host interface
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* feat(examples/chat): hero postMessage bridge with parent-origin allowlist
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* feat(examples/chat): hero cursor component
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* refactor(examples/chat): HeroReplayTransport needs no Injectable decorator
Constructor params are interface/function typed, so DI metadata is
inert; the class is provided via useValue/useFactory instead.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* fix(examples/chat): avoid empty-function lint error in hero-script spec
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* feat(examples/chat): register lazy /hero route and hero agent refs
* fix(examples/chat): hero transports — retry failed fixture loads, register runs lazily, reject empty runs
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* feat(examples/chat): HeroMode route — replay agent, scripted cursor, takeover to live LangGraph
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* fix(examples/chat): hero script runner generation token, timeouts and error path; bridge source check and preview origins
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* feat(examples/chat): record and commit the hero walkthrough fixture
Adds the recording harness (record-hero.config.ts + record-hero-fixture.record.ts)
that drives /hero?record=1 against the aimock-backed LangGraph backend and writes
public/hero-replay.json, plus a spec that guards the committed fixture.
Two blockers the recording surfaced:
- HeroMode.boot() bailed out before starting the script runner whenever the
replay fixture failed to load. In record mode the fixture is the artifact
being produced, so it is always missing on the first pass — record mode now
falls through and drives the live agent.
- The interrupt-approval aimock fixture had no `hasToolResult: true` entry, so
the post-resume turn re-matched the tool-call fixture and the approval looped
forever. Adds the narration entry ahead of it.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* fix(examples/chat): hero mode — takeover gating, visibility sources, per-instance agents, DOM host extraction and tests
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* test(examples/chat): e2e for the hero walkthrough and takeover
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* feat(website): hero walkthrough poster captured from /hero
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* fix(examples/chat): hero mode — honest initial frame state, guarded replay stop, clear composer on takeover
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* fix(examples/chat): hero bridge learns the parent origin from the first allowlisted message
Under a strict Referrer-Policy the referrer is empty and the frame could never
post ready. The bridge now also learns the origin from the first allowlisted
inbound message and replays the latest state; the website plan posts visibility
on iframe load so that handshake happens. Also fixes the poster script's
documented command and the poster alt text in the website plan.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
* fix(examples/chat): type the hero recording validator callbacks for strict consumers
The packaged-consumer smoke compiles the demo app under noImplicitAny; the
Array.isArray narrowing left two forEach parameters implicitly any.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>1 parent 0aaed36 commit 471855d
30 files changed
Lines changed: 14238 additions & 0 deletions
File tree
- apps/website/public/screenshots
- docs/superpowers
- plans
- specs
- examples/chat/angular
- e2e
- fixtures
- public
- src/app
- hero
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
3 | 12 | | |
4 | 13 | | |
5 | 14 | | |
| |||
| 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 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 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 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 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 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 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 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
0 commit comments