Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
</p>

<p align="center">
<em>Agent UI primitives and LangGraph streaming adapters for Angular</em>
<em>Agent UI for Angular — Production-ready chat, threads, and generative UI for AI agents.</em>
</p>

<p align="center">
Expand All @@ -27,7 +27,9 @@

---

`agent()` is the Angular equivalent of LangGraph's React `useStream()` hook, projected into a runtime-neutral `Agent` contract consumed by `@ngaf/chat`. Drop it into any Angular 20+ component, point it at your LangGraph Platform endpoint, and get signal-driven access to messages, status, tool calls, interrupts, subagents, regenerate, and thread history.
ThreadPlane is a production-ready agent UI framework for Angular. Use `@ngaf/chat` for chat surfaces, `@ngaf/langgraph` for LangGraph-backed agents, `@ngaf/ag-ui` for AG-UI event streams, and `@ngaf/render` for generative UI that stays inside your Angular design system.

When you are building on LangGraph, `agent()` is the Angular equivalent of LangGraph's React `useStream()` hook, projected into a runtime-neutral `Agent` contract consumed by `@ngaf/chat`. Drop it into any Angular 20+ component, point it at your LangGraph Platform endpoint, and get signal-driven access to messages, status, tool calls, interrupts, subagents, regenerate, and thread history.

---

Expand Down
2 changes: 1 addition & 1 deletion apps/website/content/AGENTS.md.template
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Agent UI for Angular v@VERSION@

Agent UI primitives and LangGraph streaming adapters for Angular.
Production-ready chat, durable threads, interrupts, subagents, planning, memory, and generative UI for Angular agent apps.

## Install
npm install @ngaf/chat @ngaf/langgraph
Expand Down
2 changes: 1 addition & 1 deletion apps/website/content/CLAUDE.md.template
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Agent UI for Angular v@VERSION@

Agent UI primitives and LangGraph streaming adapters for Angular.
Production-ready chat, durable threads, interrupts, subagents, planning, memory, and generative UI for Angular agent apps.

## Install
npm install @ngaf/chat @ngaf/langgraph
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Introduction

Agent is the Signal-native streaming library for Angular 20+ — built natively for LangGraph, without React translation layers. Build streaming AI applications with Angular Signals, connect to LangGraph agents, and ship production-ready frontends for your AI products.
Agent is the Angular adapter layer for production-ready agent UI surfaces: chat, durable threads, interrupts, subagents, planning, memory, and generative UI. Build complete Angular 20+ agent applications with Signals, connect them to LangGraph agents, and keep the UI inside Angular templates, dependency injection, and your design system.

