Chapter 3: The agent() API
-
The core primitive in `@cacheplane/angular` is `agent()` — a factory function that returns a structured ref containing typed signals wired directly to a LangGraph agent stream. You call it once, bind the signals in your template, and the component reacts to every streamed token without a subscription, a zone trigger, or an accumulation buffer in sight.
+
The core primitive in `@cacheplane/langgraph` is `agent()` — a factory function that returns a structured ref containing typed signals wired directly to a LangGraph agent stream. You call it once, bind the signals in your template, and the component reacts to every streamed token without a subscription, a zone trigger, or an accumulation buffer in sight.
What agent() Returns
`agent()` returns an `AgentRef` object with four signals:
interface AgentRef {
@@ -185,12 +185,12 @@ Production Checklist
Chapter 4
Interrupt & Approval Flows
Chapter 7: Interrupt & Approval Flows
-
Agents that interact with external systems — firing off emails, mutating database records, executing privileged queries — cannot operate as fire-and-forget processes in an enterprise context. Execution must be pauseable, inspectable, and resumable with explicit human intent. LangGraph's `interrupt()` primitive and `@cacheplane/angular`'s reactive surface for it give you exactly that, without polling loops or bespoke WebSocket plumbing.
+
Agents that interact with external systems — firing off emails, mutating database records, executing privileged queries — cannot operate as fire-and-forget processes in an enterprise context. Execution must be pauseable, inspectable, and resumable with explicit human intent. LangGraph's `interrupt()` primitive and `@cacheplane/langgraph`'s reactive surface for it give you exactly that, without polling loops or bespoke WebSocket plumbing.
How LangGraph interrupt() Works
When a LangGraph node calls `interrupt(payload)`, graph execution halts at that checkpoint. The payload is an arbitrary object you define — typically the action description, affected resource identifiers, and any data the reviewer needs to make a decision. The graph persists this state to its checkpointer and waits. Nothing proceeds until a resume command arrives with the correct thread ID and checkpoint reference.
The resume payload follows a typed contract: `{ action: "approve" | "edit" | "cancel", data?: unknown }`. On `approve`, the graph continues with the original node inputs. On `edit`, your modified `data` is injected, replacing what the node would have used. On `cancel`, LangGraph short-circuits the remaining path and routes to whatever terminal state you've configured for rejected flows.
The Interrupt Signal in Angular
-
`@cacheplane/angular` exposes this checkpoint state directly on the agent reference. The `interrupt` property is a computed signal that starts as `null` and transitions to an `InterruptState` object the moment the backend checkpoint is written:
+
`@cacheplane/langgraph` exposes this checkpoint state directly on the agent reference. The `interrupt` property is a computed signal that starts as `null` and transitions to an `InterruptState` object the moment the backend checkpoint is written:
const agent = injectAgentRef({ threadId });
const interrupt = agent.interrupt; // Signal
const handleApprove = () =>
@@ -221,16 +221,16 @@
Edge Cases Worth Handling
Chapter 5
Full LangGraph Feature Coverage
Chapter 4: Full LangGraph Feature Coverage
-
Basic chat streaming is a solved problem. The real engineering challenge begins when your graph does something more interesting—calls a tool, delegates to a subagent, or needs to rewind to a prior checkpoint. Most Angular LLM libraries handle the simple case and then quietly stop working. This chapter documents how `@cacheplane/angular` exposes the full LangGraph feature surface through a coherent signal-based API.
+
Basic chat streaming is a solved problem. The real engineering challenge begins when your graph does something more interesting—calls a tool, delegates to a subagent, or needs to rewind to a prior checkpoint. Most Angular LLM libraries handle the simple case and then quietly stop working. This chapter documents how `@cacheplane/langgraph` exposes the full LangGraph feature surface through a coherent signal-based API.
---
Tool Call Streaming
-
When a LangGraph node invokes a tool, the graph emits a structured sequence of events: the tool call intent, intermediate streaming deltas, and the final tool result. Rather than requiring you to parse raw SSE frames and reconstruct this sequence manually, `@cacheplane/angular` surfaces tool invocation lifecycle through the agent ref directly.
+
When a LangGraph node invokes a tool, the graph emits a structured sequence of events: the tool call intent, intermediate streaming deltas, and the final tool result. Rather than requiring you to parse raw SSE frames and reconstruct this sequence manually, `@cacheplane/langgraph` surfaces tool invocation lifecycle through the agent ref directly.
The `toolCalls` signal on the agent ref updates reactively as each tool call progresses. You get the tool name, input arguments as they stream in, execution status, and the final output—all typed, all reactive. Your component never needs to touch the underlying event stream to render a "Searching the web…" indicator or display structured tool output inline.
This matters because tool call parsing is subtle. Argument deltas arrive as partial JSON strings. Parallel tool calls interleave. A naive implementation collapses these into noise. The library handles reconstruction and ordering internally.
---
Subgraph Event Propagation
LangGraph supports nested graphs, and real production agents use them. Events emitted inside a subgraph are namespaced by graph path, which means consuming them correctly requires understanding the event hierarchy.
-
`@cacheplane/angular` flattens subgraph events into the parent stream while preserving their origin metadata. If you care about which subgraph produced a message—for routing UI panels, for logging, or for debugging—you have access to the full event path. If you don't care, the default signal behavior aggregates everything cleanly without requiring you to configure traversal logic.
+
`@cacheplane/langgraph` flattens subgraph events into the parent stream while preserving their origin metadata. If you care about which subgraph produced a message—for routing UI panels, for logging, or for debugging—you have access to the full event path. If you don't care, the default signal behavior aggregates everything cleanly without requiring you to configure traversal logic.
---
Time Travel
LangGraph's checkpoint system allows you to rewind graph state to any prior node execution and re-run from that point. This is not a niche feature—it's the foundation of any agent UI that allows users to correct mistakes or explore alternative paths.
@@ -238,7 +238,7 @@
Time Travel
---
DeepAgent Multi-Agent Coordination
DeepAgent introduces orchestrator-subagent topology at the stream level. An orchestrator dispatches work to specialized agents and aggregates their outputs. From the stream consumer's perspective, this produces interleaved events from multiple graph instances.
-
`@cacheplane/angular` maps each active agent to its own scoped signal context. The orchestrator's agent ref exposes a `subagents` signal—a reactive map of active agent IDs to their respective state signals. You can bind a list of subagent components to this map and let Angular's `@for` loop handle the rest. Agent addition, completion, and failure all propagate as signal updates without manual subscription management.
+
`@cacheplane/langgraph` maps each active agent to its own scoped signal context. The orchestrator's agent ref exposes a `subagents` signal—a reactive map of active agent IDs to their respective state signals. You can bind a list of subagent components to this map and let Angular's `@for` loop handle the rest. Agent addition, completion, and failure all propagate as signal updates without manual subscription management.
---
The `onCustomEvent` Hook
LangGraph nodes can emit arbitrary structured events outside the message channel. These are the primitives for generative UI, analytics instrumentation, and intermediate state reporting.
diff --git a/apps/website/public/whitepapers/chat-preview.html b/apps/website/public/whitepapers/chat-preview.html
index 5f364794d..b3e27b960 100644
--- a/apps/website/public/whitepapers/chat-preview.html
+++ b/apps/website/public/whitepapers/chat-preview.html
@@ -102,7 +102,7 @@
The Headless Tier
---
The Prebuilt Tier
`chat-prebuilt` is a single component that composes all four headless primitives internally, applies a production-quality default theme, and handles responsive layout. Zero configuration is required beyond connecting an agent reference.
-
import { AgentService } from '@cacheplane/angular';
+import { AgentService } from '@cacheplane/langgraph';
import { ChatPrebuiltComponent } from '@cacheplane/chat';
@Component({
selector: 'app-support',
@@ -122,7 +122,7 @@
The Prebuilt Tier
That is a fully functional streaming chat interface. Message history, input handling, tool call display, and interrupt controls are all included.
---
How the Component Model Connects
-Both tiers consume the `AgentRef` produced by `@cacheplane/angular`. The `AgentRef` is a stable reference that exposes an `AIMessage[]` signal, a send method, and a cancellation interface. Components bind to this ref and react to signal emissions via Angular's standard reactivity primitives — no custom change detection strategies required, no zone workarounds.
+Both tiers consume the `AgentRef` produced by `@cacheplane/langgraph`. The `AgentRef` is a stable reference that exposes an `AIMessage[]` signal, a send method, and a cancellation interface. Components bind to this ref and react to signal emissions via Angular's standard reactivity primitives — no custom change detection strategies required, no zone workarounds.
When the agent emits a new token mid-stream, the `AIMessage[]` signal updates, and `chat-messages` incrementally patches the DOM. The mechanism is straightforward signal subscription. There is no proprietary diffing layer to reason about.
---
Composing the Two Tiers
diff --git a/apps/website/scripts/generate-whitepaper.ts b/apps/website/scripts/generate-whitepaper.ts
index 6046293be..c03f65bce 100644
--- a/apps/website/scripts/generate-whitepaper.ts
+++ b/apps/website/scripts/generate-whitepaper.ts
@@ -150,7 +150,7 @@ Tone: Direct, technical, peer-to-peer. No fluff. Audience is senior Angular engi
id: 'angular',
title: 'The Enterprise Guide to Agent Streaming in Angular',
subtitle: 'Ship LangGraph agents in Angular — without building the plumbing',
- eyebrow: '@cacheplane/angular · Enterprise Guide',
+ eyebrow: '@cacheplane/langgraph · Enterprise Guide',
coverGradient: 'linear-gradient(135deg, #eaf3ff 0%, #e6f4ff 45%, #f4f0ff 70%, #fef0f3 100%)',
outputPdf: 'apps/website/public/whitepapers/angular.pdf',
outputHtml: 'apps/website/public/whitepapers/angular-preview.html',
@@ -181,7 +181,7 @@ Tone: Direct, technical, peer-to-peer. No fluff. Audience is senior Angular engi
Chapter topic: The agent() API
-Context: @cacheplane/angular exposes a signal-native API for streaming LangGraph agents into Angular components. The core primitive is agent() — a function that returns reactive signals wired directly to the agent stream, with no manual subscription management, no zone-patching, and no token accumulation logic.
+Context: @cacheplane/langgraph exposes a signal-native API for streaming LangGraph agents into Angular components. The core primitive is agent() — a function that returns reactive signals wired directly to the agent stream, with no manual subscription management, no zone-patching, and no token accumulation logic.
Cover:
- How agent() returns a structured ref with typed signals: messages(), isStreaming(), error(), interrupt()
@@ -220,7 +220,7 @@ Tone: Direct, technical, peer-to-peer. No fluff. Audience is senior Angular engi
Chapter topic: Interrupt & Approval Flows
-Context: Agents that take real-world actions — sending emails, executing queries, modifying records — must pause for human confirmation. LangGraph's interrupt() primitive enables this on the backend. @cacheplane/angular surfaces it as a reactive signal, eliminating the need for polling, websockets, or custom resume endpoints.
+Context: Agents that take real-world actions — sending emails, executing queries, modifying records — must pause for human confirmation. LangGraph's interrupt() primitive enables this on the backend. @cacheplane/langgraph surfaces it as a reactive signal, eliminating the need for polling, websockets, or custom resume endpoints.
Cover:
- How LangGraph interrupt() pauses graph execution and what the resume payload looks like
@@ -239,7 +239,7 @@ Tone: Direct, technical, peer-to-peer. No fluff. Audience is senior Angular engi
Chapter topic: Full LangGraph Feature Coverage
-Context: Most Angular LLM integrations support basic chat. @cacheplane/angular is designed for the full LangGraph feature surface: tool calls, subgraphs, time travel, and DeepAgent multi-agent coordination. Teams shouldn't have to drop down to raw SSE parsing to access advanced graph features.
+Context: Most Angular LLM integrations support basic chat. @cacheplane/langgraph is designed for the full LangGraph feature surface: tool calls, subgraphs, time travel, and DeepAgent multi-agent coordination. Teams shouldn't have to drop down to raw SSE parsing to access advanced graph features.
Cover:
- Tool call streaming: how tool invocation events surface through the agent ref without manual parsing
@@ -424,7 +424,7 @@ Cover:
- The headless tier: chat-messages, chat-input, chat-tool-calls, chat-interrupt — behavior without styling
- The prebuilt tier: chat-prebuilt — a full chat interface in one component, zero configuration
- How the two tiers compose: using prebuilt for 90% of UI, dropping to headless for custom sections
-- The component model: how @cacheplane/chat connects to the agent ref from @cacheplane/angular
+- The component model: how @cacheplane/chat connects to the agent ref from @cacheplane/langgraph
- Message rendering: how AIMessage[] from the agent signal maps to chat message display
- Code example: with an agent ref (6-10 lines)
- When to use headless vs. prebuilt and how to migrate between them
diff --git a/apps/website/src/app/angular/page.tsx b/apps/website/src/app/angular/page.tsx
index db32099e4..be1819f2c 100644
--- a/apps/website/src/app/angular/page.tsx
+++ b/apps/website/src/app/angular/page.tsx
@@ -10,7 +10,7 @@ import { AngularFooterCTA } from '../../components/landing/angular/AngularFooter
import { tokens } from '@cacheplane/design-tokens';
export const metadata = {
- title: '@cacheplane/angular — Agent Streaming for Angular',
+ title: '@cacheplane/langgraph — Agent Streaming for Angular',
description: 'Ship LangGraph agents in Angular. Signal-native streaming, thread persistence, interrupts, and deterministic testing.',
};
diff --git a/apps/website/src/app/llms-full.txt/route.ts b/apps/website/src/app/llms-full.txt/route.ts
index d0f2672fe..86548098f 100644
--- a/apps/website/src/app/llms-full.txt/route.ts
+++ b/apps/website/src/app/llms-full.txt/route.ts
@@ -41,7 +41,7 @@ export async function GET() {
[
'## MCP server',
'',
- 'npx @cacheplane/angular-mcp',
+ 'npx @cacheplane/langgraph-mcp',
'Add to Claude Code settings.json, Cursor .cursor/mcp.json, or any MCP-compatible agent.',
].join('\n'),
];
diff --git a/apps/website/src/app/llms.txt/route.ts b/apps/website/src/app/llms.txt/route.ts
index 6068ea8ef..9e61835e5 100644
--- a/apps/website/src/app/llms.txt/route.ts
+++ b/apps/website/src/app/llms.txt/route.ts
@@ -10,7 +10,7 @@ function buildLlmsTxt(): string {
"Angular Agent Framework — the enterprise streaming library for LangChain/LangGraph. Provides agent() — full parity with React's useStream() hook, built on Angular Signals.",
'',
'## Install',
- 'npm install @cacheplane/angular',
+ 'npm install @cacheplane/langgraph',
'',
'## Key API',
'- agent(options): AgentRef — call in Angular injection context (constructor or field initializer)',
@@ -22,13 +22,13 @@ function buildLlmsTxt(): string {
'- MockAgentTransport — deterministic unit testing without a real server',
'',
'## Minimal example',
- "import { agent } from '@cacheplane/angular';",
+ "import { agent } from '@cacheplane/langgraph';",
"const chat = agent({ assistantId: 'chat_agent', apiUrl: 'http://localhost:2024' });",
'// Template: @for (msg of chat.messages(); track $index) { {{ msg.content }}
}',
"// Submit: chat.submit({ messages: [{ role: 'human', content: input }] })",
'',
'## MCP server',
- 'npx @cacheplane/angular-mcp',
+ 'npx @cacheplane/langgraph-mcp',
'',
'## Full reference',
'https://cacheplane.ai/llms-full.txt',
diff --git a/apps/website/src/components/landing/HeroTwoCol.tsx b/apps/website/src/components/landing/HeroTwoCol.tsx
index 040f9f8a4..8bc8afa90 100644
--- a/apps/website/src/components/landing/HeroTwoCol.tsx
+++ b/apps/website/src/components/landing/HeroTwoCol.tsx
@@ -2,7 +2,7 @@ import { GenerativeUIFrame } from './GenerativeUIFrame';
import { CopyPromptButton } from '../docs/CopyPromptButton';
import { tokens } from '@cacheplane/design-tokens';
-const SETUP_SNIPPET = 'npm install @cacheplane/angular\n\n// app.config.ts\nprovideAgent({ apiUrl: \'http://localhost:2024\' })';
+const SETUP_SNIPPET = 'npm install @cacheplane/langgraph\n\n// app.config.ts\nprovideAgent({ apiUrl: \'http://localhost:2024\' })';
function LangChainBadge() {
return (
@@ -110,7 +110,7 @@ export async function HeroTwoCol() {
fontSize: 12,
color: tokens.colors.textMuted,
}}>
- npm install @cacheplane/angular
+ npm install @cacheplane/langgraph
diff --git a/apps/website/src/components/landing/LibrariesSection.tsx b/apps/website/src/components/landing/LibrariesSection.tsx
index 9da062bc2..d86df0d60 100644
--- a/apps/website/src/components/landing/LibrariesSection.tsx
+++ b/apps/website/src/components/landing/LibrariesSection.tsx
@@ -7,7 +7,7 @@ const LIBRARIES = [
{
id: 'angular',
tag: 'Agent',
- pkg: '@cacheplane/angular',
+ pkg: '@cacheplane/langgraph',
color: tokens.colors.accent,
rgb: '0,64,144',
oneLiner: 'Signal-native streaming for LangGraph agents',
diff --git a/apps/website/src/components/landing/TheStack.tsx b/apps/website/src/components/landing/TheStack.tsx
index 38f06ef1c..1d0c2d4c5 100644
--- a/apps/website/src/components/landing/TheStack.tsx
+++ b/apps/website/src/components/landing/TheStack.tsx
@@ -7,7 +7,7 @@ const LIBRARIES = [
{
id: 'angular',
tag: 'Agent',
- pkg: '@cacheplane/angular',
+ pkg: '@cacheplane/langgraph',
color: tokens.colors.accent,
rgb: '0,64,144',
headline: 'The reactive bridge to LangGraph',
diff --git a/apps/website/src/components/landing/angular/AngularCodeShowcase.tsx b/apps/website/src/components/landing/angular/AngularCodeShowcase.tsx
index b1d871c95..ef0a5098a 100644
--- a/apps/website/src/components/landing/angular/AngularCodeShowcase.tsx
+++ b/apps/website/src/components/landing/angular/AngularCodeShowcase.tsx
@@ -1,7 +1,7 @@
import { tokens } from '@cacheplane/design-tokens';
import { HighlightedCode } from '../HighlightedCode';
-const SNIPPET_1 = `import { agent } from '@cacheplane/angular';
+const SNIPPET_1 = `import { agent } from '@cacheplane/langgraph';
const chat = agent({
graphId: 'my-agent',
@@ -13,7 +13,7 @@ chat.messages(); // Signal
chat.isStreaming(); // Signal
chat.interrupt(); // Signal`;
-const SNIPPET_2 = `import { provideAgent } from '@cacheplane/angular';
+const SNIPPET_2 = `import { provideAgent } from '@cacheplane/langgraph';
provideAgent({
graphId: 'my-agent',
diff --git a/apps/website/src/components/landing/angular/AngularComparison.tsx b/apps/website/src/components/landing/angular/AngularComparison.tsx
index 0b8fb7cf5..ccbfb8978 100644
--- a/apps/website/src/components/landing/angular/AngularComparison.tsx
+++ b/apps/website/src/components/landing/angular/AngularComparison.tsx
@@ -42,7 +42,7 @@ export function AngularComparison() {
fontSize: 'clamp(26px,3.5vw,42px)', fontWeight: 800, lineHeight: 1.1,
color: tokens.colors.textPrimary,
}}>
- @langchain/langgraph-sdk vs @cacheplane/angular
+ @langchain/langgraph-sdk vs @cacheplane/langgraph
@@ -62,7 +62,7 @@ export function AngularComparison() {
display: 'grid', gridTemplateColumns: 'minmax(100px, 1fr) minmax(120px, 1fr) minmax(120px, 1fr)',
background: 'rgba(255,255,255,.3)', borderBottom: `1px solid ${tokens.glass.border}`, padding: '14px 24px',
}}>
- {['Capability', '@langchain/langgraph-sdk', '@cacheplane/angular'].map((h, i) => (
+ {['Capability', '@langchain/langgraph-sdk', '@cacheplane/langgraph'].map((h, i) => (
- @cacheplane/angular
+ @cacheplane/langgraph
diff --git a/apps/website/src/components/landing/angular/AngularProblemSolution.tsx b/apps/website/src/components/landing/angular/AngularProblemSolution.tsx
index 5b0038a4a..9618c7346 100644
--- a/apps/website/src/components/landing/angular/AngularProblemSolution.tsx
+++ b/apps/website/src/components/landing/angular/AngularProblemSolution.tsx
@@ -69,7 +69,7 @@ export function AngularProblemSolution() {
fontSize: '0.58rem', fontWeight: 700, textTransform: 'uppercase', letterSpacing: '0.07em',
padding: '2px 9px', borderRadius: 5, color: '#fff', background: '#1a7a40', marginBottom: 16,
}}>
- With @cacheplane/angular
+ With @cacheplane/langgraph
@@ -56,11 +56,12 @@ export class InputComponent {
apiUrl: environment.langGraphApiUrl,
assistantId: environment.streamingAssistantId,
});
+ protected readonly chatAgent = toChatAgent(this.stream);
protected readonly streamStatus = computed(() => this.stream.status());
protected readonly isLoading = computed(() => this.stream.isLoading());
submitMessage(content: string) {
- this.stream.submit([{ role: 'human', content }]);
+ this.chatAgent.submit({ message: content });
}
}
diff --git a/cockpit/chat/interrupts/angular/package.json b/cockpit/chat/interrupts/angular/package.json
index 25c7794b7..760f81248 100644
--- a/cockpit/chat/interrupts/angular/package.json
+++ b/cockpit/chat/interrupts/angular/package.json
@@ -3,7 +3,7 @@
"version": "0.0.1",
"peerDependencies": {
"@cacheplane/chat": "^0.0.1",
- "@cacheplane/angular": "^0.0.1",
+ "@cacheplane/langgraph": "^0.0.1",
"@langchain/langgraph-sdk": "^0.0.36"
},
"license": "PolyForm-Noncommercial-1.0.0",
diff --git a/cockpit/chat/interrupts/angular/src/app/app.config.ts b/cockpit/chat/interrupts/angular/src/app/app.config.ts
index 1e72bb3c9..3771b3b2f 100644
--- a/cockpit/chat/interrupts/angular/src/app/app.config.ts
+++ b/cockpit/chat/interrupts/angular/src/app/app.config.ts
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { environment } from '../environments/environment';
diff --git a/cockpit/chat/interrupts/angular/src/app/interrupts.component.ts b/cockpit/chat/interrupts/angular/src/app/interrupts.component.ts
index 3d1147d8f..78db2db6a 100644
--- a/cockpit/chat/interrupts/angular/src/app/interrupts.component.ts
+++ b/cockpit/chat/interrupts/angular/src/app/interrupts.component.ts
@@ -3,7 +3,7 @@ import { Component, computed } from '@angular/core';
import { JsonPipe } from '@angular/common';
import { ChatComponent, ChatInterruptPanelComponent } from '@cacheplane/chat';
import { ExampleChatLayoutComponent } from '@cacheplane/example-layouts';
-import { agent } from '@cacheplane/angular';
+import { agent, toChatAgent } from '@cacheplane/langgraph';
import { environment } from '../environments/environment';
/**
@@ -18,11 +18,11 @@ import { environment } from '../environments/environment';
imports: [ChatComponent, ChatInterruptPanelComponent, JsonPipe, ExampleChatLayoutComponent],
template: `
-
+
Interrupt Panel
-
+
Stream Status
@@ -37,6 +37,7 @@ export class InterruptsComponent {
apiUrl: environment.langGraphApiUrl,
assistantId: environment.streamingAssistantId,
});
+ protected readonly chatAgent = toChatAgent(this.stream);
protected readonly streamStatus = computed(() => this.stream.status());
}
diff --git a/cockpit/chat/messages/angular/package.json b/cockpit/chat/messages/angular/package.json
index 9f8806131..81435ab49 100644
--- a/cockpit/chat/messages/angular/package.json
+++ b/cockpit/chat/messages/angular/package.json
@@ -3,7 +3,7 @@
"version": "0.0.1",
"peerDependencies": {
"@cacheplane/chat": "^0.0.1",
- "@cacheplane/angular": "^0.0.1",
+ "@cacheplane/langgraph": "^0.0.1",
"@langchain/langgraph-sdk": "^0.0.36"
},
"license": "PolyForm-Noncommercial-1.0.0",
diff --git a/cockpit/chat/messages/angular/src/app/app.config.ts b/cockpit/chat/messages/angular/src/app/app.config.ts
index 1e72bb3c9..3771b3b2f 100644
--- a/cockpit/chat/messages/angular/src/app/app.config.ts
+++ b/cockpit/chat/messages/angular/src/app/app.config.ts
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { environment } from '../environments/environment';
diff --git a/cockpit/chat/messages/angular/src/app/messages.component.ts b/cockpit/chat/messages/angular/src/app/messages.component.ts
index d81f16524..ef8a82904 100644
--- a/cockpit/chat/messages/angular/src/app/messages.component.ts
+++ b/cockpit/chat/messages/angular/src/app/messages.component.ts
@@ -6,7 +6,7 @@ import {
ChatTypingIndicatorComponent,
} from '@cacheplane/chat';
import { ExampleChatLayoutComponent } from '@cacheplane/example-layouts';
-import { agent } from '@cacheplane/angular';
+import { agent, toChatAgent } from '@cacheplane/langgraph';
import { environment } from '../environments/environment';
/**
@@ -27,11 +27,11 @@ import { environment } from '../environments/environment';
Chat Messages Primitives
-
+
-
-
+
+
@@ -51,8 +51,9 @@ export class MessagesComponent {
apiUrl: environment.langGraphApiUrl,
assistantId: environment.streamingAssistantId,
});
+ protected readonly chatAgent = toChatAgent(this.stream);
submitMessage(content: string) {
- this.stream.submit([{ role: 'human', content }]);
+ this.chatAgent.submit({ message: content });
}
}
diff --git a/cockpit/chat/subagents/angular/package.json b/cockpit/chat/subagents/angular/package.json
index cfa0f9356..85b2b7b8e 100644
--- a/cockpit/chat/subagents/angular/package.json
+++ b/cockpit/chat/subagents/angular/package.json
@@ -3,7 +3,7 @@
"version": "0.0.1",
"peerDependencies": {
"@cacheplane/chat": "^0.0.1",
- "@cacheplane/angular": "^0.0.1",
+ "@cacheplane/langgraph": "^0.0.1",
"@langchain/langgraph-sdk": "^0.0.36"
},
"license": "PolyForm-Noncommercial-1.0.0",
diff --git a/cockpit/chat/subagents/angular/src/app/app.config.ts b/cockpit/chat/subagents/angular/src/app/app.config.ts
index 1e72bb3c9..3771b3b2f 100644
--- a/cockpit/chat/subagents/angular/src/app/app.config.ts
+++ b/cockpit/chat/subagents/angular/src/app/app.config.ts
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { environment } from '../environments/environment';
diff --git a/cockpit/chat/subagents/angular/src/app/subagents.component.ts b/cockpit/chat/subagents/angular/src/app/subagents.component.ts
index 36f465368..2eed880bd 100644
--- a/cockpit/chat/subagents/angular/src/app/subagents.component.ts
+++ b/cockpit/chat/subagents/angular/src/app/subagents.component.ts
@@ -6,7 +6,7 @@ import {
ChatSubagentCardComponent,
} from '@cacheplane/chat';
import { ExampleChatLayoutComponent } from '@cacheplane/example-layouts';
-import { agent } from '@cacheplane/angular';
+import { agent, toChatAgent } from '@cacheplane/langgraph';
import { environment } from '../environments/environment';
/**
@@ -20,11 +20,11 @@ import { environment } from '../environments/environment';
imports: [ChatComponent, ChatSubagentsComponent, ChatSubagentCardComponent, ExampleChatLayoutComponent],
template: `
-
+
Active Subagents
-
+
Agent Pipeline
@@ -44,4 +44,5 @@ export class SubagentsComponent {
apiUrl: environment.langGraphApiUrl,
assistantId: environment.streamingAssistantId,
});
+ protected readonly chatAgent = toChatAgent(this.stream);
}
diff --git a/cockpit/chat/theming/angular/package.json b/cockpit/chat/theming/angular/package.json
index 2f025ab9e..29b8d0286 100644
--- a/cockpit/chat/theming/angular/package.json
+++ b/cockpit/chat/theming/angular/package.json
@@ -3,7 +3,7 @@
"version": "0.0.1",
"peerDependencies": {
"@cacheplane/chat": "^0.0.1",
- "@cacheplane/angular": "^0.0.1",
+ "@cacheplane/langgraph": "^0.0.1",
"@langchain/langgraph-sdk": "^0.0.36"
},
"license": "PolyForm-Noncommercial-1.0.0",
diff --git a/cockpit/chat/theming/angular/src/app/app.config.ts b/cockpit/chat/theming/angular/src/app/app.config.ts
index 1e72bb3c9..3771b3b2f 100644
--- a/cockpit/chat/theming/angular/src/app/app.config.ts
+++ b/cockpit/chat/theming/angular/src/app/app.config.ts
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { environment } from '../environments/environment';
diff --git a/cockpit/chat/theming/angular/src/app/theming.component.ts b/cockpit/chat/theming/angular/src/app/theming.component.ts
index 571734262..64f21d35d 100644
--- a/cockpit/chat/theming/angular/src/app/theming.component.ts
+++ b/cockpit/chat/theming/angular/src/app/theming.component.ts
@@ -3,7 +3,7 @@ import { Component, signal } from '@angular/core';
import { TitleCasePipe } from '@angular/common';
import { ChatComponent } from '@cacheplane/chat';
import { ExampleChatLayoutComponent } from '@cacheplane/example-layouts';
-import { agent } from '@cacheplane/angular';
+import { agent, toChatAgent } from '@cacheplane/langgraph';
import { environment } from '../environments/environment';
const THEMES: Record
> = {
@@ -52,7 +52,7 @@ const THEMES: Record> = {
imports: [ChatComponent, ExampleChatLayoutComponent, TitleCasePipe],
template: `
-
+
Theme Picker
@@ -88,6 +88,7 @@ export class ThemingComponent {
apiUrl: environment.langGraphApiUrl,
assistantId: environment.streamingAssistantId,
});
+ protected readonly chatAgent = toChatAgent(this.stream);
protected readonly themeNames = Object.keys(THEMES);
protected readonly activeTheme = signal('dark');
diff --git a/cockpit/chat/threads/angular/package.json b/cockpit/chat/threads/angular/package.json
index 655507028..2c6126be5 100644
--- a/cockpit/chat/threads/angular/package.json
+++ b/cockpit/chat/threads/angular/package.json
@@ -3,7 +3,7 @@
"version": "0.0.1",
"peerDependencies": {
"@cacheplane/chat": "^0.0.1",
- "@cacheplane/angular": "^0.0.1",
+ "@cacheplane/langgraph": "^0.0.1",
"@langchain/langgraph-sdk": "^0.0.36"
},
"license": "PolyForm-Noncommercial-1.0.0",
diff --git a/cockpit/chat/threads/angular/src/app/app.config.ts b/cockpit/chat/threads/angular/src/app/app.config.ts
index 1e72bb3c9..3771b3b2f 100644
--- a/cockpit/chat/threads/angular/src/app/app.config.ts
+++ b/cockpit/chat/threads/angular/src/app/app.config.ts
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { environment } from '../environments/environment';
diff --git a/cockpit/chat/threads/angular/src/app/threads.component.ts b/cockpit/chat/threads/angular/src/app/threads.component.ts
index cb9ff0f34..e338ab3d7 100644
--- a/cockpit/chat/threads/angular/src/app/threads.component.ts
+++ b/cockpit/chat/threads/angular/src/app/threads.component.ts
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { Component, signal } from '@angular/core';
import { ChatComponent, ChatThreadListComponent, type Thread } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
+import { agent, toChatAgent } from '@cacheplane/langgraph';
import { ExampleChatLayoutComponent } from '@cacheplane/example-layouts';
import { environment } from '../environments/environment';
@@ -15,7 +15,7 @@ import { environment } from '../environments/environment';
imports: [ChatComponent, ChatThreadListComponent, ExampleChatLayoutComponent],
template: `
-
+
([
{ id: 'thread-1', title: 'First Conversation' },
diff --git a/cockpit/chat/timeline/angular/package.json b/cockpit/chat/timeline/angular/package.json
index e3ee64af2..6bf6cb0a0 100644
--- a/cockpit/chat/timeline/angular/package.json
+++ b/cockpit/chat/timeline/angular/package.json
@@ -3,7 +3,7 @@
"version": "0.0.1",
"peerDependencies": {
"@cacheplane/chat": "^0.0.1",
- "@cacheplane/angular": "^0.0.1",
+ "@cacheplane/langgraph": "^0.0.1",
"@langchain/langgraph-sdk": "^0.0.36"
},
"license": "PolyForm-Noncommercial-1.0.0",
diff --git a/cockpit/chat/timeline/angular/src/app/app.config.ts b/cockpit/chat/timeline/angular/src/app/app.config.ts
index 1e72bb3c9..3771b3b2f 100644
--- a/cockpit/chat/timeline/angular/src/app/app.config.ts
+++ b/cockpit/chat/timeline/angular/src/app/app.config.ts
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { environment } from '../environments/environment';
diff --git a/cockpit/chat/timeline/angular/src/app/timeline.component.ts b/cockpit/chat/timeline/angular/src/app/timeline.component.ts
index ba6bb4adf..d9e39f3fa 100644
--- a/cockpit/chat/timeline/angular/src/app/timeline.component.ts
+++ b/cockpit/chat/timeline/angular/src/app/timeline.component.ts
@@ -1,8 +1,8 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { Component } from '@angular/core';
-import { ChatComponent, ChatTimelineSliderComponent } from '@cacheplane/chat';
+import { ChatComponent } from '@cacheplane/chat';
import { ExampleChatLayoutComponent } from '@cacheplane/example-layouts';
-import { agent } from '@cacheplane/angular';
+import { agent, toChatAgent, ChatTimelineSliderComponent } from '@cacheplane/langgraph';
import { environment } from '../environments/environment';
/**
@@ -16,7 +16,7 @@ import { environment } from '../environments/environment';
imports: [ChatComponent, ChatTimelineSliderComponent, ExampleChatLayoutComponent],
template: `
-
+
Timeline
@@ -38,4 +38,5 @@ export class TimelineComponent {
apiUrl: environment.langGraphApiUrl,
assistantId: environment.streamingAssistantId,
});
+ protected readonly chatAgent = toChatAgent(this.stream);
}
diff --git a/cockpit/chat/tool-calls/angular/package.json b/cockpit/chat/tool-calls/angular/package.json
index fcc75b15c..77f0c5a40 100644
--- a/cockpit/chat/tool-calls/angular/package.json
+++ b/cockpit/chat/tool-calls/angular/package.json
@@ -3,7 +3,7 @@
"version": "0.0.1",
"peerDependencies": {
"@cacheplane/chat": "^0.0.1",
- "@cacheplane/angular": "^0.0.1",
+ "@cacheplane/langgraph": "^0.0.1",
"@langchain/langgraph-sdk": "^0.0.36"
},
"license": "PolyForm-Noncommercial-1.0.0",
diff --git a/cockpit/chat/tool-calls/angular/src/app/app.config.ts b/cockpit/chat/tool-calls/angular/src/app/app.config.ts
index 1e72bb3c9..3771b3b2f 100644
--- a/cockpit/chat/tool-calls/angular/src/app/app.config.ts
+++ b/cockpit/chat/tool-calls/angular/src/app/app.config.ts
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { environment } from '../environments/environment';
diff --git a/cockpit/chat/tool-calls/angular/src/app/tool-calls.component.ts b/cockpit/chat/tool-calls/angular/src/app/tool-calls.component.ts
index 84530c5bb..be429ee0e 100644
--- a/cockpit/chat/tool-calls/angular/src/app/tool-calls.component.ts
+++ b/cockpit/chat/tool-calls/angular/src/app/tool-calls.component.ts
@@ -6,7 +6,7 @@ import {
ChatToolCallCardComponent,
} from '@cacheplane/chat';
import { ExampleChatLayoutComponent } from '@cacheplane/example-layouts';
-import { agent } from '@cacheplane/angular';
+import { agent, toChatAgent } from '@cacheplane/langgraph';
import { environment } from '../environments/environment';
/**
@@ -19,11 +19,11 @@ import { environment } from '../environments/environment';
imports: [ChatComponent, ChatToolCallsComponent, ChatToolCallCardComponent, ExampleChatLayoutComponent],
template: `
-
+
Tool Calls
-
+
Available Tools
@@ -42,4 +42,5 @@ export class ToolCallsComponent {
apiUrl: environment.langGraphApiUrl,
assistantId: environment.streamingAssistantId,
});
+ protected readonly chatAgent = toChatAgent(this.stream);
}
diff --git a/cockpit/deep-agents/filesystem/angular/package.json b/cockpit/deep-agents/filesystem/angular/package.json
index ed1cc73de..09bc8f500 100644
--- a/cockpit/deep-agents/filesystem/angular/package.json
+++ b/cockpit/deep-agents/filesystem/angular/package.json
@@ -3,7 +3,7 @@
"version": "0.0.1",
"peerDependencies": {
"@cacheplane/chat": "^0.0.1",
- "@cacheplane/angular": "^0.0.1",
+ "@cacheplane/langgraph": "^0.0.1",
"@langchain/langgraph-sdk": "^0.0.36"
},
"license": "PolyForm-Noncommercial-1.0.0",
diff --git a/cockpit/deep-agents/filesystem/angular/src/app/app.config.ts b/cockpit/deep-agents/filesystem/angular/src/app/app.config.ts
index bbe3e5e49..613fbaf16 100644
--- a/cockpit/deep-agents/filesystem/angular/src/app/app.config.ts
+++ b/cockpit/deep-agents/filesystem/angular/src/app/app.config.ts
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { provideRender } from '@cacheplane/render';
import { environment } from '../environments/environment';
diff --git a/cockpit/deep-agents/filesystem/angular/src/app/filesystem.component.ts b/cockpit/deep-agents/filesystem/angular/src/app/filesystem.component.ts
index c997cc1a2..aef80a94f 100644
--- a/cockpit/deep-agents/filesystem/angular/src/app/filesystem.component.ts
+++ b/cockpit/deep-agents/filesystem/angular/src/app/filesystem.component.ts
@@ -1,7 +1,7 @@
import { Component, computed } from '@angular/core';
import { ChatComponent, views } from '@cacheplane/chat';
import { ExampleChatLayoutComponent } from '@cacheplane/example-layouts';
-import { agent } from '@cacheplane/angular';
+import { agent, toChatAgent } from '@cacheplane/langgraph';
import { signalStateStore } from '@cacheplane/render';
import { environment } from '../environments/environment';
import { FilePreviewComponent } from './views/file-preview.component';
@@ -33,7 +33,7 @@ interface FileOperation {
imports: [ChatComponent, ExampleChatLayoutComponent],
template: `
-
+
File Operations
@@ -74,6 +74,7 @@ export class FilesystemComponent {
apiUrl: environment.langGraphApiUrl,
assistantId: environment.streamingAssistantId,
});
+ protected readonly chatAgent = toChatAgent(this.stream);
/**
* Reactive list of file operations derived from the message history.
diff --git a/cockpit/deep-agents/filesystem/python/docs/guide.md b/cockpit/deep-agents/filesystem/python/docs/guide.md
index 08f857422..cbe5690c8 100644
--- a/cockpit/deep-agents/filesystem/python/docs/guide.md
+++ b/cockpit/deep-agents/filesystem/python/docs/guide.md
@@ -2,12 +2,12 @@
Build a chat interface that shows real-time file operation logs using `agent()` from
-`@cacheplane/angular`. The agent reads and writes files using tool calls, and the
+`@cacheplane/langgraph`. The agent reads and writes files using tool calls, and the
sidebar displays each operation as it happens.
-Add a file operations sidebar to this Angular component using `agent()` from `@cacheplane/angular`. Use `stream.messages()` to access tool call data, derive `toolCallEntries` with `computed()`, and bind them to the sidebar via the `` component from `@cacheplane/chat`.
+Add a file operations sidebar to this Angular component using `agent()` from `@cacheplane/langgraph`. Use `stream.messages()` to access tool call data, derive `toolCallEntries` with `computed()`, and bind them to the sidebar via the `` component from `@cacheplane/chat`.
@@ -18,7 +18,7 @@ Set up `provideAgent()` in your app config with the LangGraph API URL:
```typescript
// app.config.ts
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
export const appConfig: ApplicationConfig = {
providers: [
@@ -38,7 +38,7 @@ In your component, call `agent()` with the `assistantId` pointing to your filesy
```typescript
// filesystem.component.ts
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
export class FilesystemComponent {
protected readonly stream = agent({
diff --git a/cockpit/deep-agents/memory/angular/package.json b/cockpit/deep-agents/memory/angular/package.json
index 576506d26..ba720f7c6 100644
--- a/cockpit/deep-agents/memory/angular/package.json
+++ b/cockpit/deep-agents/memory/angular/package.json
@@ -3,7 +3,7 @@
"version": "0.0.1",
"peerDependencies": {
"@cacheplane/chat": "^0.0.1",
- "@cacheplane/angular": "^0.0.1",
+ "@cacheplane/langgraph": "^0.0.1",
"@langchain/langgraph-sdk": "^0.0.36"
},
"license": "PolyForm-Noncommercial-1.0.0",
diff --git a/cockpit/deep-agents/memory/angular/src/app/app.config.ts b/cockpit/deep-agents/memory/angular/src/app/app.config.ts
index bbe3e5e49..613fbaf16 100644
--- a/cockpit/deep-agents/memory/angular/src/app/app.config.ts
+++ b/cockpit/deep-agents/memory/angular/src/app/app.config.ts
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { provideRender } from '@cacheplane/render';
import { environment } from '../environments/environment';
diff --git a/cockpit/deep-agents/memory/angular/src/app/memory.component.ts b/cockpit/deep-agents/memory/angular/src/app/memory.component.ts
index 08699463a..6d0046930 100644
--- a/cockpit/deep-agents/memory/angular/src/app/memory.component.ts
+++ b/cockpit/deep-agents/memory/angular/src/app/memory.component.ts
@@ -1,7 +1,7 @@
import { Component, computed } from '@angular/core';
import { ChatComponent } from '@cacheplane/chat';
import { ExampleChatLayoutComponent } from '@cacheplane/example-layouts';
-import { agent } from '@cacheplane/angular';
+import { agent, toChatAgent } from '@cacheplane/langgraph';
import { environment } from '../environments/environment';
/**
@@ -22,7 +22,7 @@ import { environment } from '../environments/environment';
imports: [ChatComponent, ExampleChatLayoutComponent],
template: `
-
+
@@ -55,6 +55,7 @@ export class MemoryComponent {
apiUrl: environment.langGraphApiUrl,
assistantId: environment.streamingAssistantId,
});
+ protected readonly chatAgent = toChatAgent(this.stream);
/**
* Reactive list of [key, value] memory entries derived from the graph state.
diff --git a/cockpit/deep-agents/memory/python/docs/guide.md b/cockpit/deep-agents/memory/python/docs/guide.md
index 113713336..9dc1fffb9 100644
--- a/cockpit/deep-agents/memory/python/docs/guide.md
+++ b/cockpit/deep-agents/memory/python/docs/guide.md
@@ -1,11 +1,11 @@
# Persistent Agent Memory with angular
-Build a chat interface where the agent remembers facts about the user across turns using `agent()` from `@cacheplane/angular`. The agent stores learned facts in `agent_memory` state, and the sidebar displays them in real time.
+Build a chat interface where the agent remembers facts about the user across turns using `agent()` from `@cacheplane/langgraph`. The agent stores learned facts in `agent_memory` state, and the sidebar displays them in real time.
-Add a memory sidebar to this Angular component using `agent()` from `@cacheplane/angular`. Use `stream.value()` to access the agent's `agent_memory` state, derive `memoryEntries` with `computed()`, and bind them to the sidebar via the `` component from `@cacheplane/chat`.
+Add a memory sidebar to this Angular component using `agent()` from `@cacheplane/langgraph`. Use `stream.value()` to access the agent's `agent_memory` state, derive `memoryEntries` with `computed()`, and bind them to the sidebar via the `` component from `@cacheplane/chat`.
@@ -16,7 +16,7 @@ Set up `provideAgent()` in your app config with the LangGraph API URL:
```typescript
// app.config.ts
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
export const appConfig: ApplicationConfig = {
providers: [
@@ -36,7 +36,7 @@ In your component, call `agent()` with the `assistantId` pointing to your memory
```typescript
// memory.component.ts
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
export class MemoryComponent {
protected readonly stream = agent({
diff --git a/cockpit/deep-agents/planning/angular/package.json b/cockpit/deep-agents/planning/angular/package.json
index d998930b4..b314aa482 100644
--- a/cockpit/deep-agents/planning/angular/package.json
+++ b/cockpit/deep-agents/planning/angular/package.json
@@ -3,7 +3,7 @@
"version": "0.0.1",
"peerDependencies": {
"@cacheplane/chat": "^0.0.1",
- "@cacheplane/angular": "^0.0.1",
+ "@cacheplane/langgraph": "^0.0.1",
"@langchain/langgraph-sdk": "^0.0.36"
},
"license": "PolyForm-Noncommercial-1.0.0",
diff --git a/cockpit/deep-agents/planning/angular/src/app/app.config.ts b/cockpit/deep-agents/planning/angular/src/app/app.config.ts
index bbe3e5e49..613fbaf16 100644
--- a/cockpit/deep-agents/planning/angular/src/app/app.config.ts
+++ b/cockpit/deep-agents/planning/angular/src/app/app.config.ts
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { provideRender } from '@cacheplane/render';
import { environment } from '../environments/environment';
diff --git a/cockpit/deep-agents/planning/angular/src/app/planning.component.ts b/cockpit/deep-agents/planning/angular/src/app/planning.component.ts
index 4004098c7..fa682195e 100644
--- a/cockpit/deep-agents/planning/angular/src/app/planning.component.ts
+++ b/cockpit/deep-agents/planning/angular/src/app/planning.component.ts
@@ -1,7 +1,7 @@
import { Component, computed } from '@angular/core';
import { ChatComponent, views } from '@cacheplane/chat';
import { ExampleChatLayoutComponent } from '@cacheplane/example-layouts';
-import { agent } from '@cacheplane/angular';
+import { agent, toChatAgent } from '@cacheplane/langgraph';
import { signalStateStore } from '@cacheplane/render';
import { environment } from '../environments/environment';
import { PlanChecklistComponent } from './views/plan-checklist.component';
@@ -34,7 +34,7 @@ interface PlanStep {
imports: [ChatComponent, ExampleChatLayoutComponent],
template: `
-
+
Plan
@@ -74,6 +74,7 @@ export class PlanningComponent {
apiUrl: environment.langGraphApiUrl,
assistantId: environment.streamingAssistantId,
});
+ protected readonly chatAgent = toChatAgent(this.stream);
/**
* Reactive list of plan steps derived from the graph state.
diff --git a/cockpit/deep-agents/planning/python/docs/guide.md b/cockpit/deep-agents/planning/python/docs/guide.md
index 1833de5bf..7e30183a1 100644
--- a/cockpit/deep-agents/planning/python/docs/guide.md
+++ b/cockpit/deep-agents/planning/python/docs/guide.md
@@ -2,12 +2,12 @@
Build a chat interface that shows real-time task decomposition using `agent()` from
-`@cacheplane/angular`. The agent breaks complex requests into ordered steps, and the
+`@cacheplane/langgraph`. The agent breaks complex requests into ordered steps, and the
sidebar displays each step's status as the agent works through them.
-Add a task planning sidebar to this Angular component using `agent()` from `@cacheplane/angular`. Use `stream.value()` to access the agent's plan state, derive `planSteps` with `computed()`, and bind them to the sidebar via the `` component from `@cacheplane/chat`.
+Add a task planning sidebar to this Angular component using `agent()` from `@cacheplane/langgraph`. Use `stream.value()` to access the agent's plan state, derive `planSteps` with `computed()`, and bind them to the sidebar via the `` component from `@cacheplane/chat`.
@@ -18,7 +18,7 @@ Set up `provideAgent()` in your app config with the LangGraph API URL:
```typescript
// app.config.ts
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
export const appConfig: ApplicationConfig = {
providers: [
@@ -38,7 +38,7 @@ In your component, call `agent()` with the `assistantId` pointing to your planni
```typescript
// planning.component.ts
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
export class PlanningComponent {
protected readonly stream = agent({
diff --git a/cockpit/deep-agents/sandboxes/angular/package.json b/cockpit/deep-agents/sandboxes/angular/package.json
index 22a0dac66..353cc1e99 100644
--- a/cockpit/deep-agents/sandboxes/angular/package.json
+++ b/cockpit/deep-agents/sandboxes/angular/package.json
@@ -3,7 +3,7 @@
"version": "0.0.1",
"peerDependencies": {
"@cacheplane/chat": "^0.0.1",
- "@cacheplane/angular": "^0.0.1",
+ "@cacheplane/langgraph": "^0.0.1",
"@langchain/langgraph-sdk": "^0.0.36"
},
"license": "PolyForm-Noncommercial-1.0.0",
diff --git a/cockpit/deep-agents/sandboxes/angular/src/app/app.config.ts b/cockpit/deep-agents/sandboxes/angular/src/app/app.config.ts
index bbe3e5e49..613fbaf16 100644
--- a/cockpit/deep-agents/sandboxes/angular/src/app/app.config.ts
+++ b/cockpit/deep-agents/sandboxes/angular/src/app/app.config.ts
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { provideRender } from '@cacheplane/render';
import { environment } from '../environments/environment';
diff --git a/cockpit/deep-agents/sandboxes/angular/src/app/sandboxes.component.ts b/cockpit/deep-agents/sandboxes/angular/src/app/sandboxes.component.ts
index 0d81d87ff..7a88b9ab5 100644
--- a/cockpit/deep-agents/sandboxes/angular/src/app/sandboxes.component.ts
+++ b/cockpit/deep-agents/sandboxes/angular/src/app/sandboxes.component.ts
@@ -1,7 +1,7 @@
import { Component, computed } from '@angular/core';
import { ChatComponent, views } from '@cacheplane/chat';
import { ExampleChatLayoutComponent } from '@cacheplane/example-layouts';
-import { agent } from '@cacheplane/angular';
+import { agent, toChatAgent } from '@cacheplane/langgraph';
import { signalStateStore } from '@cacheplane/render';
import { environment } from '../environments/environment';
import { CodeExecutionComponent } from './views/code-execution.component';
@@ -31,7 +31,7 @@ interface CodeExecution {
imports: [ChatComponent, ExampleChatLayoutComponent],
template: `
-
+
Execution Output
@@ -68,6 +68,7 @@ export class SandboxesComponent {
apiUrl: environment.langGraphApiUrl,
assistantId: environment.streamingAssistantId,
});
+ protected readonly chatAgent = toChatAgent(this.stream);
/**
* Derived signal: extracts code executions from the message stream.
diff --git a/cockpit/deep-agents/sandboxes/python/docs/guide.md b/cockpit/deep-agents/sandboxes/python/docs/guide.md
index 762f09de9..3aaa31ad0 100644
--- a/cockpit/deep-agents/sandboxes/python/docs/guide.md
+++ b/cockpit/deep-agents/sandboxes/python/docs/guide.md
@@ -2,12 +2,12 @@
Build a chat interface that shows real-time code execution logs using `agent()` from
-`@cacheplane/angular`. The agent writes Python code and runs it in a sandbox, and the
+`@cacheplane/langgraph`. The agent writes Python code and runs it in a sandbox, and the
sidebar displays each execution as a log entry with code input, stdout output, and exit status.
-Add a code execution log sidebar to this Angular component using `agent()` from `@cacheplane/angular`. Use `stream.messages()` to access tool call data from the `run_code` tool, derive `executionLogs` with `computed()`, and bind them to the sidebar via the `` component from `@cacheplane/chat`.
+Add a code execution log sidebar to this Angular component using `agent()` from `@cacheplane/langgraph`. Use `stream.messages()` to access tool call data from the `run_code` tool, derive `executionLogs` with `computed()`, and bind them to the sidebar via the `` component from `@cacheplane/chat`.
@@ -18,7 +18,7 @@ Set up `provideAgent()` in your app config with the LangGraph API URL:
```typescript
// app.config.ts
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
export const appConfig: ApplicationConfig = {
providers: [
@@ -38,7 +38,7 @@ In your component, call `agent()` with the `assistantId` pointing to your sandbo
```typescript
// sandboxes.component.ts
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
export class SandboxesComponent {
protected readonly stream = agent({
diff --git a/cockpit/deep-agents/skills/angular/package.json b/cockpit/deep-agents/skills/angular/package.json
index 5c1b5ac9d..029394488 100644
--- a/cockpit/deep-agents/skills/angular/package.json
+++ b/cockpit/deep-agents/skills/angular/package.json
@@ -3,7 +3,7 @@
"version": "0.0.1",
"peerDependencies": {
"@cacheplane/chat": "^0.0.1",
- "@cacheplane/angular": "^0.0.1",
+ "@cacheplane/langgraph": "^0.0.1",
"@langchain/langgraph-sdk": "^0.0.36"
},
"license": "PolyForm-Noncommercial-1.0.0",
diff --git a/cockpit/deep-agents/skills/angular/src/app/app.config.ts b/cockpit/deep-agents/skills/angular/src/app/app.config.ts
index bbe3e5e49..613fbaf16 100644
--- a/cockpit/deep-agents/skills/angular/src/app/app.config.ts
+++ b/cockpit/deep-agents/skills/angular/src/app/app.config.ts
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { provideRender } from '@cacheplane/render';
import { environment } from '../environments/environment';
diff --git a/cockpit/deep-agents/skills/angular/src/app/skills.component.ts b/cockpit/deep-agents/skills/angular/src/app/skills.component.ts
index 089035cc8..876e0b8a9 100644
--- a/cockpit/deep-agents/skills/angular/src/app/skills.component.ts
+++ b/cockpit/deep-agents/skills/angular/src/app/skills.component.ts
@@ -1,7 +1,7 @@
import { Component, computed } from '@angular/core';
import { ChatComponent, views } from '@cacheplane/chat';
import { ExampleChatLayoutComponent } from '@cacheplane/example-layouts';
-import { agent } from '@cacheplane/angular';
+import { agent, toChatAgent } from '@cacheplane/langgraph';
import { signalStateStore } from '@cacheplane/render';
import { environment } from '../environments/environment';
import { CalculatorResultComponent } from './views/calculator-result.component';
@@ -33,7 +33,7 @@ interface SkillInvocation {
imports: [ChatComponent, ExampleChatLayoutComponent],
template: `
-
+
Skill Invocations
@@ -75,6 +75,7 @@ export class SkillsComponent {
apiUrl: environment.langGraphApiUrl,
assistantId: environment.streamingAssistantId,
});
+ protected readonly chatAgent = toChatAgent(this.stream);
private readonly SKILL_NAMES = new Set(['calculator', 'word_count', 'summarize']);
diff --git a/cockpit/deep-agents/skills/python/docs/guide.md b/cockpit/deep-agents/skills/python/docs/guide.md
index 9fbbaf032..f677098c1 100644
--- a/cockpit/deep-agents/skills/python/docs/guide.md
+++ b/cockpit/deep-agents/skills/python/docs/guide.md
@@ -2,12 +2,12 @@
Build a chat interface that shows real-time skill invocations using `agent()` from
-`@cacheplane/angular`. The agent selects from specialized tools (calculator, word counter,
+`@cacheplane/langgraph`. The agent selects from specialized tools (calculator, word counter,
summarizer) based on the user's request, and the sidebar displays each skill invocation as a card.
-Add a skill invocation sidebar to this Angular component using `agent()` from `@cacheplane/angular`. Use `stream.messages()` to access tool call data, derive `skillInvocations` with `computed()`, and bind them to the sidebar via the `` component from `@cacheplane/chat`.
+Add a skill invocation sidebar to this Angular component using `agent()` from `@cacheplane/langgraph`. Use `stream.messages()` to access tool call data, derive `skillInvocations` with `computed()`, and bind them to the sidebar via the `` component from `@cacheplane/chat`.
@@ -18,7 +18,7 @@ Set up `provideAgent()` in your app config with the LangGraph API URL:
```typescript
// app.config.ts
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
export const appConfig: ApplicationConfig = {
providers: [
@@ -38,7 +38,7 @@ In your component, call `agent()` with the `assistantId` pointing to your skills
```typescript
// skills.component.ts
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
export class SkillsComponent {
protected readonly stream = agent({
diff --git a/cockpit/deep-agents/subagents/angular/package.json b/cockpit/deep-agents/subagents/angular/package.json
index 7008680f2..dc9760b37 100644
--- a/cockpit/deep-agents/subagents/angular/package.json
+++ b/cockpit/deep-agents/subagents/angular/package.json
@@ -3,7 +3,7 @@
"version": "0.0.1",
"peerDependencies": {
"@cacheplane/chat": "^0.0.1",
- "@cacheplane/angular": "^0.0.1",
+ "@cacheplane/langgraph": "^0.0.1",
"@langchain/langgraph-sdk": "^0.0.36"
},
"license": "PolyForm-Noncommercial-1.0.0",
diff --git a/cockpit/deep-agents/subagents/angular/src/app/app.config.ts b/cockpit/deep-agents/subagents/angular/src/app/app.config.ts
index bbe3e5e49..613fbaf16 100644
--- a/cockpit/deep-agents/subagents/angular/src/app/app.config.ts
+++ b/cockpit/deep-agents/subagents/angular/src/app/app.config.ts
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { provideRender } from '@cacheplane/render';
import { environment } from '../environments/environment';
diff --git a/cockpit/deep-agents/subagents/angular/src/app/subagents.component.ts b/cockpit/deep-agents/subagents/angular/src/app/subagents.component.ts
index f2fd7c23a..4e2e34660 100644
--- a/cockpit/deep-agents/subagents/angular/src/app/subagents.component.ts
+++ b/cockpit/deep-agents/subagents/angular/src/app/subagents.component.ts
@@ -1,7 +1,7 @@
import { Component, computed } from '@angular/core';
import { ChatComponent } from '@cacheplane/chat';
import { ExampleChatLayoutComponent } from '@cacheplane/example-layouts';
-import { agent } from '@cacheplane/angular';
+import { agent, toChatAgent } from '@cacheplane/langgraph';
import { environment } from '../environments/environment';
/**
@@ -31,7 +31,7 @@ interface Delegation {
imports: [ChatComponent, ExampleChatLayoutComponent],
template: `
-
+
Delegations
@@ -59,6 +59,7 @@ export class SubagentsComponent {
apiUrl: environment.langGraphApiUrl,
assistantId: environment.streamingAssistantId,
});
+ protected readonly chatAgent = toChatAgent(this.stream);
/**
* Reactive delegation list derived from messages.
diff --git a/cockpit/deep-agents/subagents/python/docs/guide.md b/cockpit/deep-agents/subagents/python/docs/guide.md
index 8824a1bff..8a785109c 100644
--- a/cockpit/deep-agents/subagents/python/docs/guide.md
+++ b/cockpit/deep-agents/subagents/python/docs/guide.md
@@ -2,12 +2,12 @@
Build a chat interface that shows real-time subagent activity using `agent()` from
-`@cacheplane/angular`. An orchestrator agent delegates subtasks to specialist child
+`@cacheplane/langgraph`. An orchestrator agent delegates subtasks to specialist child
agents, and the sidebar displays each subagent's status and message count as they stream.
-Add a subagent activity sidebar to this Angular component using `agent()` from `@cacheplane/angular`. Use `stream.subagents()` to access the live Map of child agent streams, derive `subagentEntries` with `computed()`, and render them in the `` sidebar.
+Add a subagent activity sidebar to this Angular component using `agent()` from `@cacheplane/langgraph`. Use `stream.subagents()` to access the live Map of child agent streams, derive `subagentEntries` with `computed()`, and render them in the `` sidebar.
@@ -18,7 +18,7 @@ Set up `provideAgent()` in your app config with the LangGraph API URL:
```typescript
// app.config.ts
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
export const appConfig: ApplicationConfig = {
providers: [
@@ -38,7 +38,7 @@ In your component, call `agent()` with the `assistantId` pointing to your subage
```typescript
// subagents.component.ts
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
export class SubagentsComponent {
protected readonly stream = agent({
diff --git a/cockpit/langgraph/deployment-runtime/angular/package.json b/cockpit/langgraph/deployment-runtime/angular/package.json
index b8c480640..f420ce687 100644
--- a/cockpit/langgraph/deployment-runtime/angular/package.json
+++ b/cockpit/langgraph/deployment-runtime/angular/package.json
@@ -3,7 +3,7 @@
"version": "0.0.1",
"peerDependencies": {
"@cacheplane/chat": "^0.0.1",
- "@cacheplane/angular": "^0.0.1",
+ "@cacheplane/langgraph": "^0.0.1",
"@langchain/langgraph-sdk": "^0.0.36"
},
"license": "PolyForm-Noncommercial-1.0.0",
diff --git a/cockpit/langgraph/deployment-runtime/angular/src/app/app.config.ts b/cockpit/langgraph/deployment-runtime/angular/src/app/app.config.ts
index 1e72bb3c9..3771b3b2f 100644
--- a/cockpit/langgraph/deployment-runtime/angular/src/app/app.config.ts
+++ b/cockpit/langgraph/deployment-runtime/angular/src/app/app.config.ts
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { environment } from '../environments/environment';
diff --git a/cockpit/langgraph/deployment-runtime/angular/src/app/deployment-runtime.component.ts b/cockpit/langgraph/deployment-runtime/angular/src/app/deployment-runtime.component.ts
index 8035f1d97..1f5f0e260 100644
--- a/cockpit/langgraph/deployment-runtime/angular/src/app/deployment-runtime.component.ts
+++ b/cockpit/langgraph/deployment-runtime/angular/src/app/deployment-runtime.component.ts
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { Component } from '@angular/core';
import { ChatComponent } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
+import { agent, toChatAgent } from '@cacheplane/langgraph';
import { ExampleChatLayoutComponent } from '@cacheplane/example-layouts';
import { environment } from '../environments/environment';
@@ -17,7 +17,7 @@ import { environment } from '../environments/environment';
imports: [ChatComponent, ExampleChatLayoutComponent],
template: `
-
+
`,
})
@@ -26,4 +26,5 @@ export class DeploymentRuntimeComponent {
apiUrl: environment.langGraphApiUrl,
assistantId: environment.deploymentRuntimeAssistantId,
});
+ protected readonly chatAgent = toChatAgent(this.stream);
}
diff --git a/cockpit/langgraph/deployment-runtime/python/docs/guide.md b/cockpit/langgraph/deployment-runtime/python/docs/guide.md
index 3b53082cf..536e17a05 100644
--- a/cockpit/langgraph/deployment-runtime/python/docs/guide.md
+++ b/cockpit/langgraph/deployment-runtime/python/docs/guide.md
@@ -2,13 +2,13 @@
Deploy a LangGraph graph to LangGraph Cloud and connect an Angular app using
-`agent()` from `@cacheplane/angular`. This tutorial covers
+`agent()` from `@cacheplane/langgraph`. This tutorial covers
`langgraph deploy`, environment configuration, Vercel hosting for Angular, and
CI automation.
-Build a production-ready Angular chat app that connects to a LangGraph Cloud deployment using `agent()` from `@cacheplane/angular`. Configure the `apiUrl` to point to your deployed LangGraph Cloud endpoint and set `assistantId` to match the graph name in `langgraph.json`. Display the deployment status via `stream.status()` and show the thread ID from the `onThreadId` callback.
+Build a production-ready Angular chat app that connects to a LangGraph Cloud deployment using `agent()` from `@cacheplane/langgraph`. Configure the `apiUrl` to point to your deployed LangGraph Cloud endpoint and set `assistantId` to match the graph name in `langgraph.json`. Display the deployment status via `stream.status()` and show the thread ID from the `onThreadId` callback.
@@ -76,7 +76,7 @@ In your component, pass the deployment URL and assistant ID to `agent()`:
```typescript
// deployment-runtime.component.ts
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
import { environment } from '../environments/environment';
export class DeploymentRuntimeComponent {
diff --git a/cockpit/langgraph/durable-execution/angular/package.json b/cockpit/langgraph/durable-execution/angular/package.json
index 302f2bb3e..795b7097c 100644
--- a/cockpit/langgraph/durable-execution/angular/package.json
+++ b/cockpit/langgraph/durable-execution/angular/package.json
@@ -3,7 +3,7 @@
"version": "0.0.1",
"peerDependencies": {
"@cacheplane/chat": "^0.0.1",
- "@cacheplane/angular": "^0.0.1",
+ "@cacheplane/langgraph": "^0.0.1",
"@langchain/langgraph-sdk": "^0.0.36"
},
"license": "PolyForm-Noncommercial-1.0.0",
diff --git a/cockpit/langgraph/durable-execution/angular/src/app/app.config.ts b/cockpit/langgraph/durable-execution/angular/src/app/app.config.ts
index 1e72bb3c9..3771b3b2f 100644
--- a/cockpit/langgraph/durable-execution/angular/src/app/app.config.ts
+++ b/cockpit/langgraph/durable-execution/angular/src/app/app.config.ts
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { environment } from '../environments/environment';
diff --git a/cockpit/langgraph/durable-execution/angular/src/app/durable-execution.component.ts b/cockpit/langgraph/durable-execution/angular/src/app/durable-execution.component.ts
index f29351bfc..39a323909 100644
--- a/cockpit/langgraph/durable-execution/angular/src/app/durable-execution.component.ts
+++ b/cockpit/langgraph/durable-execution/angular/src/app/durable-execution.component.ts
@@ -1,6 +1,6 @@
import { Component, computed } from '@angular/core';
import { ChatComponent, views } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
+import { agent, toChatAgent } from '@cacheplane/langgraph';
import { signalStateStore } from '@cacheplane/render';
import { ExampleChatLayoutComponent } from '@cacheplane/example-layouts';
import { environment } from '../environments/environment';
@@ -40,7 +40,7 @@ const STEP_LABELS: Record = {
imports: [ChatComponent, ExampleChatLayoutComponent],
template: `
-
+
Build a fault-tolerant chat interface using `agent()` from
-`@cacheplane/angular`. The backend graph checkpoints state after
+`@cacheplane/langgraph`. The backend graph checkpoints state after
each node, enabling resume-on-failure. The sidebar monitors execution
status in real time and exposes a "Retry" button when errors occur.
-Add a durable multi-step execution workflow to this Angular component using `agent()` from `@cacheplane/angular`. Display `stream.status()` as a colour-coded badge, show a `stream.hasValue()` indicator, and render a "Retry" button that calls `stream.reload()` when `stream.error()` is set. Bind `stream.messages()` in the template via the `` component from `@cacheplane/chat`.
+Add a durable multi-step execution workflow to this Angular component using `agent()` from `@cacheplane/langgraph`. Display `stream.status()` as a colour-coded badge, show a `stream.hasValue()` indicator, and render a "Retry" button that calls `stream.reload()` when `stream.error()` is set. Bind `stream.messages()` in the template via the `` component from `@cacheplane/chat`.
@@ -19,7 +19,7 @@ Set up `provideAgent()` in your app config with the LangGraph API URL:
```typescript
// app.config.ts
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
export const appConfig: ApplicationConfig = {
providers: [
@@ -39,7 +39,7 @@ In your component, call `agent()` with the `assistantId` pointing to your durabl
```typescript
// durable-execution.component.ts
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
export class DurableExecutionComponent {
protected readonly stream = agent({
diff --git a/cockpit/langgraph/interrupts/angular/package.json b/cockpit/langgraph/interrupts/angular/package.json
index d5511f987..58f6e7d77 100644
--- a/cockpit/langgraph/interrupts/angular/package.json
+++ b/cockpit/langgraph/interrupts/angular/package.json
@@ -3,7 +3,7 @@
"version": "0.0.1",
"peerDependencies": {
"@cacheplane/chat": "^0.0.1",
- "@cacheplane/angular": "^0.0.1",
+ "@cacheplane/langgraph": "^0.0.1",
"@langchain/langgraph-sdk": "^0.0.36"
},
"license": "PolyForm-Noncommercial-1.0.0",
diff --git a/cockpit/langgraph/interrupts/angular/src/app/app.config.ts b/cockpit/langgraph/interrupts/angular/src/app/app.config.ts
index 1e72bb3c9..3771b3b2f 100644
--- a/cockpit/langgraph/interrupts/angular/src/app/app.config.ts
+++ b/cockpit/langgraph/interrupts/angular/src/app/app.config.ts
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { environment } from '../environments/environment';
diff --git a/cockpit/langgraph/interrupts/angular/src/app/interrupts.component.ts b/cockpit/langgraph/interrupts/angular/src/app/interrupts.component.ts
index dfb210c94..fcd053da0 100644
--- a/cockpit/langgraph/interrupts/angular/src/app/interrupts.component.ts
+++ b/cockpit/langgraph/interrupts/angular/src/app/interrupts.component.ts
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { Component } from '@angular/core';
import { ChatComponent, ChatInterruptPanelComponent, views, type InterruptAction } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
+import { agent, toChatAgent } from '@cacheplane/langgraph';
import { ExampleChatLayoutComponent } from '@cacheplane/example-layouts';
import { signalStateStore } from '@cacheplane/render';
import { environment } from '../environments/environment';
@@ -26,10 +26,10 @@ import { ApprovalCardComponent } from './views/approval-card.component';
template: `
-
- @if (stream.interrupt()) {
+
+ @if (chatAgent.interrupt()) {
-
+
}
@@ -50,6 +50,7 @@ export class InterruptsComponent {
apiUrl: environment.langGraphApiUrl,
assistantId: environment.streamingAssistantId,
});
+ protected readonly chatAgent = toChatAgent(this.stream);
/**
* Handle an interrupt action from the panel.
@@ -65,6 +66,6 @@ export class InterruptsComponent {
// In a production app, 'edit' would let the user modify the response before approval.
// For this demo, all actions simply resume the graph.
void action; // Each branch intentionally does the same thing in this demo
- this.stream.submit(null);
+ void this.chatAgent.submit({ resume: null });
}
}
diff --git a/cockpit/langgraph/interrupts/python/docs/guide.md b/cockpit/langgraph/interrupts/python/docs/guide.md
index ce2237b66..66f35d5e6 100644
--- a/cockpit/langgraph/interrupts/python/docs/guide.md
+++ b/cockpit/langgraph/interrupts/python/docs/guide.md
@@ -2,12 +2,12 @@
Build a chat interface with human-in-the-loop approval using `agent()` from
-`@cacheplane/angular`. The LangGraph backend pauses execution for approval,
+`@cacheplane/langgraph`. The LangGraph backend pauses execution for approval,
and the frontend resumes it with `stream.submit()`.
-Add human-in-the-loop approval to this Angular component using `agent()` from `@cacheplane/angular`. Use `stream.interrupt()` to display pending approvals, `stream.submit(null)` to approve and resume execution, and `stream.submit({ resume: false })` to reject. Bind `stream.messages()` in the template via the `` component from `@cacheplane/chat`.
+Add human-in-the-loop approval to this Angular component using `agent()` from `@cacheplane/langgraph`. Use `stream.interrupt()` to display pending approvals, `stream.submit(null)` to approve and resume execution, and `stream.submit({ resume: false })` to reject. Bind `stream.messages()` in the template via the `` component from `@cacheplane/chat`.
@@ -18,7 +18,7 @@ Set up `provideAgent()` in your app config with the LangGraph API URL:
```typescript
// app.config.ts
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
export const appConfig: ApplicationConfig = {
providers: [
@@ -38,7 +38,7 @@ In your component, call `agent()` with the assistant ID that maps to your interr
```typescript
// interrupts.component.ts
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
export class InterruptsComponent {
protected readonly stream = agent({
diff --git a/cockpit/langgraph/memory/angular/package.json b/cockpit/langgraph/memory/angular/package.json
index c943f9885..7ced7a76a 100644
--- a/cockpit/langgraph/memory/angular/package.json
+++ b/cockpit/langgraph/memory/angular/package.json
@@ -3,7 +3,7 @@
"version": "0.0.1",
"peerDependencies": {
"@cacheplane/chat": "^0.0.1",
- "@cacheplane/angular": "^0.0.1",
+ "@cacheplane/langgraph": "^0.0.1",
"@langchain/langgraph-sdk": "^0.0.36"
},
"license": "PolyForm-Noncommercial-1.0.0",
diff --git a/cockpit/langgraph/memory/angular/src/app/app.config.ts b/cockpit/langgraph/memory/angular/src/app/app.config.ts
index 1e72bb3c9..3771b3b2f 100644
--- a/cockpit/langgraph/memory/angular/src/app/app.config.ts
+++ b/cockpit/langgraph/memory/angular/src/app/app.config.ts
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { environment } from '../environments/environment';
diff --git a/cockpit/langgraph/memory/angular/src/app/memory.component.ts b/cockpit/langgraph/memory/angular/src/app/memory.component.ts
index c4e2778c7..a24992ec6 100644
--- a/cockpit/langgraph/memory/angular/src/app/memory.component.ts
+++ b/cockpit/langgraph/memory/angular/src/app/memory.component.ts
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { Component, computed } from '@angular/core';
import { ChatComponent } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
+import { agent, toChatAgent } from '@cacheplane/langgraph';
import { ExampleChatLayoutComponent } from '@cacheplane/example-layouts';
import { environment } from '../environments/environment';
@@ -23,7 +23,7 @@ import { environment } from '../environments/environment';
imports: [ChatComponent, ExampleChatLayoutComponent],
template: `
-
+
-Add persistent agent memory to this Angular component using `agent()` from `@cacheplane/angular`. Use `stream.value()` to access the `memory` field in graph state, derive a reactive `memoryEntries` signal with Angular's `computed()`, and render the facts in a sidebar panel via the `` component from `@cacheplane/chat`.
+Add persistent agent memory to this Angular component using `agent()` from `@cacheplane/langgraph`. Use `stream.value()` to access the `memory` field in graph state, derive a reactive `memoryEntries` signal with Angular's `computed()`, and render the facts in a sidebar panel via the `` component from `@cacheplane/chat`.
@@ -19,7 +19,7 @@ Set up `provideAgent()` in your app config with the LangGraph API URL:
```typescript
// app.config.ts
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
export const appConfig: ApplicationConfig = {
providers: [
@@ -37,7 +37,7 @@ In your component, call `agent()` pointing at the `memory` assistant:
```typescript
// memory.component.ts
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
export class MemoryComponent {
protected readonly stream = agent({
diff --git a/cockpit/langgraph/persistence/angular/package.json b/cockpit/langgraph/persistence/angular/package.json
index 8b60986f6..2e6ba7579 100644
--- a/cockpit/langgraph/persistence/angular/package.json
+++ b/cockpit/langgraph/persistence/angular/package.json
@@ -3,7 +3,7 @@
"version": "0.0.1",
"peerDependencies": {
"@cacheplane/chat": "^0.0.1",
- "@cacheplane/angular": "^0.0.1",
+ "@cacheplane/langgraph": "^0.0.1",
"@langchain/langgraph-sdk": "^0.0.36"
},
"license": "PolyForm-Noncommercial-1.0.0",
diff --git a/cockpit/langgraph/persistence/angular/src/app/app.config.ts b/cockpit/langgraph/persistence/angular/src/app/app.config.ts
index 1e72bb3c9..3771b3b2f 100644
--- a/cockpit/langgraph/persistence/angular/src/app/app.config.ts
+++ b/cockpit/langgraph/persistence/angular/src/app/app.config.ts
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { environment } from '../environments/environment';
diff --git a/cockpit/langgraph/persistence/angular/src/app/persistence.component.ts b/cockpit/langgraph/persistence/angular/src/app/persistence.component.ts
index 0d5766ef5..fabfd30ac 100644
--- a/cockpit/langgraph/persistence/angular/src/app/persistence.component.ts
+++ b/cockpit/langgraph/persistence/angular/src/app/persistence.component.ts
@@ -1,6 +1,6 @@
import { Component, signal } from '@angular/core';
import { ChatComponent } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
+import { agent, toChatAgent } from '@cacheplane/langgraph';
import { ExampleChatLayoutComponent } from '@cacheplane/example-layouts';
import { environment } from '../environments/environment';
@@ -26,7 +26,7 @@ interface Thread {
imports: [ChatComponent, ExampleChatLayoutComponent],
template: `
-
+
Build a chat interface with thread persistence using `agent()` from
-`@cacheplane/angular`. Conversations survive browser refreshes and
+`@cacheplane/langgraph`. Conversations survive browser refreshes and
can be resumed using `stream.switchThread(id)`.
-Add thread persistence to this Angular component using `agent()` from `@cacheplane/angular`. Use the `onThreadId` callback to capture thread IDs, `stream.switchThread(id)` to resume conversations, and `stream.switchThread(null)` to start fresh. Bind `stream.messages()` in the template via the `` component from `@cacheplane/chat`.
+Add thread persistence to this Angular component using `agent()` from `@cacheplane/langgraph`. Use the `onThreadId` callback to capture thread IDs, `stream.switchThread(id)` to resume conversations, and `stream.switchThread(null)` to start fresh. Bind `stream.messages()` in the template via the `` component from `@cacheplane/chat`.
@@ -18,7 +18,7 @@ Set up `provideAgent()` in your app config with the LangGraph API URL:
```typescript
// app.config.ts
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
export const appConfig: ApplicationConfig = {
providers: [
@@ -38,7 +38,7 @@ In your component, call `agent()` with the `onThreadId` callback to capture new
```typescript
// persistence.component.ts
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
export class PersistenceComponent {
protected readonly stream = agent({
diff --git a/cockpit/langgraph/streaming/angular/package.json b/cockpit/langgraph/streaming/angular/package.json
index 222846536..01f1acf41 100644
--- a/cockpit/langgraph/streaming/angular/package.json
+++ b/cockpit/langgraph/streaming/angular/package.json
@@ -3,7 +3,7 @@
"version": "0.0.1",
"peerDependencies": {
"@cacheplane/chat": "^0.0.1",
- "@cacheplane/angular": "^0.0.1",
+ "@cacheplane/langgraph": "^0.0.1",
"@langchain/langgraph-sdk": "^0.0.36"
},
"license": "PolyForm-Noncommercial-1.0.0",
diff --git a/cockpit/langgraph/streaming/angular/src/app/app.config.ts b/cockpit/langgraph/streaming/angular/src/app/app.config.ts
index 1e72bb3c9..3771b3b2f 100644
--- a/cockpit/langgraph/streaming/angular/src/app/app.config.ts
+++ b/cockpit/langgraph/streaming/angular/src/app/app.config.ts
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { environment } from '../environments/environment';
diff --git a/cockpit/langgraph/streaming/angular/src/app/streaming.component.ts b/cockpit/langgraph/streaming/angular/src/app/streaming.component.ts
index 63eed12a4..aa24c2469 100644
--- a/cockpit/langgraph/streaming/angular/src/app/streaming.component.ts
+++ b/cockpit/langgraph/streaming/angular/src/app/streaming.component.ts
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { Component } from '@angular/core';
import { ChatComponent } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
+import { agent, toChatAgent } from '@cacheplane/langgraph';
import { ExampleChatLayoutComponent } from '@cacheplane/example-layouts';
import { environment } from '../environments/environment';
@@ -18,7 +18,7 @@ import { environment } from '../environments/environment';
imports: [ChatComponent, ExampleChatLayoutComponent],
template: `
-
+
`,
})
@@ -27,4 +27,5 @@ export class StreamingComponent {
apiUrl: environment.langGraphApiUrl,
assistantId: environment.streamingAssistantId,
});
+ protected readonly chatAgent = toChatAgent(this.stream);
}
diff --git a/cockpit/langgraph/streaming/python/docs/guide.md b/cockpit/langgraph/streaming/python/docs/guide.md
index 41e6e771e..25b33b409 100644
--- a/cockpit/langgraph/streaming/python/docs/guide.md
+++ b/cockpit/langgraph/streaming/python/docs/guide.md
@@ -2,11 +2,11 @@
Build a real-time streaming chat interface using `agent()` from
-`@cacheplane/angular` connected to a LangGraph backend on LangSmith Cloud.
+`@cacheplane/langgraph` connected to a LangGraph backend on LangSmith Cloud.
-Add real-time LLM streaming to this Angular component using `agent()` from `@cacheplane/angular`. Configure `provideAgent({ apiUrl })` in the app config, then call `stream.submit()` to send messages. Bind `stream.messages()` in the template using `@for` — all Signals, no subscriptions needed.
+Add real-time LLM streaming to this Angular component using `agent()` from `@cacheplane/langgraph`. Configure `provideAgent({ apiUrl })` in the app config, then call `stream.submit()` to send messages. Bind `stream.messages()` in the template using `@for` — all Signals, no subscriptions needed.
@@ -17,7 +17,7 @@ Set up `provideAgent()` in your app config with the LangGraph Cloud URL:
```typescript
// app.config.ts
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
export const appConfig: ApplicationConfig = {
providers: [
@@ -37,7 +37,7 @@ In your component, call `agent()` in a field initializer (injection context requ
```typescript
// streaming.component.ts
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
export class StreamingComponent {
protected readonly stream = agent({
diff --git a/cockpit/langgraph/subgraphs/angular/package.json b/cockpit/langgraph/subgraphs/angular/package.json
index fad17e402..c42a54ce7 100644
--- a/cockpit/langgraph/subgraphs/angular/package.json
+++ b/cockpit/langgraph/subgraphs/angular/package.json
@@ -3,7 +3,7 @@
"version": "0.0.1",
"peerDependencies": {
"@cacheplane/chat": "^0.0.1",
- "@cacheplane/angular": "^0.0.1",
+ "@cacheplane/langgraph": "^0.0.1",
"@langchain/langgraph-sdk": "^0.0.36"
},
"license": "PolyForm-Noncommercial-1.0.0",
diff --git a/cockpit/langgraph/subgraphs/angular/src/app/app.config.ts b/cockpit/langgraph/subgraphs/angular/src/app/app.config.ts
index 1e72bb3c9..3771b3b2f 100644
--- a/cockpit/langgraph/subgraphs/angular/src/app/app.config.ts
+++ b/cockpit/langgraph/subgraphs/angular/src/app/app.config.ts
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { environment } from '../environments/environment';
diff --git a/cockpit/langgraph/subgraphs/angular/src/app/subgraphs.component.ts b/cockpit/langgraph/subgraphs/angular/src/app/subgraphs.component.ts
index e7c7a0b74..7313794a3 100644
--- a/cockpit/langgraph/subgraphs/angular/src/app/subgraphs.component.ts
+++ b/cockpit/langgraph/subgraphs/angular/src/app/subgraphs.component.ts
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { Component, computed } from '@angular/core';
import { ChatComponent } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
+import { agent, toChatAgent } from '@cacheplane/langgraph';
import { ExampleChatLayoutComponent } from '@cacheplane/example-layouts';
import { environment } from '../environments/environment';
@@ -23,7 +23,7 @@ import { environment } from '../environments/environment';
imports: [ChatComponent, ExampleChatLayoutComponent],
template: `
-
+
Build a chat interface that visualizes nested agent delegation using `agent()` from
-`@cacheplane/angular`. A parent orchestrator dispatches research tasks to a child
+`@cacheplane/langgraph`. A parent orchestrator dispatches research tasks to a child
subgraph, and the sidebar tracks each subagent's status in real time using `stream.subagents()`.
-Add a subgraph-powered orchestrator to this Angular component using `agent()` from `@cacheplane/angular`. Use `stream.subagents()` to track active child subgraph executions, and derive a `subagentEntries` signal with `computed()` for template iteration. Bind `stream.messages()` via the `` component from `@cacheplane/chat`.
+Add a subgraph-powered orchestrator to this Angular component using `agent()` from `@cacheplane/langgraph`. Use `stream.subagents()` to track active child subgraph executions, and derive a `subagentEntries` signal with `computed()` for template iteration. Bind `stream.messages()` via the `` component from `@cacheplane/chat`.
@@ -18,7 +18,7 @@ Set up `provideAgent()` in your app config with the LangGraph API URL:
```typescript
// app.config.ts
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
export const appConfig: ApplicationConfig = {
providers: [
@@ -37,7 +37,7 @@ In your component, call `agent()` with the assistant ID pointing to your subgrap
```typescript
// subgraphs.component.ts
import { Component, computed } from '@angular/core';
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
export class SubgraphsComponent {
protected readonly stream = agent({
diff --git a/cockpit/langgraph/time-travel/angular/package.json b/cockpit/langgraph/time-travel/angular/package.json
index 4312ae2f2..9cccaca3f 100644
--- a/cockpit/langgraph/time-travel/angular/package.json
+++ b/cockpit/langgraph/time-travel/angular/package.json
@@ -3,7 +3,7 @@
"version": "0.0.1",
"peerDependencies": {
"@cacheplane/chat": "^0.0.1",
- "@cacheplane/angular": "^0.0.1",
+ "@cacheplane/langgraph": "^0.0.1",
"@langchain/langgraph-sdk": "^0.0.36"
},
"license": "PolyForm-Noncommercial-1.0.0",
diff --git a/cockpit/langgraph/time-travel/angular/src/app/app.config.ts b/cockpit/langgraph/time-travel/angular/src/app/app.config.ts
index 1e72bb3c9..3771b3b2f 100644
--- a/cockpit/langgraph/time-travel/angular/src/app/app.config.ts
+++ b/cockpit/langgraph/time-travel/angular/src/app/app.config.ts
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { environment } from '../environments/environment';
diff --git a/cockpit/langgraph/time-travel/angular/src/app/time-travel.component.ts b/cockpit/langgraph/time-travel/angular/src/app/time-travel.component.ts
index 384316621..274e976b5 100644
--- a/cockpit/langgraph/time-travel/angular/src/app/time-travel.component.ts
+++ b/cockpit/langgraph/time-travel/angular/src/app/time-travel.component.ts
@@ -1,7 +1,7 @@
import { Component, computed, signal } from '@angular/core';
import { ChatComponent } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
-import type { ThreadState } from '@cacheplane/angular';
+import { agent, toChatAgent } from '@cacheplane/langgraph';
+import type { ThreadState } from '@cacheplane/langgraph';
import { ExampleChatLayoutComponent } from '@cacheplane/example-layouts';
import { environment } from '../environments/environment';
@@ -22,7 +22,7 @@ import { environment } from '../environments/environment';
template: `
-
+
(-1);
diff --git a/cockpit/langgraph/time-travel/python/docs/guide.md b/cockpit/langgraph/time-travel/python/docs/guide.md
index 5fb2809a3..12006cfc5 100644
--- a/cockpit/langgraph/time-travel/python/docs/guide.md
+++ b/cockpit/langgraph/time-travel/python/docs/guide.md
@@ -2,13 +2,13 @@
Build a chat interface with time travel using `agent()` from
-`@cacheplane/angular`. Browse the checkpoint history via `stream.history()`,
+`@cacheplane/langgraph`. Browse the checkpoint history via `stream.history()`,
see the active branch via `stream.branch()`, and fork the conversation from any
past state with `stream.setBranch(checkpointId)`.
-Add time travel to this Angular component using `agent()` from `@cacheplane/angular`. Display checkpoint history from `stream.history()` in the sidebar. Highlight the active branch using `stream.branch()`. Call `stream.setBranch(id)` when the user clicks a checkpoint to fork the conversation from that point.
+Add time travel to this Angular component using `agent()` from `@cacheplane/langgraph`. Display checkpoint history from `stream.history()` in the sidebar. Highlight the active branch using `stream.branch()`. Call `stream.setBranch(id)` when the user clicks a checkpoint to fork the conversation from that point.
@@ -19,7 +19,7 @@ Set up `provideAgent()` in your app config with the LangGraph API URL:
```typescript
// app.config.ts
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
export const appConfig: ApplicationConfig = {
providers: [
@@ -38,7 +38,7 @@ available automatically — no extra config needed:
```typescript
// time-travel.component.ts
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
export class TimeTravelComponent {
protected readonly stream = agent({
diff --git a/docs/superpowers/context/2026-04-06-chat-library-continuation.md b/docs/superpowers/context/2026-04-06-chat-library-continuation.md
index 661ca1778..65b0ad725 100644
--- a/docs/superpowers/context/2026-04-06-chat-library-continuation.md
+++ b/docs/superpowers/context/2026-04-06-chat-library-continuation.md
@@ -59,7 +59,7 @@ Two-layer Angular chat library: headless primitives + prebuilt Tailwind composit
**Tests:** 112 passing.
-**Peer deps:** `@cacheplane/render`, `@cacheplane/angular`, `@angular/core`, `@angular/common`, `@langchain/core`
+**Peer deps:** `@cacheplane/render`, `@cacheplane/langgraph`, `@angular/core`, `@angular/common`, `@langchain/core`
### Cockpit Integration — 14 Angular Examples
@@ -140,7 +140,7 @@ All 14 standalone Angular apps consuming @cacheplane/chat, each with Angular CLI
libs/render/ # @cacheplane/render
libs/chat/ # @cacheplane/chat
libs/chat/src/lib/styles/chat-theme.css # CSS custom properties
-libs/angular/ # @cacheplane/angular (existing)
+libs/angular/ # @cacheplane/langgraph (existing)
cockpit/langgraph/*/angular/ # 8 LangGraph examples
cockpit/deep-agents/*/angular/ # 6 Deep Agents examples
apps/cockpit/ # Next.js cockpit shell
diff --git a/docs/superpowers/plans/2026-03-19-next-steps.md b/docs/superpowers/plans/2026-03-19-next-steps.md
index 768c8afb6..a4bd8a123 100644
--- a/docs/superpowers/plans/2026-03-19-next-steps.md
+++ b/docs/superpowers/plans/2026-03-19-next-steps.md
@@ -34,7 +34,7 @@
- Add `"files": ["dist", "README.md", "LICENSE", "NOTICE"]` to `packages/mcp/package.json`
- Verify `libs/angular` build output includes the right files
- Dry-run publish both packages
-- Publish `@cacheplane/angular` and `@cacheplane/angular-mcp`
+- Publish `@cacheplane/langgraph` and `@cacheplane/langgraph-mcp`
- Add a CI `publish` job triggered on `v*.*.*` tags
**Reference:** `docs/superpowers/plans/2026-03-19-npm-publish.md`
diff --git a/docs/superpowers/plans/2026-03-19-npm-publish.md b/docs/superpowers/plans/2026-03-19-npm-publish.md
index 54856b288..0da04634b 100644
--- a/docs/superpowers/plans/2026-03-19-npm-publish.md
+++ b/docs/superpowers/plans/2026-03-19-npm-publish.md
@@ -1,4 +1,4 @@
-# npm Publish Plan — @cacheplane/angular + @cacheplane/angular-mcp
+# npm Publish Plan — @cacheplane/langgraph + @cacheplane/langgraph-mcp
**Date:** 2026-03-19
**Status:** Not started
@@ -12,8 +12,8 @@ Publish two packages to npm under the `@cacheplane` scope:
| Package | Version | Registry path |
|---|---|---|
-| `@cacheplane/angular` | `0.0.1` | `libs/angular/` |
-| `@cacheplane/angular-mcp` | `0.1.0` | `packages/mcp/` |
+| `@cacheplane/langgraph` | `0.0.1` | `libs/angular/` |
+| `@cacheplane/langgraph-mcp` | `0.1.0` | `packages/mcp/` |
---
@@ -42,7 +42,7 @@ Add the token to GitHub repo secrets as `NPM_TOKEN`.
## What to Publish
-### `@cacheplane/angular`
+### `@cacheplane/langgraph`
- Source: `libs/angular/`
- Built by: `npx nx build angular` → outputs to `dist/libs/angular/`
@@ -51,7 +51,7 @@ Add the token to GitHub repo secrets as `NPM_TOKEN`.
The `libs/angular/package.json` must have a `files` field or `ng-package.json` controls what gets included. Verify the dist output contains: `package.json`, `index.d.ts`, `fesm2022/`, `esm2022/`.
-### `@cacheplane/angular-mcp`
+### `@cacheplane/langgraph-mcp`
- Source: `packages/mcp/`
- Build command: `npm run build` (runs `tsc -p tsconfig.json` → outputs to `packages/mcp/dist/`)
@@ -134,9 +134,9 @@ publish:
## Post-Publish
- Verify packages appear at:
- - https://www.npmjs.com/package/@cacheplane/angular
- - https://www.npmjs.com/package/@cacheplane/angular-mcp
-- Update npm badge in README.md (badge already points to `@cacheplane/angular`, will populate once published)
+ - https://www.npmjs.com/package/@cacheplane/langgraph
+ - https://www.npmjs.com/package/@cacheplane/langgraph-mcp
+- Update npm badge in README.md (badge already points to `@cacheplane/langgraph`, will populate once published)
- Update `PricingGrid.tsx` `ctaHref` if needed (currently points to npm URL, which is already correct)
---
diff --git a/docs/superpowers/plans/2026-03-19-package-rename.md b/docs/superpowers/plans/2026-03-19-package-rename.md
index 640eab7a2..d2ad74087 100644
--- a/docs/superpowers/plans/2026-03-19-package-rename.md
+++ b/docs/superpowers/plans/2026-03-19-package-rename.md
@@ -11,8 +11,8 @@ Rename both published packages to the `@cacheplane` npm scope.
| Before | After |
|---|---|
-| `angular` | `@cacheplane/angular` |
-| `@angular/mcp` | `@cacheplane/angular-mcp` |
+| `angular` | `@cacheplane/langgraph` |
+| `@angular/mcp` | `@cacheplane/langgraph-mcp` |
The website brand name **angular** (used in the hero SVG wordmark, site title, and domain) is unchanged.
@@ -24,15 +24,15 @@ The website brand name **angular** (used in the hero SVG wordmark, site title, a
| File | Change |
|---|---|
-| `libs/angular/package.json` | `"name": "@cacheplane/angular"` |
-| `packages/mcp/package.json` | `"name": "@cacheplane/angular-mcp"`, `"bin": { "@cacheplane/angular-mcp": "dist/index.js" }` |
+| `libs/angular/package.json` | `"name": "@cacheplane/langgraph"` |
+| `packages/mcp/package.json` | `"name": "@cacheplane/langgraph-mcp"`, `"bin": { "@cacheplane/langgraph-mcp": "dist/index.js" }` |
### TypeScript path aliases
**`tsconfig.base.json`:**
```json
"paths": {
- "@cacheplane/angular": ["libs/angular/src/public-api.ts"]
+ "@cacheplane/langgraph": ["libs/angular/src/public-api.ts"]
}
```
@@ -54,7 +54,7 @@ The website brand name **angular** (used in the hero SVG wordmark, site title, a
### MCP binary name
-The `npx` command changed from `npx @angular/mcp` to `npx @cacheplane/angular-mcp`.
+The `npx` command changed from `npx @angular/mcp` to `npx @cacheplane/langgraph-mcp`.
---
diff --git a/docs/superpowers/plans/2026-04-03-docs-mode-redesign.md b/docs/superpowers/plans/2026-04-03-docs-mode-redesign.md
index 6a028fddf..36baffb78 100644
--- a/docs/superpowers/plans/2026-04-03-docs-mode-redesign.md
+++ b/docs/superpowers/plans/2026-04-03-docs-mode-redesign.md
@@ -686,11 +686,11 @@ git commit -m "feat(cockpit): update NarrativeDocs with constrained width and cl
Build a real-time streaming chat interface using `agent()` from
-`@cacheplane/angular` connected to a LangGraph backend on LangSmith Cloud.
+`@cacheplane/langgraph` connected to a LangGraph backend on LangSmith Cloud.
-Add real-time LLM streaming to this Angular component using `agent()` from `@cacheplane/angular`. Configure `provideAgent({ apiUrl })` in the app config, then call `stream.submit()` to send messages. Bind `stream.messages()` in the template using `@for` — all Signals, no subscriptions needed.
+Add real-time LLM streaming to this Angular component using `agent()` from `@cacheplane/langgraph`. Configure `provideAgent({ apiUrl })` in the app config, then call `stream.submit()` to send messages. Bind `stream.messages()` in the template using `@for` — all Signals, no subscriptions needed.
@@ -701,7 +701,7 @@ Set up `provideAgent()` in your app config with the LangGraph Cloud URL:
```typescript
// app.config.ts
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
export const appConfig: ApplicationConfig = {
providers: [
@@ -721,7 +721,7 @@ In your component, call `agent()` in a field initializer (injection context requ
```typescript
// streaming.component.ts
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
export class StreamingComponent {
protected readonly stream = agent({
diff --git a/docs/superpowers/plans/2026-04-03-glassy-gradient-redesign.md b/docs/superpowers/plans/2026-04-03-glassy-gradient-redesign.md
index 975ae0a81..9fb9f37cd 100644
--- a/docs/superpowers/plans/2026-04-03-glassy-gradient-redesign.md
+++ b/docs/superpowers/plans/2026-04-03-glassy-gradient-redesign.md
@@ -298,7 +298,7 @@ git commit -m "feat(website): apply glass treatment to Footer"
import { useState } from 'react';
import { tokens } from '../../../lib/design-tokens';
-const CMD = 'npm install @cacheplane/angular';
+const CMD = 'npm install @cacheplane/langgraph';
export function InstallStrip() {
const [copied, setCopied] = useState(false);
@@ -541,7 +541,7 @@ export async function HeroTwoCol() {
fontSize: 12,
color: tokens.colors.textMuted,
}}>
- npm install @cacheplane/angular
+ npm install @cacheplane/langgraph
@@ -1216,7 +1216,7 @@ const PLANS = [
features: ['PolyForm Noncommercial 1.0.0', 'Personal projects', 'Academic & research', 'Non-profit internal use'],
highlight: false,
cta: 'Get Started',
- ctaHref: 'https://www.npmjs.com/package/@cacheplane/angular',
+ ctaHref: 'https://www.npmjs.com/package/@cacheplane/langgraph',
},
{
name: 'Developer Seat',
diff --git a/docs/superpowers/plans/2026-04-03-langsmith-angular-runtime.md b/docs/superpowers/plans/2026-04-03-langsmith-angular-runtime.md
index 48d47f2b6..804394f8d 100644
--- a/docs/superpowers/plans/2026-04-03-langsmith-angular-runtime.md
+++ b/docs/superpowers/plans/2026-04-03-langsmith-angular-runtime.md
@@ -2,11 +2,11 @@
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
-**Goal:** Rewrite the Angular streaming example to use `agent()` from `@cacheplane/angular`, add environment config for LangGraph Cloud, and create a CI workflow that deploys the LangGraph backend on merge to main (with manual dispatch for testing).
+**Goal:** Rewrite the Angular streaming example to use `agent()` from `@cacheplane/langgraph`, add environment config for LangGraph Cloud, and create a CI workflow that deploys the LangGraph backend on merge to main (with manual dispatch for testing).
**Architecture:** Delete the hand-rolled `StreamingService`, replace with `agent()` Signal-based API. Add Angular environment files for dev/prod LangGraph URLs. Create a GitHub Action that runs `langgraph deploy` from the capability's python directory. Update `app.config.ts` to use `provideAgent()`.
-**Tech Stack:** Angular 19+ (standalone), `@cacheplane/angular`, `@langchain/langgraph-sdk`, `@langchain/core`, GitHub Actions, `langgraph-cli`
+**Tech Stack:** Angular 19+ (standalone), `@cacheplane/langgraph`, `@langchain/langgraph-sdk`, `@langchain/core`, GitHub Actions, `langgraph-cli`
---
@@ -96,7 +96,7 @@ git commit -m "refactor(cockpit): remove StreamingService, add environment confi
"version": "0.0.1",
"private": true,
"dependencies": {
- "@cacheplane/angular": "^0.0.1",
+ "@cacheplane/langgraph": "^0.0.1",
"@langchain/core": "^0.3.0",
"@langchain/langgraph-sdk": "^0.0.36"
}
@@ -126,7 +126,7 @@ git commit -m "chore(cockpit): add angular and LangGraph SDK deps to Angular exa
```ts
// cockpit/langgraph/streaming/angular/src/app/app.config.ts
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { environment } from '../environments/environment';
/**
@@ -165,7 +165,7 @@ git commit -m "feat(cockpit): configure provideAgent in Angular app"
// cockpit/langgraph/streaming/angular/src/app/streaming.component.ts
import { Component, computed, signal } from '@angular/core';
import { FormsModule } from '@angular/forms';
-import { agent, ResourceStatus } from '@cacheplane/angular';
+import { agent, ResourceStatus } from '@cacheplane/langgraph';
import type { BaseMessage } from '@langchain/core/messages';
import { environment } from '../environments/environment';
diff --git a/docs/superpowers/plans/2026-04-03-narrative-docs.md b/docs/superpowers/plans/2026-04-03-narrative-docs.md
index a8d4ca344..f40b31b82 100644
--- a/docs/superpowers/plans/2026-04-03-narrative-docs.md
+++ b/docs/superpowers/plans/2026-04-03-narrative-docs.md
@@ -425,7 +425,7 @@ git commit -m "feat(cockpit): add four-mode shell with Docs and API modes"
# Streaming with angular
This guide walks through building a real-time streaming chat interface using
-`agent()` from `@cacheplane/angular` connected to a LangGraph
+`agent()` from `@cacheplane/langgraph` connected to a LangGraph
backend on LangSmith Cloud.
## What you'll build
@@ -439,7 +439,7 @@ visual feedback instead of waiting for a complete response.
Set up `provideAgent()` in your app config with the LangGraph Cloud URL:
```typescript
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
export const appConfig: ApplicationConfig = {
providers: [
@@ -457,7 +457,7 @@ This makes the API URL available to all `agent()` calls in your app.
In your component, call `agent()` in a field initializer (injection context required):
```typescript
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
export class StreamingComponent {
protected readonly stream = agent({
diff --git a/docs/superpowers/plans/2026-04-04-cacheplane-chat.md b/docs/superpowers/plans/2026-04-04-cacheplane-chat.md
index c8ed0625a..f124e9b60 100644
--- a/docs/superpowers/plans/2026-04-04-cacheplane-chat.md
+++ b/docs/superpowers/plans/2026-04-04-cacheplane-chat.md
@@ -4,9 +4,9 @@
**Goal:** Build an Angular chat component library with headless primitives and prebuilt Tailwind compositions for LangGraph, LangChain, and Deep Agent UIs.
-**Architecture:** Two-layer design — headless primitives (unstyled, logic-only, composable via `ng-template`) and prebuilt compositions (Tailwind + shadcn model). All components accept a `AgentRef` from `@cacheplane/angular`. Generative UI hosted via `@cacheplane/render`. Debug component provides agent execution inspection.
+**Architecture:** Two-layer design — headless primitives (unstyled, logic-only, composable via `ng-template`) and prebuilt compositions (Tailwind + shadcn model). All components accept a `AgentRef` from `@cacheplane/langgraph`. Generative UI hosted via `@cacheplane/render`. Debug component provides agent execution inspection.
-**Tech Stack:** Angular 21+, `@cacheplane/angular`, `@cacheplane/render`, Tailwind CSS, Nx 22, ng-packagr, Vitest
+**Tech Stack:** Angular 21+, `@cacheplane/langgraph`, `@cacheplane/render`, Tailwind CSS, Nx 22, ng-packagr, Vitest
**Spec:** `docs/superpowers/specs/2026-04-04-chat-component-library-design.md` — Deliverable 2
@@ -122,7 +122,7 @@ npx nx generate @nx/angular:library chat --directory=libs/chat --publishable --i
"@angular/core": "^20.0.0 || ^21.0.0",
"@angular/common": "^20.0.0 || ^21.0.0",
"@cacheplane/render": "^0.0.1",
- "@cacheplane/angular": "^0.0.1",
+ "@cacheplane/langgraph": "^0.0.1",
"@langchain/core": "^1.1.33"
},
"license": "PolyForm-Noncommercial-1.0.0",
@@ -203,7 +203,7 @@ Create `libs/chat/src/lib/chat.types.ts`:
```typescript
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import type { Signal } from '@angular/core';
-import type { AgentRef } from '@cacheplane/angular';
+import type { AgentRef } from '@cacheplane/langgraph';
import type { AngularRegistry } from '@cacheplane/render';
import type { BaseMessage } from '@langchain/core/messages';
@@ -234,8 +234,8 @@ Create `libs/chat/src/lib/testing/mock-angular-ref.ts`:
```typescript
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { signal, computed } from '@angular/core';
-import type { AgentRef } from '@cacheplane/angular';
-import { ResourceStatus } from '@cacheplane/angular';
+import type { AgentRef } from '@cacheplane/langgraph';
+import { ResourceStatus } from '@cacheplane/langgraph';
import type { BaseMessage } from '@langchain/core/messages';
import { HumanMessage, AIMessage } from '@langchain/core/messages';
@@ -411,7 +411,7 @@ import {
ChangeDetectionStrategy,
} from '@angular/core';
import { NgTemplateOutlet } from '@angular/common';
-import type { AgentRef } from '@cacheplane/angular';
+import type { AgentRef } from '@cacheplane/langgraph';
import type { BaseMessage } from '@langchain/core/messages';
import { MessageTemplateDirective } from './message-template.directive';
import type { MessageTemplateType } from '../../chat.types';
@@ -558,7 +558,7 @@ import {
ChangeDetectionStrategy,
} from '@angular/core';
import { FormsModule } from '@angular/forms';
-import type { AgentRef } from '@cacheplane/angular';
+import type { AgentRef } from '@cacheplane/langgraph';
import { HumanMessage } from '@langchain/core/messages';
@Component({
@@ -650,7 +650,7 @@ import { describe, it, expect } from 'vitest';
import { TestBed } from '@angular/core/testing';
import { ChatTypingIndicatorComponent } from './chat-typing-indicator.component';
import { createMockAgentRef } from '../../testing/mock-angular-ref';
-import { ResourceStatus } from '@cacheplane/angular';
+import { ResourceStatus } from '@cacheplane/langgraph';
describe('ChatTypingIndicatorComponent', () => {
it('should render when loading', () => {
@@ -714,7 +714,7 @@ Create `libs/chat/src/lib/primitives/chat-typing-indicator/chat-typing-indicator
```typescript
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { Component, computed, input, ChangeDetectionStrategy } from '@angular/core';
-import type { AgentRef } from '@cacheplane/angular';
+import type { AgentRef } from '@cacheplane/langgraph';
@Component({
selector: 'chat-typing-indicator',
@@ -740,7 +740,7 @@ Create `libs/chat/src/lib/primitives/chat-error/chat-error.component.ts`:
```typescript
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { Component, computed, input, ChangeDetectionStrategy } from '@angular/core';
-import type { AgentRef } from '@cacheplane/angular';
+import type { AgentRef } from '@cacheplane/langgraph';
@Component({
selector: 'chat-error',
@@ -855,7 +855,7 @@ import {
ChangeDetectionStrategy,
} from '@angular/core';
import { NgTemplateOutlet } from '@angular/common';
-import type { AgentRef } from '@cacheplane/angular';
+import type { AgentRef } from '@cacheplane/langgraph';
@Component({
selector: 'chat-interrupt',
@@ -975,7 +975,7 @@ import {
ChangeDetectionStrategy,
} from '@angular/core';
import { NgTemplateOutlet } from '@angular/common';
-import type { AgentRef } from '@cacheplane/angular';
+import type { AgentRef } from '@cacheplane/langgraph';
import type { BaseMessage } from '@langchain/core/messages';
@Component({
@@ -1023,7 +1023,7 @@ import {
ChangeDetectionStrategy,
} from '@angular/core';
import { NgTemplateOutlet } from '@angular/common';
-import type { AgentRef } from '@cacheplane/angular';
+import type { AgentRef } from '@cacheplane/langgraph';
@Component({
selector: 'chat-subagents',
@@ -1243,7 +1243,7 @@ import {
ChangeDetectionStrategy,
} from '@angular/core';
import { NgTemplateOutlet } from '@angular/common';
-import type { AgentRef } from '@cacheplane/angular';
+import type { AgentRef } from '@cacheplane/langgraph';
@Component({
selector: 'chat-timeline',
@@ -1443,7 +1443,7 @@ Create `libs/chat/src/lib/compositions/chat/chat.component.ts`:
```typescript
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { Component, input, ChangeDetectionStrategy } from '@angular/core';
-import type { AgentRef } from '@cacheplane/angular';
+import type { AgentRef } from '@cacheplane/langgraph';
import { ChatMessagesComponent } from '../../primitives/chat-messages/chat-messages.component';
import { MessageTemplateDirective } from '../../primitives/chat-messages/message-template.directive';
import { ChatInputComponent } from '../../primitives/chat-input/chat-input.component';
@@ -1539,7 +1539,7 @@ Create `libs/chat/src/lib/compositions/chat-interrupt-panel/chat-interrupt-panel
```typescript
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { Component, input, output, ChangeDetectionStrategy } from '@angular/core';
-import type { AgentRef } from '@cacheplane/angular';
+import type { AgentRef } from '@cacheplane/langgraph';
export type InterruptAction = 'accept' | 'edit' | 'respond' | 'ignore';
@@ -1638,7 +1638,7 @@ Create `libs/chat/src/lib/compositions/chat-subagent-card/chat-subagent-card.com
```typescript
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { Component, computed, input, signal, ChangeDetectionStrategy } from '@angular/core';
-import type { SubagentStreamRef } from '@cacheplane/angular';
+import type { SubagentStreamRef } from '@cacheplane/langgraph';
@Component({
selector: 'chat-subagent-card',
@@ -1952,7 +1952,7 @@ Create `libs/chat/src/lib/compositions/chat-debug/chat-debug.component.ts`:
```typescript
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { Component, computed, input, signal, ChangeDetectionStrategy } from '@angular/core';
-import type { AgentRef } from '@cacheplane/angular';
+import type { AgentRef } from '@cacheplane/langgraph';
import { ChatMessagesComponent } from '../../primitives/chat-messages/chat-messages.component';
import { MessageTemplateDirective } from '../../primitives/chat-messages/message-template.directive';
import { ChatInputComponent } from '../../primitives/chat-input/chat-input.component';
diff --git a/docs/superpowers/plans/2026-04-04-cockpit-chat-integration.md b/docs/superpowers/plans/2026-04-04-cockpit-chat-integration.md
index e1bc1a3de..befa42dc9 100644
--- a/docs/superpowers/plans/2026-04-04-cockpit-chat-integration.md
+++ b/docs/superpowers/plans/2026-04-04-cockpit-chat-integration.md
@@ -4,9 +4,9 @@
**Goal:** Update cockpit capability examples to consume `@cacheplane/chat` components, validating the library's API against real LangGraph and Deep Agent use cases.
-**Architecture:** Each capability example is a standalone Angular app with its own backend and LangSmith deployment. Examples import `@cacheplane/chat` and `@cacheplane/angular`. The cockpit (React/Next.js) embeds them via the existing embed strategy.
+**Architecture:** Each capability example is a standalone Angular app with its own backend and LangSmith deployment. Examples import `@cacheplane/chat` and `@cacheplane/langgraph`. The cockpit (React/Next.js) embeds them via the existing embed strategy.
-**Tech Stack:** Angular 21+, `@cacheplane/chat`, `@cacheplane/angular`, Nx 22
+**Tech Stack:** Angular 21+, `@cacheplane/chat`, `@cacheplane/langgraph`, Nx 22
**Spec:** `docs/superpowers/specs/2026-04-04-chat-component-library-design.md` — Deliverable 3
@@ -64,7 +64,7 @@ This is the reference example — all others follow this pattern.
```typescript
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
export const appConfig: ApplicationConfig = {
@@ -83,7 +83,7 @@ export const appConfig: ApplicationConfig = {
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { Component, inject, Injector, OnInit } from '@angular/core';
import { runInInjectionContext } from '@angular/core';
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
import { ChatComponent } from '@cacheplane/chat';
import type { BaseMessage } from '@langchain/core/messages';
@@ -113,7 +113,7 @@ export class AppComponent implements OnInit {
- [ ] **Step 3: Create main.ts and package.json**
-Standard Angular bootstrap + package.json with peer deps on `@cacheplane/chat` and `@cacheplane/angular`.
+Standard Angular bootstrap + package.json with peer deps on `@cacheplane/chat` and `@cacheplane/langgraph`.
- [ ] **Step 4: Verify example builds**
diff --git a/docs/superpowers/plans/2026-04-04-deep-agents-examples.md b/docs/superpowers/plans/2026-04-04-deep-agents-examples.md
index b6a2bc838..aa942d72a 100644
--- a/docs/superpowers/plans/2026-04-04-deep-agents-examples.md
+++ b/docs/superpowers/plans/2026-04-04-deep-agents-examples.md
@@ -6,7 +6,7 @@
**Architecture:** Each capability follows the LangGraph example pattern but with richer sidebar content. The Python graphs use LangGraph tool-calling patterns (agents that invoke tools). The Angular components leverage `stream.toolCalls()`, `stream.toolProgress()`, and `stream.subagents()` signals for real-time agent activity visualization.
-**Tech Stack:** Angular 21, `@cacheplane/angular`, `@cacheplane/chat`, LangGraph (Python), Playwright
+**Tech Stack:** Angular 21, `@cacheplane/langgraph`, `@cacheplane/chat`, LangGraph (Python), Playwright
---
diff --git a/docs/superpowers/plans/2026-04-04-docs-comprehensive-overhaul.md b/docs/superpowers/plans/2026-04-04-docs-comprehensive-overhaul.md
index 750904dfa..f4fe71008 100644
--- a/docs/superpowers/plans/2026-04-04-docs-comprehensive-overhaul.md
+++ b/docs/superpowers/plans/2026-04-04-docs-comprehensive-overhaul.md
@@ -18,11 +18,11 @@
- [ ] **Step 1: Fix import path inconsistency**
-Search all MDX and TSX files for `@ngxp/angular` and `@angular/angular`. Replace ALL with `@cacheplane/angular`.
+Search all MDX and TSX files for `@ngxp/angular` and `@angular/angular`. Replace ALL with `@cacheplane/langgraph`.
Run: `grep -rn "@ngxp/angular\|@angular/angular" apps/website/content/docs-v2/ apps/website/src/`
-Replace all occurrences with `@cacheplane/angular`.
+Replace all occurrences with `@cacheplane/langgraph`.
- [ ] **Step 2: Fix API method inconsistency**
@@ -158,7 +158,7 @@ New content needed:
### Task 9: Polish `guides/streaming.mdx` (206 lines — fix issues)
Fix:
-- Import path: `@angular/angular` → `@cacheplane/angular`
+- Import path: `@angular/angular` → `@cacheplane/langgraph`
- `.stream()` → `.submit()`
- `'streaming'` status → `'loading'`
- Add Python agent showing `stream_mode` configuration
@@ -203,7 +203,7 @@ Fix:
### Task 14: Expand 4 API Reference Pages
-Fix import path `@ngxp/angular` → `@cacheplane/angular` in all 4.
+Fix import path `@ngxp/angular` → `@cacheplane/langgraph` in all 4.
Add "What's Next" CardGroup to all 4.
Expand intros with more context about when/why to use each.
@@ -224,7 +224,7 @@ Total: 15 tasks, ~14 files rewritten.
- [ ] Python LangGraph code showing the agent/server pattern
- [ ] Angular agent code showing the frontend consumption
- [ ] Both paired together to tell the product story
-- [ ] All imports use `@cacheplane/angular`
+- [ ] All imports use `@cacheplane/langgraph`
- [ ] All Tab components use `` syntax
- [ ] `ChangeDetectionStrategy.OnPush` in component examples
- [ ] At least 2 Callouts (tip, info, or warning)
diff --git a/docs/superpowers/plans/2026-04-04-docs-content-authoring.md b/docs/superpowers/plans/2026-04-04-docs-content-authoring.md
index 42f8fadc9..8a1863855 100644
--- a/docs/superpowers/plans/2026-04-04-docs-content-authoring.md
+++ b/docs/superpowers/plans/2026-04-04-docs-content-authoring.md
@@ -33,7 +33,7 @@ Angular 20+ project with Node.js 18+. If you need setup help, see the [Installat
## 1. Install
```bash
-npm install @cacheplane/angular
+npm install @cacheplane/langgraph
```
## 2. Configure the provider
@@ -42,7 +42,7 @@ Add `provideAgent()` to your application config with your LangGraph Platform URL
```typescript
// app.config.ts
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
export const appConfig: ApplicationConfig = {
providers: [
@@ -63,7 +63,7 @@ Use `agent()` in a component field initializer. Every property on the returned r
```typescript
// chat.component.ts
import { Component, signal, computed } from '@angular/core';
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
import type { BaseMessage } from '@langchain/core/messages';
@Component({
@@ -192,7 +192,7 @@ A running LangGraph agent accessible via HTTP. Can be local (langgraph dev) or d
## Install the package
```bash
-npm install @cacheplane/angular
+npm install @cacheplane/langgraph
```
This installs the library and its peer dependencies including `@langchain/langgraph-sdk`.
@@ -204,7 +204,7 @@ Add `provideAgent()` to your application configuration. This sets global default
```typescript
// app.config.ts
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
export const appConfig: ApplicationConfig = {
providers: [
@@ -252,7 +252,7 @@ provideAgent({
Create a minimal test to verify the setup works:
```typescript
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
// In a component
const test = agent({
@@ -759,8 +759,8 @@ Create a MockAgentTransport with scripted events and pass it to agent.
```typescript
import { TestBed } from '@angular/core/testing';
-import { MockAgentTransport } from '@cacheplane/angular';
-import type { StreamEvent } from '@cacheplane/angular';
+import { MockAgentTransport } from '@cacheplane/langgraph';
+import type { StreamEvent } from '@cacheplane/langgraph';
describe('ChatComponent', () => {
it('should display agent messages', () => {
diff --git a/docs/superpowers/plans/2026-04-04-langgraph-examples.md b/docs/superpowers/plans/2026-04-04-langgraph-examples.md
index be6b886ad..88f15eaaa 100644
--- a/docs/superpowers/plans/2026-04-04-langgraph-examples.md
+++ b/docs/superpowers/plans/2026-04-04-langgraph-examples.md
@@ -6,7 +6,7 @@
**Architecture:** Each capability follows the established streaming example pattern: Angular standalone component using `agent()`, Python LangGraph `StateGraph`, tutorial guide.md with component tags, Playwright e2e tests. The `@cacheplane/chat` library extracts the shared chat UI. All capabilities register in `route-resolution.ts` for cockpit rendering.
-**Tech Stack:** Angular 21, `@cacheplane/angular`, `@cacheplane/chat` (new), LangGraph (Python), Shiki, Playwright, Vitest
+**Tech Stack:** Angular 21, `@cacheplane/langgraph`, `@cacheplane/chat` (new), LangGraph (Python), Shiki, Playwright, Vitest
---
@@ -295,7 +295,7 @@ This is the first full example after Streaming. It demonstrates `stream.switchTh
#### Angular app: `cockpit/langgraph/persistence/angular/`
- `project.json` — same pattern as streaming, port 4301
-- `package.json` — deps: `@cacheplane/angular`, `@cacheplane/chat`, `@langchain/core`, `@langchain/langgraph-sdk`
+- `package.json` — deps: `@cacheplane/langgraph`, `@cacheplane/chat`, `@langchain/core`, `@langchain/langgraph-sdk`
- `tsconfig.json`, `tsconfig.app.json` — same as streaming
- `proxy.conf.json` — proxy /api to localhost:8124
- `src/index.html`, `src/main.ts`, `src/styles.css` — same pattern
diff --git a/docs/superpowers/plans/2026-04-05-chat-ui-redesign.md b/docs/superpowers/plans/2026-04-05-chat-ui-redesign.md
index 2e9ebf127..2529cff89 100644
--- a/docs/superpowers/plans/2026-04-05-chat-ui-redesign.md
+++ b/docs/superpowers/plans/2026-04-05-chat-ui-redesign.md
@@ -216,7 +216,7 @@ import {
output,
ChangeDetectionStrategy,
} from '@angular/core';
-import type { AgentRef } from '@cacheplane/angular';
+import type { AgentRef } from '@cacheplane/langgraph';
import { ChatMessagesComponent } from '../../primitives/chat-messages/chat-messages.component';
import { MessageTemplateDirective } from '../../primitives/chat-messages/message-template.directive';
import { ChatInputComponent } from '../../primitives/chat-input/chat-input.component';
diff --git a/docs/superpowers/plans/2026-04-05-cockpit-examples-chat-integration.md b/docs/superpowers/plans/2026-04-05-cockpit-examples-chat-integration.md
index 231903c0e..42aa3bb1f 100644
--- a/docs/superpowers/plans/2026-04-05-cockpit-examples-chat-integration.md
+++ b/docs/superpowers/plans/2026-04-05-cockpit-examples-chat-integration.md
@@ -6,7 +6,7 @@
**Architecture:** Each example follows the streaming reference pattern: standalone Angular app with `bootstrapApplication()`, `provideAgent()` + `provideChat()`, Angular CLI build/serve targets, proxy to LangGraph backend. LangGraph examples use ``, deep-agents examples use ``.
-**Tech Stack:** Angular 21, `@cacheplane/chat`, `@cacheplane/angular`, `@angular-devkit/build-angular`
+**Tech Stack:** Angular 21, `@cacheplane/chat`, `@cacheplane/langgraph`, `@angular-devkit/build-angular`
**Spec:** `docs/superpowers/specs/2026-04-05-cockpit-examples-chat-integration.md`
@@ -64,7 +64,7 @@ Each component follows this template (replace `{Topic}`, `{topic}`, `{selector}`
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { Component } from '@angular/core';
import { ChatComponent } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
import { environment } from '../environments/environment';
@Component({
@@ -88,7 +88,7 @@ Where each example uses its existing environment config keys (e.g., `environment
```typescript
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { environment } from '../environments/environment';
diff --git a/docs/superpowers/plans/2026-04-05-streaming-example-chat-integration.md b/docs/superpowers/plans/2026-04-05-streaming-example-chat-integration.md
index 5d8aa6500..f0b626c03 100644
--- a/docs/superpowers/plans/2026-04-05-streaming-example-chat-integration.md
+++ b/docs/superpowers/plans/2026-04-05-streaming-example-chat-integration.md
@@ -2,11 +2,11 @@
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
-**Goal:** Wire the cockpit `langgraph/streaming/angular` example to correctly consume `@cacheplane/chat` and `@cacheplane/angular`, making it buildable and serveable as a standalone Angular app against a real LangGraph backend.
+**Goal:** Wire the cockpit `langgraph/streaming/angular` example to correctly consume `@cacheplane/chat` and `@cacheplane/langgraph`, making it buildable and serveable as a standalone Angular app against a real LangGraph backend.
**Architecture:** Standalone Angular app bootstrapped with `bootstrapApplication()`. Uses `provideAgent()` for global API URL, `provideChat()` for chat config. `StreamingComponent` creates a `agent()` ref and passes it to ``. Proxied to LangGraph dev server on port 8123 via `/api`.
-**Tech Stack:** Angular 21, `@cacheplane/chat`, `@cacheplane/angular`, `@angular-devkit/build-angular`, Tailwind CSS
+**Tech Stack:** Angular 21, `@cacheplane/chat`, `@cacheplane/langgraph`, `@angular-devkit/build-angular`, Tailwind CSS
---
@@ -81,7 +81,7 @@ The component must use `chat-ui` selector (the actual ChatComponent selector) wi
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { Component } from '@angular/core';
import { ChatComponent } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
import { environment } from '../environments/environment';
/**
@@ -129,7 +129,7 @@ git commit -m "feat(cockpit): rewrite streaming component with correct chat-ui A
```typescript
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { environment } from '../environments/environment';
diff --git a/docs/superpowers/plans/2026-04-06-chat-polish.md b/docs/superpowers/plans/2026-04-06-chat-polish.md
index bcdd613a6..dbdb4de6e 100644
--- a/docs/superpowers/plans/2026-04-06-chat-polish.md
+++ b/docs/superpowers/plans/2026-04-06-chat-polish.md
@@ -321,7 +321,7 @@ import {
ViewEncapsulation,
} from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
-import type { AgentRef } from '@cacheplane/angular';
+import type { AgentRef } from '@cacheplane/langgraph';
import { ChatMessagesComponent } from '../../primitives/chat-messages/chat-messages.component';
import { MessageTemplateDirective } from '../../primitives/chat-messages/message-template.directive';
import { ChatInputComponent } from '../../primitives/chat-input/chat-input.component';
@@ -655,7 +655,7 @@ import {
ChangeDetectionStrategy,
} from '@angular/core';
import { FormsModule } from '@angular/forms';
-import type { AgentRef } from '@cacheplane/angular';
+import type { AgentRef } from '@cacheplane/langgraph';
import { ICON_SEND } from '../../styles/chat-icons';
export function submitMessage(
@@ -761,7 +761,7 @@ import {
input,
ChangeDetectionStrategy,
} from '@angular/core';
-import type { AgentRef } from '@cacheplane/angular';
+import type { AgentRef } from '@cacheplane/langgraph';
export function isTyping(ref: AgentRef): boolean {
return ref.isLoading();
@@ -823,7 +823,7 @@ import {
input,
ChangeDetectionStrategy,
} from '@angular/core';
-import type { AgentRef } from '@cacheplane/angular';
+import type { AgentRef } from '@cacheplane/langgraph';
export function extractErrorMessage(error: unknown): string | null {
if (!error) return null;
diff --git a/docs/superpowers/plans/2026-04-06-cockpit-examples-validation.md b/docs/superpowers/plans/2026-04-06-cockpit-examples-validation.md
index e6cf5ed91..6a50ad8e4 100644
--- a/docs/superpowers/plans/2026-04-06-cockpit-examples-validation.md
+++ b/docs/superpowers/plans/2026-04-06-cockpit-examples-validation.md
@@ -6,7 +6,7 @@
**Architecture:** Each example follows the pattern: `agent()` → `` + custom sidebar derived from `stream.value()` or `stream.messages()`. Sidebars are built directly in each example's component using Tailwind classes and the chat theme CSS vars. No new library components needed — the sidebars are example-specific UI, not reusable primitives.
-**Tech Stack:** Angular 20+, `@cacheplane/chat`, `@cacheplane/angular`, Tailwind CSS v4
+**Tech Stack:** Angular 20+, `@cacheplane/chat`, `@cacheplane/langgraph`, Tailwind CSS v4
**Parallelism:** Tasks 1-4 (LangGraph examples) are independent. Tasks 5-8 (Deep Agent examples) are independent. All can run in parallel within their group.
@@ -66,7 +66,7 @@ template: `
Key rules:
- Import `ChatComponent` from `@cacheplane/chat`
-- Use `agent()` from `@cacheplane/angular`
+- Use `agent()` from `@cacheplane/langgraph`
- Derive sidebar state with `computed()` from `stream.value()` or `stream.messages()`
- Use Tailwind + chat theme CSS vars for styling
- The `` component handles all message rendering, input, typing, errors internally
@@ -91,7 +91,7 @@ Replace the component with a layout that has chat + thread sidebar:
```typescript
import { Component, signal, computed } from '@angular/core';
import { ChatComponent } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
import { environment } from '../environments/environment';
interface ThreadEntry {
@@ -209,7 +209,7 @@ Read `cockpit/langgraph/time-travel/angular/src/app/time-travel.component.ts`.
```typescript
import { Component, computed } from '@angular/core';
import { ChatComponent } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
import { environment } from '../environments/environment';
@Component({
@@ -320,7 +320,7 @@ Read `cockpit/langgraph/durable-execution/angular/src/app/durable-execution.comp
```typescript
import { Component, computed } from '@angular/core';
import { ChatComponent } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
import { environment } from '../environments/environment';
const PIPELINE_STEPS = ['analyze', 'plan', 'generate'] as const;
@@ -429,7 +429,7 @@ Read `cockpit/deep-agents/planning/angular/src/app/planning.component.ts`.
```typescript
import { Component, computed } from '@angular/core';
import { ChatComponent } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
import { environment } from '../environments/environment';
interface PlanStep {
@@ -527,7 +527,7 @@ Derive file operations from `stream.messages()` by filtering for tool call messa
```typescript
import { Component, computed } from '@angular/core';
import { ChatComponent } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
import { environment } from '../environments/environment';
interface FileOp {
@@ -635,7 +635,7 @@ Read `cockpit/deep-agents/subagents/angular/src/app/subagents.component.ts`.
```typescript
import { Component, computed } from '@angular/core';
import { ChatComponent } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
import { environment } from '../environments/environment';
interface Delegation {
@@ -737,7 +737,7 @@ Same pattern as the LangGraph memory example but using `agent_memory` state fiel
```typescript
import { Component, computed } from '@angular/core';
import { ChatComponent } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
import { environment } from '../environments/environment';
@Component({
@@ -814,7 +814,7 @@ Read `cockpit/deep-agents/skills/angular/src/app/skills.component.ts`.
```typescript
import { Component, computed } from '@angular/core';
import { ChatComponent } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
import { environment } from '../environments/environment';
interface SkillInvocation {
@@ -919,7 +919,7 @@ Read `cockpit/deep-agents/sandboxes/angular/src/app/sandboxes.component.ts`.
```typescript
import { Component, computed } from '@angular/core';
import { ChatComponent } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
import { environment } from '../environments/environment';
interface CodeExecution {
diff --git a/docs/superpowers/plans/2026-04-06-website-audit-mobile-design.md b/docs/superpowers/plans/2026-04-06-website-audit-mobile-design.md
index 93bb38484..3168ffe4e 100644
--- a/docs/superpowers/plans/2026-04-06-website-audit-mobile-design.md
+++ b/docs/superpowers/plans/2026-04-06-website-audit-mobile-design.md
@@ -302,7 +302,7 @@ import { tokens } from '../../../lib/design-tokens';
const BADGES = [
{ icon: '★', label: 'GitHub Stars', value: 'Open Source' },
- { icon: '↓', label: 'npm', value: '@cacheplane/angular' },
+ { icon: '↓', label: 'npm', value: '@cacheplane/langgraph' },
{ icon: '⚖', label: 'License', value: 'Source Available' },
];
diff --git a/docs/superpowers/plans/2026-04-07-generative-ui-views.md b/docs/superpowers/plans/2026-04-07-generative-ui-views.md
index deb3698b5..6f73efa81 100644
--- a/docs/superpowers/plans/2026-04-07-generative-ui-views.md
+++ b/docs/superpowers/plans/2026-04-07-generative-ui-views.md
@@ -548,7 +548,7 @@ export class CheckboxRowComponent {
import { Component } from '@angular/core';
import { ChatComponent, views } from '@cacheplane/chat';
import { signalStateStore } from '@cacheplane/render';
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
import { environment } from '../environments/environment';
import { PlanChecklistComponent } from './views/plan-checklist.component';
import { CheckboxRowComponent } from './views/checkbox-row.component';
diff --git a/docs/superpowers/plans/2026-04-07-views-examples-docs.md b/docs/superpowers/plans/2026-04-07-views-examples-docs.md
index f43ddf093..128027849 100644
--- a/docs/superpowers/plans/2026-04-07-views-examples-docs.md
+++ b/docs/superpowers/plans/2026-04-07-views-examples-docs.md
@@ -374,7 +374,7 @@ Views are Angular components that the agent can render inline in the chat. Regis
```typescript
import { views } from '@cacheplane/render';
import { ChatComponent } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
const ui = views({
'plan-checklist': PlanChecklistComponent,
diff --git a/docs/superpowers/plans/2026-04-08-generative-ui-spike.md b/docs/superpowers/plans/2026-04-08-generative-ui-spike.md
index d05fde8ef..9746a7877 100644
--- a/docs/superpowers/plans/2026-04-08-generative-ui-spike.md
+++ b/docs/superpowers/plans/2026-04-08-generative-ui-spike.md
@@ -463,7 +463,7 @@ Create `cockpit/langgraph/generative-ui/angular/src/app/generative-ui.component.
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { Component } from '@angular/core';
import { ChatComponent, views } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
import { environment } from '../environments/environment';
import { WeatherCardComponent } from './views/weather-card.component';
import { StatCardComponent } from './views/stat-card.component';
@@ -498,7 +498,7 @@ Create `cockpit/langgraph/generative-ui/angular/src/app/app.config.ts`:
```typescript
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { environment } from '../environments/environment';
@@ -619,7 +619,7 @@ Create `cockpit/langgraph/generative-ui/angular/package.json`:
"peerDependencies": {
"@cacheplane/chat": "^0.0.1",
"@cacheplane/render": "^0.0.1",
- "@cacheplane/angular": "^0.0.1",
+ "@cacheplane/langgraph": "^0.0.1",
"@json-render/core": "^0.16.0",
"@langchain/langgraph-sdk": "^0.0.36"
},
diff --git a/docs/superpowers/plans/2026-04-08-streaming-generative-ui-docs.md b/docs/superpowers/plans/2026-04-08-streaming-generative-ui-docs.md
index 4821ff2f3..0d0c11728 100644
--- a/docs/superpowers/plans/2026-04-08-streaming-generative-ui-docs.md
+++ b/docs/superpowers/plans/2026-04-08-streaming-generative-ui-docs.md
@@ -186,7 +186,7 @@ Pass a `ViewRegistry` via the `[views]` input on `ChatComponent`:
```typescript
import { Component, signal } from '@angular/core';
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
import { ChatComponent, views } from '@cacheplane/chat';
import type { BaseMessage } from '@langchain/core/messages';
import { WeatherCardComponent } from './weather-card.component';
@@ -675,7 +675,7 @@ The full table should be:
```
| Input | Type | Default | Description |
|-------|------|---------|-------------|
-| `ref` | `AgentRef` | **Required** | The agent ref providing streaming state. Created by `agent()` from `@cacheplane/angular`. |
+| `ref` | `AgentRef` | **Required** | The agent ref providing streaming state. Created by `agent()` from `@cacheplane/langgraph`. |
| `views` | `ViewRegistry \| undefined` | `undefined` | View registry for generative UI. Maps spec type names to Angular components. Created with `views()` from `@cacheplane/chat`. |
| `store` | `StateStore \| undefined` | `undefined` | Optional state store for interactive generative UI specs. |
| `threads` | `Thread[]` | `[]` | List of threads to display in the sidebar. Each thread must have an `id` property. |
@@ -793,7 +793,7 @@ Update the "Application-Wide Configuration" example: remove `createAngularRegist
```typescript
// app.config.ts
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
export const appConfig: ApplicationConfig = {
diff --git a/docs/superpowers/plans/2026-04-08-streaming-generative-ui.md b/docs/superpowers/plans/2026-04-08-streaming-generative-ui.md
index 4ca81ba67..c93ae91a3 100644
--- a/docs/superpowers/plans/2026-04-08-streaming-generative-ui.md
+++ b/docs/superpowers/plans/2026-04-08-streaming-generative-ui.md
@@ -1863,7 +1863,7 @@ git commit -m "feat(chat): add ContentClassifier for streaming content type dete
- Modify: `libs/chat/src/lib/compositions/chat/chat.component.spec.ts`
- Modify: `libs/chat/src/public-api.ts`
-**Context:** The current `ChatComponent` uses `AgentRef` (from `@cacheplane/angular`), has `views` input of type `ViewRegistry`, and `store` input of type `StateStore`. The AI message template uses `flex gap-3` with inline avatar (ChatGPT pattern, no "Assistant" label). `ChatGenerativeUiComponent` takes `AngularRegistry` — use `toRenderRegistry()` to convert from `ViewRegistry`.
+**Context:** The current `ChatComponent` uses `AgentRef` (from `@cacheplane/langgraph`), has `views` input of type `ViewRegistry`, and `store` input of type `StateStore`. The AI message template uses `flex gap-3` with inline avatar (ChatGPT pattern, no "Assistant" label). `ChatGenerativeUiComponent` takes `AngularRegistry` — use `toRenderRegistry()` to convert from `ViewRegistry`.
- [ ] **Step 1: Write failing tests for classified rendering**
diff --git a/docs/superpowers/plans/2026-04-09-a2ui-cockpit.md b/docs/superpowers/plans/2026-04-09-a2ui-cockpit.md
index 32723b37e..86346b9f4 100644
--- a/docs/superpowers/plans/2026-04-09-a2ui-cockpit.md
+++ b/docs/superpowers/plans/2026-04-09-a2ui-cockpit.md
@@ -6,7 +6,7 @@
**Architecture:** Modify `ChatComponent.onA2uiEvent()` to auto-route `a2ui:event` actions via `this.ref().submit()`. Then scaffold a new `cockpit/chat/a2ui/` example with Angular app (using `a2uiBasicCatalog()`) and Python LangGraph agent that emits A2UI JSONL for a contact form.
-**Tech Stack:** Angular 20+, `@cacheplane/angular`, `@cacheplane/chat`, `@cacheplane/a2ui`, LangGraph Python, Vitest, Playwright
+**Tech Stack:** Angular 20+, `@cacheplane/langgraph`, `@cacheplane/chat`, `@cacheplane/a2ui`, LangGraph Python, Vitest, Playwright
---
@@ -261,7 +261,7 @@ export const environment = {
```typescript
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { ApplicationConfig } from '@angular/core';
-import { provideAgent } from '@cacheplane/angular';
+import { provideAgent } from '@cacheplane/langgraph';
import { provideChat } from '@cacheplane/chat';
import { environment } from '../environments/environment';
@@ -279,7 +279,7 @@ export const appConfig: ApplicationConfig = {
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
import { Component } from '@angular/core';
import { ChatComponent, a2uiBasicCatalog } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
import { environment } from '../environments/environment';
@Component({
@@ -636,7 +636,7 @@ Import `a2uiBasicCatalog()` and pass it via the `[views]` input:
```typescript
import { ChatComponent, a2uiBasicCatalog } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
@Component({
selector: 'app-a2ui',
@@ -828,7 +828,7 @@ or log events without intercepting the routing.
```typescript
import { ChatComponent, a2uiBasicCatalog } from '@cacheplane/chat';
-import { agent } from '@cacheplane/angular';
+import { agent } from '@cacheplane/langgraph';
@Component({
template: ``,
diff --git a/docs/superpowers/plans/2026-04-09-library-landing-pages.md b/docs/superpowers/plans/2026-04-09-library-landing-pages.md
index daaab52a8..996c30f57 100644
--- a/docs/superpowers/plans/2026-04-09-library-landing-pages.md
+++ b/docs/superpowers/plans/2026-04-09-library-landing-pages.md
@@ -29,7 +29,7 @@ const LIBRARIES = [
{
id: 'angular',
tag: 'Agent',
- pkg: '@cacheplane/angular',
+ pkg: '@cacheplane/langgraph',
color: tokens.colors.accent,
rgb: '0,64,144',
oneLiner: 'Signal-native streaming for LangGraph agents',
@@ -466,7 +466,7 @@ import { AngularFooterCTA } from '../../components/landing/angular/AngularFooter
import { tokens } from '@cacheplane/design-tokens';
export const metadata = {
- title: '@cacheplane/angular — Agent Streaming for Angular',
+ title: '@cacheplane/langgraph — Agent Streaming for Angular',
description: 'Ship LangGraph agents in Angular. Signal-native streaming, thread persistence, interrupts, and deterministic testing.',
};
@@ -507,7 +507,7 @@ export function AngularHero() {
fontFamily: "'JetBrains Mono', monospace", fontSize: 11, letterSpacing: '0.08em',
color: tokens.colors.accent, textTransform: 'uppercase', display: 'inline-block', marginBottom: '1.5rem',
}}>
- @cacheplane/angular
+ @cacheplane/langgraph
@@ -616,7 +616,7 @@ export function AngularProblemSolution() {
fontSize: '0.58rem', fontWeight: 700, textTransform: 'uppercase', letterSpacing: '0.07em',
padding: '2px 9px', borderRadius: 5, color: '#fff', background: '#b71c1c', marginBottom: 16,
}}>
- Without @cacheplane/angular
+ Without @cacheplane/langgraph
- With @cacheplane/angular
+ With @cacheplane/langgraph
chat.isStreaming(); // Signal
chat.interrupt(); // Signal`;
-const SNIPPET_2 = `import { provideAgent } from '@cacheplane/angular';
+const SNIPPET_2 = `import { provideAgent } from '@cacheplane/langgraph';
provideAgent({
graphId: 'my-agent',
@@ -894,7 +894,7 @@ export function AngularComparison() {
fontSize: 'clamp(26px,3.5vw,42px)', fontWeight: 800, lineHeight: 1.1,
color: tokens.colors.textPrimary,
}}>
- LangGraph Angular SDK vs @cacheplane/angular
+ LangGraph Angular SDK vs @cacheplane/langgraph
@@ -914,7 +914,7 @@ export function AngularComparison() {
display: 'grid', gridTemplateColumns: '1fr 1fr 1fr',
background: 'rgba(255,255,255,.3)', borderBottom: `1px solid ${tokens.glass.border}`, padding: '14px 24px',
}}>
- {['Capability', 'LangGraph Angular SDK', '@cacheplane/angular'].map((h, i) => (
+ {['Capability', 'LangGraph Angular SDK', '@cacheplane/langgraph'].map((h, i) => (
Guide Follow-up
Did you read Chapter 2 on the agent() API?
-
Chapter 2 covers the agent() API — signal-native streaming, provideAgent(), and reactive state management. It's the fastest way to understand what @cacheplane/angular does differently.
+
Chapter 2 covers the agent() API — signal-native streaming, provideAgent(), and reactive state management. It's the fastest way to understand what @cacheplane/langgraph does differently.
Explore the Docs →
`,
showUnsubscribe: true,
@@ -1531,12 +1531,12 @@ export function dripAngularFollowupHtml(day: number): { subject: string; html: s
if (day === 5) {
return {
- subject: 'LangGraph Angular SDK vs @cacheplane/angular',
+ subject: 'LangGraph Angular SDK vs @cacheplane/langgraph',
html: wrapEmail({
body: `
Comparison
-
LangGraph Angular SDK vs @cacheplane/angular
-
The official LangGraph Angular SDK gives you basic SSE wiring. @cacheplane/angular gives you signal-native streaming, thread persistence, interrupt handling, time travel, DeepAgent support, and deterministic testing — production patterns your team can own.
+
LangGraph Angular SDK vs @cacheplane/langgraph
+
The official LangGraph Angular SDK gives you basic SSE wiring. @cacheplane/langgraph gives you signal-native streaming, thread persistence, interrupt handling, time travel, DeepAgent support, and deterministic testing — production patterns your team can own.
See the Full Comparison →
`,
showUnsubscribe: true,
diff --git a/docs/superpowers/plans/2026-04-10-homepage-narrative-funnel.md b/docs/superpowers/plans/2026-04-10-homepage-narrative-funnel.md
index 8511cdba3..ba737366b 100644
--- a/docs/superpowers/plans/2026-04-10-homepage-narrative-funnel.md
+++ b/docs/superpowers/plans/2026-04-10-homepage-narrative-funnel.md
@@ -211,7 +211,7 @@ const LIBRARIES = [
{
id: 'angular',
tag: 'Agent',
- pkg: '@cacheplane/angular',
+ pkg: '@cacheplane/langgraph',
color: tokens.colors.accent,
rgb: '0,64,144',
headline: 'The reactive bridge to LangGraph',
diff --git a/docs/superpowers/plans/2026-04-13-solutions-landing-pages.md b/docs/superpowers/plans/2026-04-13-solutions-landing-pages.md
index da2775811..279877772 100644
--- a/docs/superpowers/plans/2026-04-13-solutions-landing-pages.md
+++ b/docs/superpowers/plans/2026-04-13-solutions-landing-pages.md
@@ -97,7 +97,7 @@ export const SOLUTIONS: SolutionConfig[] = [
architectureLayers: [
{
library: 'Agent',
- pkg: '@cacheplane/angular',
+ pkg: '@cacheplane/langgraph',
role: 'Signal-native streaming with first-class interrupt support. Every agent action can require human approval before execution. Thread persistence gives you a complete, immutable history of every decision.',
},
{
@@ -146,7 +146,7 @@ export const SOLUTIONS: SolutionConfig[] = [
architectureLayers: [
{
library: 'Agent',
- pkg: '@cacheplane/angular',
+ pkg: '@cacheplane/langgraph',
role: 'Streams query results token-by-token as the LangGraph agent reasons over your data. Thread persistence means users can refine questions without re-running expensive queries.',
},
{
@@ -195,7 +195,7 @@ export const SOLUTIONS: SolutionConfig[] = [
architectureLayers: [
{
library: 'Agent',
- pkg: '@cacheplane/angular',
+ pkg: '@cacheplane/langgraph',
role: 'LangGraph interrupts let the agent pause before sensitive actions — refunds, account changes, escalations. Thread persistence preserves the full conversation across bot-to-human handoffs.',
},
{
diff --git a/docs/superpowers/plans/2026-04-14-landing-page-alignment.md b/docs/superpowers/plans/2026-04-14-landing-page-alignment.md
index 9ffcb485d..228616d84 100644
--- a/docs/superpowers/plans/2026-04-14-landing-page-alignment.md
+++ b/docs/superpowers/plans/2026-04-14-landing-page-alignment.md
@@ -59,7 +59,7 @@ export function AngularHero() {
fontFamily: "'JetBrains Mono', monospace", fontSize: 11, letterSpacing: '0.08em',
color: tokens.colors.accent, textTransform: 'uppercase', display: 'inline-block', marginBottom: '1.5rem',
}}>
- @cacheplane/angular
+ @cacheplane/langgraph
@@ -1037,7 +1037,7 @@ import { tokens } from '@cacheplane/design-tokens';
const SIBLINGS = [
{
tag: 'Agent',
- pkg: '@cacheplane/angular',
+ pkg: '@cacheplane/langgraph',
color: tokens.colors.accent,
rgb: '0,64,144',
headline: 'The reactive bridge to LangGraph',
@@ -1194,7 +1194,7 @@ import { tokens } from '@cacheplane/design-tokens';
const SIBLINGS = [
{
tag: 'Agent',
- pkg: '@cacheplane/angular',
+ pkg: '@cacheplane/langgraph',
color: tokens.colors.accent,
rgb: '0,64,144',
headline: 'The reactive bridge to LangGraph',
diff --git a/docs/superpowers/plans/2026-04-18-release-infrastructure.md b/docs/superpowers/plans/2026-04-18-release-infrastructure.md
index a388431c5..a4a54e2b2 100644
--- a/docs/superpowers/plans/2026-04-18-release-infrastructure.md
+++ b/docs/superpowers/plans/2026-04-18-release-infrastructure.md
@@ -2,7 +2,7 @@
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
-**Goal:** Make `nx release` a one-command release pipeline for `@cacheplane/angular`, `@cacheplane/render`, `@cacheplane/chat` — independent per-package semver, Keep-a-Changelog changelogs, enforced conventional commits, GitHub Actions publish with npm provenance.
+**Goal:** Make `nx release` a one-command release pipeline for `@cacheplane/langgraph`, `@cacheplane/render`, `@cacheplane/chat` — independent per-package semver, Keep-a-Changelog changelogs, enforced conventional commits, GitHub Actions publish with npm provenance.
**Architecture:** Nx Release handles version bumps + changelog generation from conventional commits. Local workflow: developer runs `nx release version` + `nx release changelog` → commits + tags are pushed → GitHub Actions `release.yml` triggers on `
@v*` tag pattern → runs `nx release publish` with npm provenance via OIDC. Commitlint enforces the conventional commit contract via a husky `commit-msg` hook locally and a CI job on PRs. Verdaccio provides a local dry-run smoke test so we catch config errors without burning a version number.
@@ -14,7 +14,7 @@
### In scope
- Nx Release configured for independent per-package versioning of agent / render / chat
-- Tag format: `@v` (e.g., `@cacheplane/angular@v1.0.0`)
+- Tag format: `@v` (e.g., `@cacheplane/langgraph@v1.0.0`)
- `CHANGELOG.md` per library in Keep-a-Changelog format, auto-updated by Nx Release
- Conventional commits enforced locally (husky) and on PRs (GitHub Action)
- GitHub Actions workflow `release.yml` that publishes with `--provenance` via OIDC
@@ -35,7 +35,7 @@
- `.husky/commit-msg` — husky hook for commitlint
- `.github/workflows/release.yml` — new release workflow
- `.github/workflows/commitlint.yml` — PR commitlint CI
-- `libs/agent/CHANGELOG.md` — Keep-a-Changelog seed
+- `libs/langgraph/CHANGELOG.md` — Keep-a-Changelog seed
- `libs/render/CHANGELOG.md` — seed
- `libs/chat/CHANGELOG.md` — seed
- `scripts/verify-release-local.sh` — Verdaccio dry-run smoke
@@ -43,7 +43,7 @@
**Modify:**
- `nx.json` — expand `release` block (projects, version, changelog, tag format)
-- `libs/agent/package.json` — add `publishConfig`
+- `libs/langgraph/package.json` — add `publishConfig`
- `libs/render/package.json` — add `publishConfig`
- `libs/chat/package.json` — add `publishConfig`
- `package.json` — add devDeps (`@commitlint/cli`, `@commitlint/config-conventional`, `husky`) + release scripts + `prepare` hook
@@ -209,16 +209,16 @@ git commit -m "ci(release): enforce conventional commits on PRs"
## Task 3: Seed CHANGELOG.md for each library
**Files:**
-- Create: `libs/agent/CHANGELOG.md`
+- Create: `libs/langgraph/CHANGELOG.md`
- Create: `libs/render/CHANGELOG.md`
- Create: `libs/chat/CHANGELOG.md`
-- [ ] **Step 1: Create `libs/agent/CHANGELOG.md`**
+- [ ] **Step 1: Create `libs/langgraph/CHANGELOG.md`**
```markdown
# Changelog
-All notable changes to `@cacheplane/angular` will be documented in this file.
+All notable changes to `@cacheplane/langgraph` will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
@@ -256,7 +256,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
Run:
```bash
-git add libs/agent/CHANGELOG.md libs/render/CHANGELOG.md libs/chat/CHANGELOG.md
+git add libs/langgraph/CHANGELOG.md libs/render/CHANGELOG.md libs/chat/CHANGELOG.md
git commit -m "docs(release): seed Keep-a-Changelog files for v1 packages"
```
@@ -265,18 +265,18 @@ git commit -m "docs(release): seed Keep-a-Changelog files for v1 packages"
## Task 4: Add `publishConfig` to each library's `package.json`
**Files:**
-- Modify: `libs/agent/package.json`
+- Modify: `libs/langgraph/package.json`
- Modify: `libs/render/package.json`
- Modify: `libs/chat/package.json`
The `publishConfig.provenance` flag tells npm to use the OIDC token from GitHub Actions to sign the published package.
-- [ ] **Step 1: Edit `libs/agent/package.json`**
+- [ ] **Step 1: Edit `libs/langgraph/package.json`**
Add a `publishConfig` key before `peerDependencies`:
```json
{
- "name": "@cacheplane/angular",
+ "name": "@cacheplane/langgraph",
"version": "0.0.1",
"publishConfig": {
"access": "public",
@@ -300,7 +300,7 @@ Add the same `publishConfig` block.
Run:
```bash
-for f in libs/agent/package.json libs/render/package.json libs/chat/package.json; do
+for f in libs/langgraph/package.json libs/render/package.json libs/chat/package.json; do
node -e "JSON.parse(require('fs').readFileSync('$f', 'utf8'))" && echo "$f OK"
done
```
@@ -311,7 +311,7 @@ Expected: three lines of `... OK`.
Run:
```bash
-git add libs/agent/package.json libs/render/package.json libs/chat/package.json
+git add libs/langgraph/package.json libs/render/package.json libs/chat/package.json
git commit -m "feat(release): enable npm provenance for v1 packages"
```
@@ -360,7 +360,7 @@ Replace with:
**Key behaviors:**
- `projectsRelationship: "independent"` — each package versions on its own schedule
-- `releaseTagPattern: "{projectName}@v{version}"` — produces e.g. `agent@v1.0.0`. Note: the Nx project name is `agent` (not `@cacheplane/angular`); the tag uses the project name.
+- `releaseTagPattern: "{projectName}@v{version}"` — produces e.g. `agent@v1.0.0`. Note: the Nx project name is `agent` (not `@cacheplane/langgraph`); the tag uses the project name.
- `conventionalCommits: true` — analyze commits since last tag to determine bump
- `currentVersionResolver: "git-tag"` — reads current version from latest matching tag, falls back to `package.json` on first release
- `projectChangelogs` writes per-library `CHANGELOG.md`; `createRelease: "github"` publishes GitHub Releases
@@ -636,7 +636,7 @@ Create `docs/release-runbook.md`:
```markdown
# Release Runbook
-How to cut a new release of `@cacheplane/angular`, `@cacheplane/render`, or `@cacheplane/chat`.
+How to cut a new release of `@cacheplane/langgraph`, `@cacheplane/render`, or `@cacheplane/chat`.
## Prerequisites
@@ -673,7 +673,7 @@ How to cut a new release of `@cacheplane/angular`, `@cacheplane/render`, or `@ca
git tag --contains HEAD
```
- Expected: one commit per bumped package (e.g., `chore(release): publish @cacheplane/angular@1.0.0`) and matching tags like `agent@v1.0.0`.
+ Expected: one commit per bumped package (e.g., `chore(release): publish @cacheplane/langgraph@1.0.0`) and matching tags like `agent@v1.0.0`.
4. **Push commits + tags:**
@@ -685,7 +685,7 @@ How to cut a new release of `@cacheplane/angular`, `@cacheplane/render`, or `@ca
5. **Verify on npm:**
- - https://www.npmjs.com/package/@cacheplane/angular
+ - https://www.npmjs.com/package/@cacheplane/langgraph
- https://www.npmjs.com/package/@cacheplane/render
- https://www.npmjs.com/package/@cacheplane/chat
@@ -726,7 +726,7 @@ Provide `version-spec` (e.g., `patch`, `1.0.1`) or leave empty to use convention
## Version policy
-- `@cacheplane/angular`, `@cacheplane/render`, `@cacheplane/chat` follow semver independently.
+- `@cacheplane/langgraph`, `@cacheplane/render`, `@cacheplane/chat` follow semver independently.
- Breaking changes to any public export = major bump.
- New exports or non-breaking API additions = minor bump.
- Bug fixes with no API change = patch bump.
diff --git a/docs/superpowers/plans/2026-04-19-license-verification-library.md b/docs/superpowers/plans/2026-04-19-license-verification-library.md
index 69c99d282..b0dd4bafc 100644
--- a/docs/superpowers/plans/2026-04-19-license-verification-library.md
+++ b/docs/superpowers/plans/2026-04-19-license-verification-library.md
@@ -2,7 +2,7 @@
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
-**Goal:** Ship `@cacheplane/licensing` — a pure-TS library that performs offline Ed25519 license verification, surfaces a grace-period + nag UX, and sends non-blocking anonymous telemetry — then wire it into `@cacheplane/angular`, `@cacheplane/render`, and `@cacheplane/chat` so a licensed app initializes silently and an unlicensed app sees a console nudge but still runs.
+**Goal:** Ship `@cacheplane/licensing` — a pure-TS library that performs offline Ed25519 license verification, surfaces a grace-period + nag UX, and sends non-blocking anonymous telemetry — then wire it into `@cacheplane/langgraph`, `@cacheplane/render`, and `@cacheplane/chat` so a licensed app initializes silently and an unlicensed app sees a console nudge but still runs.
**Architecture:** `@cacheplane/licensing` is a framework-agnostic TypeScript library (built with `@nx/js:tsc`, same pattern as `libs/a2ui`) that exposes four seams:
@@ -48,8 +48,8 @@ Each Angular library receives an optional `license` field on its existing config
**Modified Angular libraries** — integrate license check into providers:
-- `libs/agent/src/lib/agent.provider.ts` — add `license?: string` to `AgentConfig`; call `runLicenseCheck` inside `provideAgent`
-- `libs/agent/src/lib/agent.provider.spec.ts` — tests that config is still honored and license check is invoked
+- `libs/langgraph/src/lib/agent.provider.ts` — add `license?: string` to `AgentConfig`; call `runLicenseCheck` inside `provideAgent`
+- `libs/langgraph/src/lib/agent.provider.spec.ts` — tests that config is still honored and license check is invoked
- `libs/render/src/lib/provide-render.ts` — add `license?: string` to `RenderConfig`; call `runLicenseCheck`
- `libs/render/src/lib/render.types.ts` — add `license?: string` on `RenderConfig`
- `libs/render/src/lib/provide-render.spec.ts` — **create**; license check wired
@@ -59,7 +59,7 @@ Each Angular library receives an optional `license` field on its existing config
**Workspace** — wiring:
- `tsconfig.base.json` — add `"@cacheplane/licensing": ["libs/licensing/src/index.ts"]` path alias
-- `libs/agent/package.json` — add `@cacheplane/licensing` to `peerDependencies` with `^0.0.1`
+- `libs/langgraph/package.json` — add `@cacheplane/licensing` to `peerDependencies` with `^0.0.1`
- `libs/render/package.json` — add `@cacheplane/licensing` to `peerDependencies` with `^0.0.1`
- `libs/chat/package.json` — add `@cacheplane/licensing` to `peerDependencies` with `^0.0.1`
- `package.json` — add `@noble/ed25519` to root `dependencies`
@@ -747,26 +747,26 @@ describe('emitNag', () => {
});
it('is silent when status is licensed', () => {
- emitNag({ status: 'licensed' }, { package: '@cacheplane/angular', warn });
+ emitNag({ status: 'licensed' }, { package: '@cacheplane/langgraph', warn });
expect(warn).not.toHaveBeenCalled();
});
it('is silent when status is noncommercial', () => {
- emitNag({ status: 'noncommercial' }, { package: '@cacheplane/angular', warn });
+ emitNag({ status: 'noncommercial' }, { package: '@cacheplane/langgraph', warn });
expect(warn).not.toHaveBeenCalled();
});
it('warns with a stable prefix when status is missing', () => {
- emitNag({ status: 'missing' }, { package: '@cacheplane/angular', warn });
+ emitNag({ status: 'missing' }, { package: '@cacheplane/langgraph', warn });
expect(warn).toHaveBeenCalledTimes(1);
const message = warn.mock.calls[0][0] as string;
expect(message).toContain('[cacheplane]');
- expect(message).toContain('@cacheplane/angular');
+ expect(message).toContain('@cacheplane/langgraph');
expect(message).toContain('cacheplane.dev/pricing');
});
it('warns differently for grace / expired / tampered', () => {
- emitNag({ status: 'grace' }, { package: '@cacheplane/angular', warn });
+ emitNag({ status: 'grace' }, { package: '@cacheplane/langgraph', warn });
emitNag({ status: 'expired' }, { package: '@cacheplane/render', warn });
emitNag({ status: 'tampered' }, { package: '@cacheplane/chat', warn });
expect(warn).toHaveBeenCalledTimes(3);
@@ -776,13 +776,13 @@ describe('emitNag', () => {
});
it('dedupes repeated calls for the same package + status', () => {
- emitNag({ status: 'missing' }, { package: '@cacheplane/angular', warn });
- emitNag({ status: 'missing' }, { package: '@cacheplane/angular', warn });
+ emitNag({ status: 'missing' }, { package: '@cacheplane/langgraph', warn });
+ emitNag({ status: 'missing' }, { package: '@cacheplane/langgraph', warn });
expect(warn).toHaveBeenCalledTimes(1);
});
it('does not dedupe across different packages', () => {
- emitNag({ status: 'missing' }, { package: '@cacheplane/angular', warn });
+ emitNag({ status: 'missing' }, { package: '@cacheplane/langgraph', warn });
emitNag({ status: 'missing' }, { package: '@cacheplane/render', warn });
expect(warn).toHaveBeenCalledTimes(2);
});
@@ -803,7 +803,7 @@ Expected: FAIL — `emitNag is not a function`.
import type { EvaluateResult } from './evaluate-license';
export interface EmitNagOptions {
- /** Fully-qualified npm package name, e.g. "@cacheplane/angular". */
+ /** Fully-qualified npm package name, e.g. "@cacheplane/langgraph". */
package: string;
/** Injected warn channel; defaults to `console.warn`. */
warn?: (message: string) => void;
@@ -896,7 +896,7 @@ describe('createTelemetryClient', () => {
});
await client.send({
- package: '@cacheplane/angular',
+ package: '@cacheplane/langgraph',
version: '1.0.0',
licenseId: 'cus_123',
});
@@ -906,7 +906,7 @@ describe('createTelemetryClient', () => {
expect(url).toBe('https://telemetry.example.com/v1/ping');
expect(init.method).toBe('POST');
const body = JSON.parse(init.body as string);
- expect(body.package).toBe('@cacheplane/angular');
+ expect(body.package).toBe('@cacheplane/langgraph');
expect(body.version).toBe('1.0.0');
expect(body.license_id).toBe('cus_123');
expect(typeof body.anon_instance_id).toBe('string');
@@ -919,8 +919,8 @@ describe('createTelemetryClient', () => {
endpoint: 'https://telemetry.example.com/v1/ping',
fetch: fetchMock,
});
- await client.send({ package: '@cacheplane/angular', version: '1.0.0' });
- await client.send({ package: '@cacheplane/angular', version: '1.0.0' });
+ await client.send({ package: '@cacheplane/langgraph', version: '1.0.0' });
+ await client.send({ package: '@cacheplane/langgraph', version: '1.0.0' });
const id1 = JSON.parse(fetchMock.mock.calls[0][1].body as string).anon_instance_id;
const id2 = JSON.parse(fetchMock.mock.calls[1][1].body as string).anon_instance_id;
@@ -934,7 +934,7 @@ describe('createTelemetryClient', () => {
endpoint: 'https://telemetry.example.com/v1/ping',
fetch: fetchMock,
});
- await client.send({ package: '@cacheplane/angular', version: '1.0.0' });
+ await client.send({ package: '@cacheplane/langgraph', version: '1.0.0' });
expect(fetchMock).not.toHaveBeenCalled();
});
@@ -945,7 +945,7 @@ describe('createTelemetryClient', () => {
endpoint: 'https://telemetry.example.com/v1/ping',
fetch: fetchMock,
});
- await client.send({ package: '@cacheplane/angular', version: '1.0.0' });
+ await client.send({ package: '@cacheplane/langgraph', version: '1.0.0' });
expect(fetchMock).not.toHaveBeenCalled();
});
@@ -956,7 +956,7 @@ describe('createTelemetryClient', () => {
fetch: fetchMock,
});
await expect(
- client.send({ package: '@cacheplane/angular', version: '1.0.0' }),
+ client.send({ package: '@cacheplane/langgraph', version: '1.0.0' }),
).resolves.toBeUndefined();
});
});
@@ -1279,7 +1279,7 @@ describe('runLicenseCheck', () => {
it('does not warn with a valid token and still fires telemetry', async () => {
const status = await runLicenseCheck({
- package: '@cacheplane/angular',
+ package: '@cacheplane/langgraph',
version: '1.0.0',
token: validToken,
publicKey: kp.publicKey,
@@ -1297,7 +1297,7 @@ describe('runLicenseCheck', () => {
it('warns when token is missing', async () => {
const status = await runLicenseCheck({
- package: '@cacheplane/angular',
+ package: '@cacheplane/langgraph',
version: '1.0.0',
publicKey: kp.publicKey,
nowSec: 1_900_000_000,
@@ -1311,7 +1311,7 @@ describe('runLicenseCheck', () => {
it('is idempotent per (package, token) pair', async () => {
await runLicenseCheck({
- package: '@cacheplane/angular',
+ package: '@cacheplane/langgraph',
version: '1.0.0',
token: validToken,
publicKey: kp.publicKey,
@@ -1321,7 +1321,7 @@ describe('runLicenseCheck', () => {
fetch: fetchMock,
});
await runLicenseCheck({
- package: '@cacheplane/angular',
+ package: '@cacheplane/langgraph',
version: '1.0.0',
token: validToken,
publicKey: kp.publicKey,
@@ -1338,7 +1338,7 @@ describe('runLicenseCheck', () => {
it('re-runs when token changes (e.g., after key rotation in the host)', async () => {
const otherToken = await signLicense({ ...BASE, sub: 'cus_xyz' }, kp.privateKey);
await runLicenseCheck({
- package: '@cacheplane/angular',
+ package: '@cacheplane/langgraph',
version: '1.0.0',
token: validToken,
publicKey: kp.publicKey,
@@ -1348,7 +1348,7 @@ describe('runLicenseCheck', () => {
fetch: fetchMock,
});
await runLicenseCheck({
- package: '@cacheplane/angular',
+ package: '@cacheplane/langgraph',
version: '1.0.0',
token: otherToken,
publicKey: kp.publicKey,
@@ -1539,7 +1539,7 @@ Angular framework libraries.
## Status
-Private, pre-1.0. Consumed by `@cacheplane/angular`, `@cacheplane/render`, and
+Private, pre-1.0. Consumed by `@cacheplane/langgraph`, `@cacheplane/render`, and
`@cacheplane/chat`. Not intended as a standalone import.
## Behavior
@@ -1565,17 +1565,17 @@ git commit -m "docs(licensing): add README and shared test fixtures"
---
-## Task 10: Integrate license check into `@cacheplane/angular`
+## Task 10: Integrate license check into `@cacheplane/langgraph`
**Files:**
- Create: `libs/licensing/src/testing.ts`
- Modify: `tsconfig.base.json` (add `@cacheplane/licensing/testing` path)
- Modify: `libs/licensing/tsconfig.lib.json` (exclude `src/testing.ts`)
-- Modify: `libs/agent/tsconfig.json` (remove `baseUrl: "."` override)
-- Modify: `libs/agent/src/test-setup.ts` (scoped sha512 patch)
-- Modify: `libs/agent/src/lib/agent.provider.ts`
-- Modify: `libs/agent/src/lib/agent.provider.spec.ts`
-- Modify: `libs/agent/package.json`
+- Modify: `libs/langgraph/tsconfig.json` (remove `baseUrl: "."` override)
+- Modify: `libs/langgraph/src/test-setup.ts` (scoped sha512 patch)
+- Modify: `libs/langgraph/src/lib/agent.provider.ts`
+- Modify: `libs/langgraph/src/lib/agent.provider.spec.ts`
+- Modify: `libs/langgraph/package.json`
**Guardrails (read before starting):**
@@ -1616,11 +1616,11 @@ In `libs/licensing/tsconfig.lib.json`, add `"src/testing.ts"` to the existing ex
"exclude": ["src/**/*.spec.ts", "src/lib/testing/**", "src/testing.ts"]
```
-- [ ] **Step 1d: Remove the `baseUrl` override from `libs/agent/tsconfig.json`**
+- [ ] **Step 1d: Remove the `baseUrl` override from `libs/langgraph/tsconfig.json`**
-`libs/agent/tsconfig.json` currently sets `"baseUrl": "."`, which shifts path resolution relative to the agent dir and prevents `@cacheplane/licensing` from resolving. Delete that line — the `chat` and `render` tsconfigs don't have it either.
+`libs/langgraph/tsconfig.json` currently sets `"baseUrl": "."`, which shifts path resolution relative to the agent dir and prevents `@cacheplane/licensing` from resolving. Delete that line — the `chat` and `render` tsconfigs don't have it either.
-- [ ] **Step 1e: Patch `sha512Async` in `libs/agent/src/test-setup.ts`**
+- [ ] **Step 1e: Patch `sha512Async` in `libs/langgraph/src/test-setup.ts`**
`@noble/ed25519` defaults to `crypto.subtle.digest('sha-512', ...)`. jsdom's SubtleCrypto rejects TypedArrays from the Node realm with "2nd argument is not instance of ArrayBuffer" (cross-realm instanceof). Scope a Node-crypto replacement to the agent test env only:
@@ -1649,7 +1649,7 @@ getTestBed().initTestEnvironment(
);
```
-- [ ] **Step 2: Replace `libs/agent/src/lib/agent.provider.spec.ts` with the updated test suite**
+- [ ] **Step 2: Replace `libs/langgraph/src/lib/agent.provider.spec.ts` with the updated test suite**
```ts
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
@@ -1729,7 +1729,7 @@ describe('provideAgent', () => {
TestBed.inject(AGENT_CONFIG);
await new Promise((r) => setTimeout(r, 0));
const calls = warn.mock.calls.map((c) => String(c[0]));
- expect(calls.some((m) => m.includes('[cacheplane] @cacheplane/angular'))).toBe(true);
+ expect(calls.some((m) => m.includes('[cacheplane] @cacheplane/langgraph'))).toBe(true);
});
});
```
@@ -1741,7 +1741,7 @@ Expected: FAIL — `license` / `__licensePublicKey` not known properties of `Age
- [ ] **Step 4: Implement provider changes**
-Replace `libs/agent/src/lib/agent.provider.ts` with:
+Replace `libs/langgraph/src/lib/agent.provider.ts` with:
```ts
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
@@ -1749,7 +1749,7 @@ import { InjectionToken, Provider } from '@angular/core';
import { runLicenseCheck, LICENSE_PUBLIC_KEY } from '@cacheplane/licensing';
import { AgentTransport } from './agent.types';
-const PACKAGE_NAME = '@cacheplane/angular';
+const PACKAGE_NAME = '@cacheplane/langgraph';
// Wired up by the release pipeline — imported lazily to avoid a hard build-time
// dependency on package.json.
declare const __CACHEPLANE_AGENT_VERSION__: string | undefined;
@@ -1817,7 +1817,7 @@ export function provideAgent(config: AgentConfig): Provider {
- [ ] **Step 5: Add `@cacheplane/licensing` as a peer dependency**
-Edit `libs/agent/package.json` — add to the `peerDependencies` block:
+Edit `libs/langgraph/package.json` — add to the `peerDependencies` block:
```json
"@cacheplane/licensing": "^0.0.1",
@@ -1828,7 +1828,7 @@ Edit `libs/agent/package.json` — add to the `peerDependencies` block:
Run: `npx nx test agent`
Expected: PASS — all 4 tests green.
-**If tests fail:** stop and report the exact failure to the controller. Do not create a dev private-key fixture, do not alter `keypair.ts`, do not monkeypatch `sha512Async`, do not edit `tsconfig.base.json` or `libs/agent/tsconfig.json`.
+**If tests fail:** stop and report the exact failure to the controller. Do not create a dev private-key fixture, do not alter `keypair.ts`, do not monkeypatch `sha512Async`, do not edit `tsconfig.base.json` or `libs/langgraph/tsconfig.json`.
- [ ] **Step 7: Verify agent still builds**
@@ -1840,9 +1840,9 @@ Expected: build succeeds.
```bash
git add libs/licensing/src/testing.ts libs/licensing/tsconfig.lib.json \
tsconfig.base.json \
- libs/agent/tsconfig.json libs/agent/src/test-setup.ts \
- libs/agent/src/lib/agent.provider.ts libs/agent/src/lib/agent.provider.spec.ts \
- libs/agent/package.json
+ libs/langgraph/tsconfig.json libs/langgraph/src/test-setup.ts \
+ libs/langgraph/src/lib/agent.provider.ts libs/langgraph/src/lib/agent.provider.spec.ts \
+ libs/langgraph/package.json
git commit -m "feat(agent): run license check at provider init"
```
diff --git a/docs/superpowers/plans/2026-04-21-chat-custom-events-interrupt-migration.md b/docs/superpowers/plans/2026-04-21-chat-custom-events-interrupt-migration.md
new file mode 100644
index 000000000..4517e841f
--- /dev/null
+++ b/docs/superpowers/plans/2026-04-21-chat-custom-events-interrupt-migration.md
@@ -0,0 +1,971 @@
+# Chat Custom Events + Interrupt Migration Implementation Plan
+
+> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
+
+**Goal:** Complete the runtime-decoupling by migrating `chat-interrupt` to `ChatAgent` and adding an observable `customEvents$` surface to `ChatAgent`, so the `chat` composition can drop its temporary `langgraphRef` escape hatch — which breaks the `chat ↔ langgraph` circular package dependency.
+
+**Architecture:**
+- `chat-interrupt` is mechanically swapped from `AgentRef` input to `ChatAgent` input, reading `agent.interrupt()` which already exists in the contract.
+- `ChatAgent` gains an optional `customEvents$?: Observable`. `ChatCustomEvent` is a loose-discriminator shape: `{ readonly type: string; readonly [key: string]: unknown }`. This lets AG-UI events pass through natively, a2ui/json-render namespace their own event types, and only requires `toChatAgent` to alias `name → type` when adapting LangGraph's `CustomStreamEvent`.
+- `toChatAgent` converts LangGraph's `Signal` into `Observable` by watching the signal via `effect()` and emitting only newly-appended events through a `Subject`.
+- `chat.component.ts` replaces its `langgraphRef`-based `effect()` with a `takeUntilDestroyed()` subscription on `agent.customEvents$` and deletes the `langgraphRef` input entirely. Once that import is gone, `libs/chat/package.json` can drop its `@cacheplane/langgraph` peer-dep, completing the decoupling.
+
+**Tech Stack:** Angular 20 signals + `rxjs-interop`, RxJS `Subject`/`Observable`, Nx monorepo, Jest, `@langchain/langgraph-sdk`, `@cacheplane/chat`, `@cacheplane/langgraph`.
+
+---
+
+## File Structure
+
+**New files:**
+- `libs/chat/src/lib/agent/chat-custom-event.ts` — `ChatCustomEvent` type definition
+- `libs/chat/src/lib/agent/chat-custom-event.spec.ts` — type/shape tests
+
+**Modified files:**
+- `libs/chat/src/lib/agent/chat-agent.ts` — add `customEvents$?` field
+- `libs/chat/src/lib/agent/index.ts` — export `ChatCustomEvent`
+- `libs/chat/src/lib/testing/mock-chat-agent.ts` — wire optional `customEvents$` option
+- `libs/chat/src/lib/testing/chat-agent-conformance.ts` — conformance check for `customEvents$` when present
+- `libs/chat/src/lib/primitives/chat-interrupt/chat-interrupt.component.ts` — `ref: AgentRef` → `agent: ChatAgent`
+- `libs/chat/src/lib/primitives/chat-interrupt/chat-interrupt.component.spec.ts` — update tests
+- `libs/chat/src/lib/compositions/chat/chat.component.ts` — drop `langgraphRef`, swap effect for subscription
+- `libs/chat/src/lib/compositions/chat/chat.component.spec.ts` — update / add tests as applicable
+- `libs/chat/package.json` — remove `@cacheplane/langgraph` peer-dep
+- `libs/langgraph/src/lib/to-chat-agent.ts` — implement `customEvents$` in adapter
+- `libs/langgraph/src/lib/to-chat-agent.spec.ts` — add tests for `customEvents$`
+- `libs/langgraph/src/lib/to-chat-agent.conformance.spec.ts` — add customEvents$ to fixture if conformance requires it
+
+**Deleted:**
+- None
+
+---
+
+## Task 1: Define `ChatCustomEvent` type and add to contract
+
+**Files:**
+- Create: `libs/chat/src/lib/agent/chat-custom-event.ts`
+- Create: `libs/chat/src/lib/agent/chat-custom-event.spec.ts`
+- Modify: `libs/chat/src/lib/agent/chat-agent.ts`
+- Modify: `libs/chat/src/lib/agent/index.ts`
+
+- [ ] **Step 1: Write failing test for ChatCustomEvent type**
+
+Create `libs/chat/src/lib/agent/chat-custom-event.spec.ts`:
+
+```ts
+// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
+import type { ChatCustomEvent } from './chat-custom-event';
+
+describe('ChatCustomEvent', () => {
+ it('accepts a minimal { type } event', () => {
+ const event: ChatCustomEvent = { type: 'state_update' };
+ expect(event.type).toBe('state_update');
+ });
+
+ it('accepts arbitrary additional fields via index signature', () => {
+ const event: ChatCustomEvent = {
+ type: 'a2ui.surface',
+ surfaceId: 'main',
+ payload: { foo: 'bar' },
+ timestamp: 1234567890,
+ };
+ expect(event['surfaceId']).toBe('main');
+ expect(event['payload']).toEqual({ foo: 'bar' });
+ });
+
+ it('allows AG-UI-shaped events to pass through without remapping', () => {
+ const agUiEvent: ChatCustomEvent = {
+ type: 'TEXT_MESSAGE_START',
+ messageId: 'msg-1',
+ role: 'assistant',
+ };
+ expect(agUiEvent.type).toBe('TEXT_MESSAGE_START');
+ expect(agUiEvent['messageId']).toBe('msg-1');
+ });
+});
+```
+
+- [ ] **Step 2: Run test to verify it fails**
+
+Run: `npx nx test chat --test-path-pattern=chat-custom-event`
+Expected: FAIL with "Cannot find module './chat-custom-event'".
+
+- [ ] **Step 3: Create `ChatCustomEvent` type**
+
+Create `libs/chat/src/lib/agent/chat-custom-event.ts`:
+
+```ts
+// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
+
+/**
+ * Runtime-neutral custom event shape flowing through `ChatAgent.customEvents$`.
+ *
+ * The only required field is `type` — a string discriminator consumers switch
+ * on. All other fields pass through verbatim from the source runtime, which
+ * lets AG-UI, LangGraph, a2ui, and json-render emit their own event shapes
+ * without the core contract owning their union.
+ *
+ * Adapters are responsible for normalising their native shape to include a
+ * `type` field (e.g., `toChatAgent` aliases LangGraph's `name` to `type`).
+ */
+export interface ChatCustomEvent {
+ readonly type: string;
+ readonly [key: string]: unknown;
+}
+```
+
+- [ ] **Step 4: Run test to verify it passes**
+
+Run: `npx nx test chat --test-path-pattern=chat-custom-event`
+Expected: PASS — 3 tests.
+
+- [ ] **Step 5: Add `customEvents$` to `ChatAgent` contract**
+
+Modify `libs/chat/src/lib/agent/chat-agent.ts`. Add import and field:
+
+```ts
+// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
+import type { Signal } from '@angular/core';
+import type { Observable } from 'rxjs';
+import type { ChatMessage } from './chat-message';
+import type { ChatToolCall } from './chat-tool-call';
+import type { ChatStatus } from './chat-status';
+import type { ChatInterrupt } from './chat-interrupt';
+import type { ChatSubagent } from './chat-subagent';
+import type { ChatCustomEvent } from './chat-custom-event';
+import type { ChatSubmitInput, ChatSubmitOptions } from './chat-submit';
+
+/**
+ * Runtime-neutral contract chat primitives consume.
+ *
+ * Implementations are produced by adapters (e.g. `@cacheplane/langgraph`,
+ * `@cacheplane/ag-ui`) or by user code for custom backends.
+ *
+ * `interrupt`, `subagents`, and `customEvents$` are optional: runtimes that
+ * do not support these concepts should leave them undefined, and primitives
+ * that need them check presence and render a neutral fallback when absent.
+ */
+export interface ChatAgent {
+ // Core state
+ messages: Signal;
+ status: Signal;
+ isLoading: Signal;
+ error: Signal;
+ toolCalls: Signal;
+ state: Signal>;
+
+ // Actions
+ submit: (input: ChatSubmitInput, opts?: ChatSubmitOptions) => Promise;
+ stop: () => Promise;
+
+ // Extended (optional; absent when runtime does not support)
+ interrupt?: Signal;
+ subagents?: Signal