<Callout type="info" title="What you'll learn">
This guide walks you through the complete workflow: build a LangGraph agent in Python, run it locally, connect it to an Angular app with agent(), and deploy to production.
Expand Down
2 changes: 1 addition & 1 deletion apps/website/emails/angular-download.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ const DOWNLOAD_URL = 'https://threadplane.ai/whitepapers/angular.pdf';
export function angularDownloadHtml(name?: string): string {
return wrapEmail({
body: `
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 8px;line-height:1.3">Your Enterprise Guide to Agent Streaming</p>
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 8px;line-height:1.3">Your Enterprise Guide to Agent UI in Angular</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">${name ? `Hi ${esc(name)}, t` : 'T'}he guide covers six chapters: the last-mile problem, the agent() API, thread persistence, interrupt flows, full LangGraph feature coverage, and deterministic testing.</p>
<div style="text-align:center;margin:0 0 4px">
<a href="${DOWNLOAD_URL}" style="display:inline-block;background-color:#004090;color:#fff;padding:12px 32px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">Download the Guide</a>
Expand Down
2 changes: 1 addition & 1 deletion apps/website/emails/drip-chat-followup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export function dripChatFollowupHtml(day: number): { subject: string; html: stri
body: `
<p style="font-size:11px;font-family:monospace;text-transform:uppercase;letter-spacing:0.08em;color:#5a00c8;font-weight:700;margin:0 0 8px">Chat Guide Follow-up</p>
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 14px;line-height:1.3">Did you read Chapter 2 on batteries-included components?</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">Chapter 2 covers the <strong>batteries-included component library</strong> — message bubbles, streaming indicators, thread lists, and input controls that are pre-wired to LangGraph state. Drop them in and your chat UI works on day one.</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">Chapter 2 covers the <strong>batteries-included component library</strong> — message bubbles, streaming indicators, thread lists, and input controls that are pre-wired to agent state. Drop them in and your chat UI works on day one.</p>
<a href="https://threadplane.ai/docs" style="display:inline-block;background-color:#5a00c8;color:#fff;padding:12px 28px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">Read the Docs →</a>
`,
showUnsubscribe: true,
Expand Down
2 changes: 1 addition & 1 deletion apps/website/emails/email-wrapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export function wrapEmail(opts: {
<div style="padding:32px">
${opts.body}
<div style="border-top:1px solid #e6e8ee;margin-top:28px;padding-top:16px">
<p style="font-size:11px;color:#8b8fa3;line-height:1.5;margin:0">Agent UI for Angular — Signal-native streaming for LangGraph.</p>
<p style="font-size:11px;color:#8b8fa3;line-height:1.5;margin:0">Agent UI for Angular — Production-ready chat, threads, and generative UI for AI agents.</p>
${opts.showUnsubscribe ? '<p style="font-size:10px;color:#8b8fa3;margin:6px 0 0"><a href="https://threadplane.ai/api/unsubscribe?email=RECIPIENT" style="color:#8b8fa3;text-decoration:underline">Unsubscribe</a></p>' : ''}
</div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion apps/website/emails/whitepaper-download.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ const DOWNLOAD_URL = 'https://threadplane.ai/whitepaper.pdf';
export function whitepaperDownloadHtml(name?: string): string {
return wrapEmail({
body: `
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 8px;line-height:1.3">Your Angular Agent Readiness Guide</p>
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 8px;line-height:1.3">Your Enterprise Agent UI Guide for Angular</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">${name ? `Hi ${esc(name)}, t` : 'T'}he guide covers six production-readiness dimensions: streaming state, thread persistence, tool-call rendering, human approval flows, generative UI, and deterministic testing.</p>
<div style="text-align:center;margin:0 0 4px">
<a href="${DOWNLOAD_URL}" style="display:inline-block;background-color:#004090;color:#fff;padding:12px 32px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">Download the Guide</a>
Expand Down
2 changes: 1 addition & 1 deletion apps/website/public/AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Agent UI for Angular v0.0.40

Agent UI primitives and LangGraph streaming adapters for Angular.
Production-ready chat, durable threads, interrupts, subagents, planning, memory, and generative UI for Angular agent apps.

## Install
npm install @ngaf/chat @ngaf/langgraph
Expand Down
2 changes: 1 addition & 1 deletion apps/website/public/CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Agent UI for Angular v0.0.40

Agent UI primitives and LangGraph streaming adapters for Angular.
Production-ready chat, durable threads, interrupts, subagents, planning, memory, and generative UI for Angular agent apps.

## Install
npm install @ngaf/chat @ngaf/langgraph
Expand Down
2 changes: 1 addition & 1 deletion apps/website/public/assets/arch-diagram.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion apps/website/public/assets/hero.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 4 additions & 4 deletions apps/website/public/whitepaper-preview.html
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@

<!-- Cover -->
<div style="height:100vh;display:flex;flex-direction:column;justify-content:flex-end;padding:80px 80px 100px;background:linear-gradient(135deg, #fafbfc 0%, #eaf3ff 100%);page-break-after:always">
<div style="font-family:monospace;font-size:11px;text-transform:uppercase;letter-spacing:0.12em;color:#004090;font-weight:700;margin-bottom:24px">@ngaf/langgraph · Production Readiness Guide</div>
<h1 style="font-family:'EB Garamond',serif;font-size:52px;font-weight:800;line-height:1.1;color:#1a1a2e;margin-bottom:20px">From<br>Prototype<br>to<br>Production</h1>
<p style="font-family:'EB Garamond',serif;font-style:italic;font-size:20px;color:#555770;margin-bottom:40px">The Angular Agent Readiness Guide</p>
<div style="font-family:monospace;font-size:11px;text-transform:uppercase;letter-spacing:0.12em;color:#004090;font-weight:700;margin-bottom:24px">ThreadPlane · Enterprise Angular Agent UI</div>
<h1 style="font-family:'EB Garamond',serif;font-size:52px;font-weight:800;line-height:1.1;color:#1a1a2e;margin-bottom:20px">Agent<br>UI<br>for<br>Angular</h1>
<p style="font-family:'EB Garamond',serif;font-style:italic;font-size:20px;color:#555770;margin-bottom:40px">Production-ready chat, threads, and generative UI for AI agents</p>
<div style="font-size:13px;color:#8b8fa3;font-family:monospace">threadplane.ai · 2026</div>
</div>

Expand Down Expand Up @@ -65,7 +65,7 @@ <h2 style="font-family:'EB Garamond',serif;font-size:36px;font-weight:800;color:
<p>Server-sent events don't play nicely with Angular's change detection. Zone.js patches `EventSource`, but the resulting microtask scheduling creates timing issues—tokens arrive faster than digest cycles complete, leading to dropped renders or, worse, accumulated state that suddenly flushes in a visual stutter. Teams typically respond by wrapping streams in `NgZone.run()`, manually calling `detectChanges()`, or building elaborate buffer-and-flush mechanisms. All of these approaches share a common failure mode: they work in development and break under production load.</p>
<p>The root issue isn't Zone.js itself—it's the impedance mismatch between push-based streaming and Angular's pull-based change detection model. When your LangGraph agent streams 50 tokens per second, you need state primitives that coalesce updates intelligently while remaining reactive enough to drive smooth UI. Custom solutions invariably choose wrong: either they batch too aggressively (laggy typing effect) or too little (CPU saturation from excess renders).</p>
<h3>Signals as the Synchronization Primitive</h3>
<p>The `agent()` function returns a signals-native interface that sidesteps these problems entirely. Rather than exposing raw event streams that require manual subscription management, it provides computed signals that update atomically as tokens arrive:</p>
<p>The `agent()` function returns an Angular signals-based interface that sidesteps these problems entirely. Rather than exposing raw event streams that require manual subscription management, it provides computed signals that update atomically as tokens arrive:</p>
<pre><code>@Component({
selector: 'app-chat',
template: `
Expand Down
Binary file modified apps/website/public/whitepaper.pdf
Binary file not shown.
8 changes: 4 additions & 4 deletions apps/website/public/whitepapers/angular-preview.html
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@

<!-- Cover -->
<div style="height:100vh;display:flex;flex-direction:column;justify-content:flex-end;padding:80px 80px 100px;background:linear-gradient(135deg, #fafbfc 0%, #eaf3ff 100%);page-break-after:always">
<div style="font-family:monospace;font-size:11px;text-transform:uppercase;letter-spacing:0.12em;color:#004090;font-weight:700;margin-bottom:24px">@ngaf/langgraph · Enterprise Guide</div>
<h1 style="font-family:'EB Garamond',serif;font-size:52px;font-weight:800;line-height:1.1;color:#1a1a2e;margin-bottom:20px">The<br>Enterprise<br>Guide<br>to<br>Agent<br>Streaming<br>in<br>Angular</h1>
<p style="font-family:'EB Garamond',serif;font-style:italic;font-size:20px;color:#555770;margin-bottom:40px">Ship LangGraph agents in Angular — without building the plumbing</p>
<div style="font-family:monospace;font-size:11px;text-transform:uppercase;letter-spacing:0.12em;color:#004090;font-weight:700;margin-bottom:24px">ThreadPlane · Angular Agent UI Guide</div>
<h1 style="font-family:'EB Garamond',serif;font-size:52px;font-weight:800;line-height:1.1;color:#1a1a2e;margin-bottom:20px">The<br>Enterprise<br>Guide<br>to<br>Agent<br>UI<br>in<br>Angular</h1>
<p style="font-family:'EB Garamond',serif;font-style:italic;font-size:20px;color:#555770;margin-bottom:40px">Ship LangGraph and AG-UI-compatible agents without building the plumbing</p>
<div style="font-size:13px;color:#8b8fa3;font-family:monospace">threadplane.ai · 2026</div>
</div>

Expand Down Expand Up @@ -145,7 +145,7 @@ <h3>The Alternative</h3>
<p>With `agent()`:</p>
<pre><code>readonly chat = agent({ assistantId: 'chat_agent' });
</code></pre>
<p>The signal-native design eliminates the subscription lifecycle entirely. When the component destroys, the signals become inert. No `takeUntilDestroyed()`. No `ngOnDestroy`. The framework handles it.</p></div>
<p>The Angular signals-based design eliminates the subscription lifecycle entirely. When the component destroys, the signals become inert. No `takeUntilDestroyed()`. No `ngOnDestroy`. The framework handles it.</p></div>
</section>
<section style="padding:80px;page-break-before:always">
<div style="font-family:monospace;font-size:11px;text-transform:uppercase;letter-spacing:0.1em;color:#004090;font-weight:700;margin-bottom:16px">Chapter 3</div>
Expand Down
Binary file modified apps/website/public/whitepapers/angular.pdf
Binary file not shown.
Binary file modified apps/website/public/whitepapers/chat.pdf
Binary file not shown.
Binary file modified apps/website/public/whitepapers/render.pdf
Binary file not shown.
Loading