From 18c996644b6bf220e17d48f88b51b8cc7cb00a66 Mon Sep 17 00:00:00 2001
From: Brian Love
-
+
Comparison LangGraph Angular SDK vs @cacheplane/langgraph The LangGraph JS SDK gives you a streaming client. @cacheplane/langgraph gives you signal-native state, thread persistence, interrupt flows, and a full test harness — all wired together and optimized for Angular's change detection model. See the full comparison on our product page. LangGraph Angular SDK vs @ngaf/langgraph The LangGraph JS SDK gives you a streaming client. @ngaf/langgraph gives you signal-native state, thread persistence, interrupt flows, and a full test harness — all wired together and optimized for Angular's change detection model. See the full comparison on our product page. The Sprint Tax The sprint tax: why every team rebuilds chat from scratch Most teams spend 2–4 sprints building a chat UI before a single agent feature lands. Streaming state management, optimistic updates, thread history, error recovery — it's the same work every time. @cacheplane/chat eliminates the sprint tax so your team ships features from day one. Most teams spend 2–4 sprints building a chat UI before a single agent feature lands. Streaming state management, optimistic updates, thread history, error recovery — it's the same work every time. @ngaf/chat eliminates the sprint tax so your team ships features from day one. Architecture Why tight coupling between agents and UI kills iteration speed When an agent generates UI directly — raw HTML, string templates, hardcoded component names — every model change breaks the frontend and every UI change breaks the prompt. Decoupling via a declarative spec layer means agents and UI teams can iterate independently. See how @cacheplane/render makes this the default. When an agent generates UI directly — raw HTML, string templates, hardcoded component names — every model change breaks the frontend and every UI change breaks the prompt. Decoupling via a declarative spec layer means agents and UI teams can iterate independently. See how @ngaf/render makes this the default. Ship LangGraph agents in Angular — without building the plumbing 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. The core primitive in `@ngaf/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. `agent()` returns an `AgentRef` object with four signals: 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. 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 `@ngaf/langgraph`'s reactive surface for it give you exactly that, without polling loops or bespoke WebSocket plumbing. 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. `@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: `@ngaf/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 interrupt = agent.interrupt; // Signal const handleApprove = () =>
@@ -221,16 +221,16 @@ 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. 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 `@ngaf/langgraph` exposes the full LangGraph feature surface through a coherent signal-based API. --- 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. 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, `@ngaf/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. --- 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/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. `@ngaf/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. --- 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. --- 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/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. `@ngaf/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. --- LangGraph nodes can emit arbitrary structured events outside the message channel. These are the primitives for generative UI, analytics instrumentation, and intermediate state reporting. Production agent chat UI in days, not sprints Senior Angular engineers who spend three sprints on chat infrastructure are not spending those sprints on agent integration. They are not building the domain-specific tool interfaces, the custom interrupt flows, or the application state management that ties agent output to the rest of the product. Those are the things that will differentiate the application. The scroll behavior will not. `@cacheplane/chat` exists to eliminate the sprint tax. Ship the chat UI on day one—message rendering, streaming, tool call cards, interrupt panels, accessibility, mobile layout, all of it—and spend the sprints on what actually matters: the integration work that is specific to your agent, your domain, and your users. `@ngaf/chat` exists to eliminate the sprint tax. Ship the chat UI on day one—message rendering, streaming, tool call cards, interrupt panels, accessibility, mobile layout, all of it—and spend the sprints on what actually matters: the integration work that is specific to your agent, your domain, and your users. The backend is ready. The chat UI should be too. `@cacheplane/chat` ships two distinct component tiers. The prebuilt tier gives you a production-ready chat interface with a single element. The headless tier gives you behavior and state without a single line of CSS opinion. Your team picks the tier that matches how much control you actually need — not how much you think you might need someday. `@ngaf/chat` ships two distinct component tiers. The prebuilt tier gives you a production-ready chat interface with a single element. The headless tier gives you behavior and state without a single line of CSS opinion. Your team picks the tier that matches how much control you actually need — not how much you think you might need someday. Most teams start with prebuilt and never leave. That is the correct call. --- --- `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. @Component({
selector: 'app-support',
imports: [ChatPrebuiltComponent],
@@ -122,7 +122,7 @@ That is a fully functional streaming chat interface. Message history, input handling, tool call display, and interrupt controls are all included. --- 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. Both tiers consume the `AgentRef` produced by `@ngaf/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. --- A chat interface that looks like it came from a SaaS starter kit is a trust problem. Users notice when a modal, sidebar, or embedded panel breaks the visual contract established by the rest of your product. For enterprise teams, that inconsistency signals a lack of ownership — and in agent-facing tools, ownership matters. This chapter covers how to bring `@cacheplane/chat` fully into your design system without forking component source or writing brittle CSS overrides. A chat interface that looks like it came from a SaaS starter kit is a trust problem. Users notice when a modal, sidebar, or embedded panel breaks the visual contract established by the rest of your product. For enterprise teams, that inconsistency signals a lack of ownership — and in agent-facing tools, ownership matters. This chapter covers how to bring `@ngaf/chat` fully into your design system without forking component source or writing brittle CSS overrides. --- `@cacheplane/chat` exposes all visual decisions as CSS custom properties scoped under the `--cp-` namespace. These are not internal implementation details — they are the public API for visual configuration. Properties are declared on the host element and cascade normally through Shadow DOM boundaries where applicable, giving you a single override surface regardless of where components are mounted in the Angular component tree. `@ngaf/chat` exposes all visual decisions as CSS custom properties scoped under the `--cp-` namespace. These are not internal implementation details — they are the public API for visual configuration. Properties are declared on the host element and cascade normally through Shadow DOM boundaries where applicable, giving you a single override surface regardless of where components are mounted in the Angular component tree. The token surface covers six categories: color (surface, text, border, accent, semantic), typography (family, size scale, weight, line height), spacing (component padding, message gap, input height), shape (border radius at three scale points), motion (transition duration and easing), and elevation (box shadow values). --- If your design system already emits CSS custom properties — through Style Dictionary, Theo, or a Figma Tokens pipeline — mapping to `@cacheplane/chat` is a one-to-one alias operation. Define the mappings in a single stylesheet or Angular style encapsulation block. Avoid hardcoding raw values into `--cp-` properties directly; alias through your own tokens so that upstream design system changes propagate automatically. If your design system already emits CSS custom properties — through Style Dictionary, Theo, or a Figma Tokens pipeline — mapping to `@ngaf/chat` is a one-to-one alias operation. Define the mappings in a single stylesheet or Angular style encapsulation block. Avoid hardcoding raw values into `--cp-` properties directly; alias through your own tokens so that upstream design system changes propagate automatically. --- Font family, size scale, and line height are independently configurable. `--cp-font-family` accepts any valid CSS font stack. Size tokens (`--cp-text-sm`, `--cp-text-base`, `--cp-text-lg`) map to the message body, metadata labels, and heading contexts respectively. If your type scale uses `rem` values derived from a root size override, `@cacheplane/chat` respects document root sizing — no unit conversion required. Font family, size scale, and line height are independently configurable. `--cp-font-family` accepts any valid CSS font stack. Size tokens (`--cp-text-sm`, `--cp-text-base`, `--cp-text-lg`) map to the message body, metadata labels, and heading contexts respectively. If your type scale uses `rem` values derived from a root size override, `@ngaf/chat` respects document root sizing — no unit conversion required. --- Surface tokens (`--cp-surface-base`, `--cp-surface-raised`, `--cp-surface-input`) control background layering. Text tokens handle primary content, secondary metadata, and disabled states. `--cp-accent` drives interactive elements — send buttons, link text, focus rings. Semantic tokens (`--cp-color-error`, `--cp-color-warning`, `--cp-color-success`) control inline status indicators on message delivery states and tool call results. Map these directly to your semantic palette. Ten properties. Full brand alignment. No component source required. --- CSS custom properties cannot retheme structural decisions: message bubble layout, avatar placement geometry, the composition of the input toolbar, or the ordering of action elements. If your design system requires layout-level divergence — for example, a top-mounted input bar or a two-column transcript layout — the token API will not reach that far. That is the correct boundary for dropping to the headless tier, where `@cacheplane/chat/headless` exposes behavior and state without any rendered output, and your team owns the template entirely. Use tokens for brand alignment; use headless for structural ownership. CSS custom properties cannot retheme structural decisions: message bubble layout, avatar placement geometry, the composition of the input toolbar, or the ordering of action elements. If your design system requires layout-level divergence — for example, a top-mounted input bar or a two-column transcript layout — the token API will not reach that far. That is the correct boundary for dropping to the headless tier, where `@ngaf/chat/headless` exposes behavior and state without any rendered output, and your team owns the template entirely. Use tokens for brand alignment; use headless for structural ownership. Text responses have a ceiling. When a financial agent needs to surface a sortable data table or a scheduling agent needs to render an interactive booking form, prose falls short. Generative UI closes that gap by allowing agents to emit structured UI specifications directly into the message stream — specifications that the chat interface resolves into live Angular components. From the chat renderer's perspective, a generative UI message is just another message type. The message stream carries a `type` discriminator — `text`, `tool_call`, `ui_spec`, and so on. When `@cacheplane/chat` encounters a `ui_spec` message, it routes it to the UI renderer instead of the text pipeline. The result is that a data table, approval card, or booking form appears inline between conversational turns, indistinguishable in position from any other message bubble, but rendered as a fully interactive Angular component. From the chat renderer's perspective, a generative UI message is just another message type. The message stream carries a `type` discriminator — `text`, `tool_call`, `ui_spec`, and so on. When `@ngaf/chat` encounters a `ui_spec` message, it routes it to the UI renderer instead of the text pipeline. The result is that a data table, approval card, or booking form appears inline between conversational turns, indistinguishable in position from any other message bubble, but rendered as a fully interactive Angular component. The json-render specification is a JSON-based declarative format for describing UI trees. An agent emits a payload describing component type, props, and children. The chat layer deserializes that payload and resolves each component node against a registry. Because the spec is declarative and serializable, it travels cleanly over SSE or WebSocket streams and requires no client-side code changes when an agent starts emitting new component types — only a registry entry. A2UI extends the base idea with agent-specific primitives that json-render doesn't cover. It introduces first-class concepts for approval flows (a structured action requires explicit user confirmation before the agent proceeds), structured data cards with typed field schemas, and multi-step task UI. Where json-render is a general rendering protocol, A2UI is opinionated about agent interaction patterns. `@cacheplane/chat` supports both specs out of the box, detecting the discriminator on the incoming message and routing accordingly. The rendering layer is handled by `@cacheplane/render`, which owns component resolution, prop binding, and the registry itself. `@cacheplane/chat` delegates all spec rendering to `@cacheplane/render` — the chat library doesn't need to know how components are resolved, only that the renderer accepts a spec and returns a mounted component. This separation keeps the chat layer focused on message orchestration and keeps the rendering logic reusable outside of chat contexts. A2UI extends the base idea with agent-specific primitives that json-render doesn't cover. It introduces first-class concepts for approval flows (a structured action requires explicit user confirmation before the agent proceeds), structured data cards with typed field schemas, and multi-step task UI. Where json-render is a general rendering protocol, A2UI is opinionated about agent interaction patterns. `@ngaf/chat` supports both specs out of the box, detecting the discriminator on the incoming message and routing accordingly. The rendering layer is handled by `@ngaf/render`, which owns component resolution, prop binding, and the registry itself. `@ngaf/chat` delegates all spec rendering to `@ngaf/render` — the chat library doesn't need to know how components are resolved, only that the renderer accepts a spec and returns a mounted component. This separation keeps the chat layer focused on message orchestration and keeps the rendering logic reusable outside of chat contexts. Custom components are registered once and become available to any agent that knows the component identifier. The registry maps string keys to Angular component classes. Any component the agent might emit — a custom chart, a domain-specific form, a confirmation widget — needs a corresponding entry. Any component the agent emits by key is resolved here. Unknown keys fall back to a configurable fallback component rather than throwing. Agents don't emit complete UI specs in a single chunk. They stream JSON patches — RFC 6902 operations that incrementally build the spec as the model generates it. `@cacheplane/chat` applies each patch to the in-progress spec and triggers Angular's change detection cycle. The effect is a component that populates live: table rows appear as the agent reasons through the data, form fields materialize in sequence. This isn't a loading spinner followed by a full render — it's the UI itself arriving progressively, which is both faster to first meaningful paint and more transparent about what the agent is doing. Agents don't emit complete UI specs in a single chunk. They stream JSON patches — RFC 6902 operations that incrementally build the spec as the model generates it. `@ngaf/chat` applies each patch to the in-progress spec and triggers Angular's change detection cycle. The effect is a component that populates live: table rows appear as the agent reasons through the data, form fields materialize in sequence. This isn't a loading spinner followed by a full render — it's the UI itself arriving progressively, which is both faster to first meaningful paint and more transparent about what the agent is doing. Debugging a running agent is fundamentally different from debugging a REST call. There is no single request to inspect in the network tab. The state lives across a stream of discrete events, tool invocations happen inside the graph before responses surface, and interrupt flows depend on timing between the UI and the server-side checkpoint. Standard browser tooling was not built for this. `chat-debug` was. `chat-debug` is a developer overlay built into `@cacheplane/chat`. When active, it renders a resizable panel alongside your chat interface that gives you a live view of four distinct concerns. `chat-debug` is a developer overlay built into `@ngaf/chat`. When active, it renders a resizable panel alongside your chat interface that gives you a live view of four distinct concerns. Raw message state surfaces the full `AIMessage[]` array as it exists in the agent signal at any given moment — not a serialized snapshot, but the live signal value. You can watch content chunks arrive and accumulate during streaming without manually logging signal reads. The streaming event log shows every server-sent event in the order it was received, including event type, timestamp, and raw payload. This is where you catch malformed chunk sequences, unexpected `end` events, and latency gaps between tool execution and the next assistant turn. The tool call state machine tracks each tool invocation through its full lifecycle: `pending`, `executing`, `complete`, or `error`. For each call you see the tool name, the serialized input payload, the output value, and wall-clock execution time. When a tool is slow or returning unexpected output, this panel removes the guesswork. Interrupt state shows the full interrupt payload at the moment the graph pauses, including the checkpoint ID and any structured data the graph passed to the UI. After the user responds, the panel records what was submitted. If your interrupt flow has a bug, the before-and-after diff is right there. Drop `ChatDebugComponent` into any host component that already uses the `@cacheplane/chat` primitives. No providers, no configuration file. In dev mode it activates automatically. Drop `ChatDebugComponent` into any host component that already uses the `@ngaf/chat` primitives. No providers, no configuration file. In dev mode it activates automatically. @Component({
imports: [ChatDebugComponent],
template: `
@@ -236,7 +236,7 @@ Clicking any message in the raw state view expands it into a structured inspector showing message type, role, content blocks, and metadata fields. Streamed messages show their final assembled content alongside a chunk count. Tool call messages link directly to the corresponding entry in the tool call state machine view. The tool call inspector is the most useful surface for backend integration bugs. Input and output payloads are formatted as syntax-highlighted JSON. Execution timing lets you correlate slow tool responses with latency you see in the event log. Agent signals registered through `@cacheplane/chat` appear as named signals in the Angular DevTools component tree. You can inspect `messageStream`, `interruptState`, and `toolCallRegistry` directly in the DevTools panel without instrumentation code. The signal graph reflects live state, so you can pause, inspect, and resume without affecting the stream. Agent signals registered through `@ngaf/chat` appear as named signals in the Angular DevTools component tree. You can inspect `messageStream`, `interruptState`, and `toolCallRegistry` directly in the DevTools panel without instrumentation code. The signal graph reflects live state, so you can pause, inspect, and resume without affecting the stream. `chat-debug` uses a build-time token that resolves to a no-op component in production. The overlay never renders, and tree-shaking removes the debug module entirely from the production bundle. No conditional guards in application code are required. The separation is enforced at the library level. When a stream misbehaves in development, `chat-debug` gives you the full picture in one place. That is its only job, and it does it without adding complexity to your application architecture. Agents that render UI — without coupling to your frontend Computed properties use `{{expression}}` interpolation within prop values. Expressions are evaluated against a runtime context object supplied by the host application. The spec deliberately keeps the expression language minimal — it is not a scripting environment. Google's A2UI spec extends json-render for agent-native patterns. It introduces `intent` nodes, which describe what the agent wants to accomplish rather than prescribing a specific component. A2UI also formalizes `action` bindings — structured event handlers that dispatch typed payloads back to the agent rather than calling arbitrary JavaScript. For teams building bidirectional agent interfaces, A2UI's interaction model is worth adopting alongside the base spec. `@cacheplane/render` implements json-render for Angular via the ` `@ngaf/render` implements json-render for Angular via the ` Static specs describe structure. They fall short the moment your UI needs to reflect derived state — a total calculated from line items, a label that changes based on a flag, a list of cards rendered from an array. For generative UI to be production-ready, the spec itself must support dynamic behavior. `@cacheplane/render` addresses this through `signalStateStore()`, computed properties, and repeat loops — mechanisms that let an agent define reactive UI logic declaratively, without pushing that responsibility into custom component code. Static specs describe structure. They fall short the moment your UI needs to reflect derived state — a total calculated from line items, a label that changes based on a flag, a list of cards rendered from an array. For generative UI to be production-ready, the spec itself must support dynamic behavior. `@ngaf/render` addresses this through `signalStateStore()`, computed properties, and repeat loops — mechanisms that let an agent define reactive UI logic declaratively, without pushing that responsibility into custom component code. `signalStateStore()` creates a Signal-backed state container that both the rendering engine and your Angular components can read from and write to. When an agent generates a spec, it can seed this store with initial values. Components rendered from that spec subscribe to the store automatically — no `@Input()` wiring, no manual change detection. {{ msg.content }}
- @cacheplane/chat
+ @ngaf/chat
@@ -34,7 +34,7 @@
## Install
```bash
-npm install @cacheplane/langgraph
+npm install @ngaf/langgraph
```
**Peer dependencies:** `@angular/core ^20.0.0 || ^21.0.0`, `@langchain/core ^1.1.0`, `@langchain/langgraph-sdk ^1.7.0`, `rxjs ~7.8.0`
@@ -45,7 +45,7 @@ npm install @cacheplane/langgraph
```typescript
import { Component } from '@angular/core';
-import { agent } from '@cacheplane/langgraph';
+import { agent } from '@ngaf/langgraph';
import type { BaseMessage } from '@langchain/core/messages';
@Component({
@@ -134,4 +134,4 @@ That's it. `chat.messages()` is an Angular Signal. Bind it directly in your temp
**MIT** — free for any use. See [`LICENSE`](./LICENSE).
-`@cacheplane/langgraph` and all libraries in this repository are released under the [MIT License](./LICENSE). You are free to use, modify, and distribute them in both commercial and noncommercial projects without restriction.
+`@ngaf/langgraph` and all libraries in this repository are released under the [MIT License](./LICENSE). You are free to use, modify, and distribute them in both commercial and noncommercial projects without restriction.
diff --git a/apps/cockpit/src/app/layout.tsx b/apps/cockpit/src/app/layout.tsx
index e0775a1d7..95cf9d5e9 100644
--- a/apps/cockpit/src/app/layout.tsx
+++ b/apps/cockpit/src/app/layout.tsx
@@ -1,5 +1,5 @@
import type { ReactNode } from 'react';
-import { cssVars } from '@cacheplane/ui-react';
+import { cssVars } from '@ngaf/ui-react';
import './cockpit.css';
export const metadata = {
diff --git a/apps/cockpit/src/components/cockpit-shell.tsx b/apps/cockpit/src/components/cockpit-shell.tsx
index a2d9fa0dd..270b4e330 100644
--- a/apps/cockpit/src/components/cockpit-shell.tsx
+++ b/apps/cockpit/src/components/cockpit-shell.tsx
@@ -1,7 +1,7 @@
'use client';
import React, { useEffect, useState } from 'react';
-import { cockpitManifest } from '@cacheplane/cockpit-registry';
+import { cockpitManifest } from '@ngaf/cockpit-registry';
import type { ContentBundle } from '../lib/content-bundle';
import type { CapabilityPresentation, NavigationProduct } from '../lib/route-resolution';
import { CodeMode } from './code-mode/code-mode';
diff --git a/apps/cockpit/src/components/mobile-nav-overlay.spec.tsx b/apps/cockpit/src/components/mobile-nav-overlay.spec.tsx
index 7808c4252..12d55897f 100644
--- a/apps/cockpit/src/components/mobile-nav-overlay.spec.tsx
+++ b/apps/cockpit/src/components/mobile-nav-overlay.spec.tsx
@@ -1,7 +1,7 @@
import React from 'react';
import { renderToStaticMarkup } from 'react-dom/server';
import { describe, expect, it } from 'vitest';
-import { cockpitManifest } from '@cacheplane/cockpit-registry';
+import { cockpitManifest } from '@ngaf/cockpit-registry';
import { buildNavigationTree } from '../lib/route-resolution';
import { MobileNavOverlay } from './mobile-nav-overlay';
diff --git a/apps/cockpit/src/components/mobile-nav-overlay.tsx b/apps/cockpit/src/components/mobile-nav-overlay.tsx
index f99fe6d70..805740ac8 100644
--- a/apps/cockpit/src/components/mobile-nav-overlay.tsx
+++ b/apps/cockpit/src/components/mobile-nav-overlay.tsx
@@ -1,7 +1,7 @@
'use client';
import React, { useEffect, useState } from 'react';
-import type { CockpitManifestEntry } from '@cacheplane/cockpit-registry';
+import type { CockpitManifestEntry } from '@ngaf/cockpit-registry';
import type { NavigationProduct } from '../lib/route-resolution';
import { toCockpitPath } from '../lib/route-resolution';
import { PRODUCT_LABELS, stripProductPrefix } from '../lib/navigation-labels';
diff --git a/apps/cockpit/src/components/sidebar/cockpit-sidebar.spec.tsx b/apps/cockpit/src/components/sidebar/cockpit-sidebar.spec.tsx
index 4cb5a7812..024226b62 100644
--- a/apps/cockpit/src/components/sidebar/cockpit-sidebar.spec.tsx
+++ b/apps/cockpit/src/components/sidebar/cockpit-sidebar.spec.tsx
@@ -2,7 +2,7 @@ import React from 'react';
import { renderToStaticMarkup } from 'react-dom/server';
import { describe, expect, it } from 'vitest';
import { buildNavigationTree } from '../../lib/route-resolution';
-import { cockpitManifest } from '@cacheplane/cockpit-registry';
+import { cockpitManifest } from '@ngaf/cockpit-registry';
import { CockpitSidebar } from './cockpit-sidebar';
describe('CockpitSidebar', () => {
diff --git a/apps/cockpit/src/components/sidebar/cockpit-sidebar.tsx b/apps/cockpit/src/components/sidebar/cockpit-sidebar.tsx
index efe970bf5..68a5ecf55 100644
--- a/apps/cockpit/src/components/sidebar/cockpit-sidebar.tsx
+++ b/apps/cockpit/src/components/sidebar/cockpit-sidebar.tsx
@@ -1,7 +1,7 @@
import React from 'react';
import type {
CockpitManifestEntry,
-} from '@cacheplane/cockpit-registry';
+} from '@ngaf/cockpit-registry';
import type { NavigationProduct } from '../../lib/route-resolution';
import { LanguagePicker } from './language-picker';
import { NavigationGroups } from './navigation-groups';
diff --git a/apps/cockpit/src/components/sidebar/language-picker.spec.tsx b/apps/cockpit/src/components/sidebar/language-picker.spec.tsx
index 227cd56eb..92af1a547 100644
--- a/apps/cockpit/src/components/sidebar/language-picker.spec.tsx
+++ b/apps/cockpit/src/components/sidebar/language-picker.spec.tsx
@@ -3,7 +3,7 @@ import { act } from 'react-dom/test-utils';
import { createRoot } from 'react-dom/client';
import { JSDOM } from 'jsdom';
import { afterEach, describe, expect, it } from 'vitest';
-import { cockpitManifest } from '@cacheplane/cockpit-registry';
+import { cockpitManifest } from '@ngaf/cockpit-registry';
import { LanguagePicker } from './language-picker';
describe('LanguagePicker', () => {
diff --git a/apps/cockpit/src/components/sidebar/language-picker.tsx b/apps/cockpit/src/components/sidebar/language-picker.tsx
index cf5019ed5..63d54298b 100644
--- a/apps/cockpit/src/components/sidebar/language-picker.tsx
+++ b/apps/cockpit/src/components/sidebar/language-picker.tsx
@@ -4,8 +4,8 @@ import React, { useState, useEffect, useRef } from 'react';
import type {
CockpitLanguage,
CockpitManifestEntry,
-} from '@cacheplane/cockpit-registry';
-import { resolveManifestLanguage } from '@cacheplane/cockpit-registry';
+} from '@ngaf/cockpit-registry';
+import { resolveManifestLanguage } from '@ngaf/cockpit-registry';
import { toCockpitPath } from '../../lib/route-resolution';
const LANGUAGE_OPTIONS: Array<{ language: CockpitLanguage; label: string }> = [
diff --git a/apps/cockpit/src/components/sidebar/navigation-groups.tsx b/apps/cockpit/src/components/sidebar/navigation-groups.tsx
index 81a86c8f1..0b185b445 100644
--- a/apps/cockpit/src/components/sidebar/navigation-groups.tsx
+++ b/apps/cockpit/src/components/sidebar/navigation-groups.tsx
@@ -1,7 +1,7 @@
'use client';
import React, { useState } from 'react';
-import type { CockpitManifestEntry } from '@cacheplane/cockpit-registry';
+import type { CockpitManifestEntry } from '@ngaf/cockpit-registry';
import type { NavigationProduct } from '../../lib/route-resolution';
import { toCockpitPath } from '../../lib/route-resolution';
import { PRODUCT_LABELS, stripProductPrefix } from '../../lib/navigation-labels';
diff --git a/apps/cockpit/src/lib/cockpit-page.ts b/apps/cockpit/src/lib/cockpit-page.ts
index a9d378dac..8fb8309eb 100644
--- a/apps/cockpit/src/lib/cockpit-page.ts
+++ b/apps/cockpit/src/lib/cockpit-page.ts
@@ -1,4 +1,4 @@
-import { cockpitManifest, type CockpitProduct, type CockpitSection, type CockpitPageId, type CockpitLanguage } from '@cacheplane/cockpit-registry';
+import { cockpitManifest, type CockpitProduct, type CockpitSection, type CockpitPageId, type CockpitLanguage } from '@ngaf/cockpit-registry';
import {
buildNavigationTree,
getCapabilityPresentation,
diff --git a/apps/cockpit/src/lib/route-resolution.spec.ts b/apps/cockpit/src/lib/route-resolution.spec.ts
index 5caeb874d..b753fd62b 100644
--- a/apps/cockpit/src/lib/route-resolution.spec.ts
+++ b/apps/cockpit/src/lib/route-resolution.spec.ts
@@ -1,5 +1,5 @@
import { describe, expect, it } from 'vitest';
-import { cockpitManifest } from '@cacheplane/cockpit-registry';
+import { cockpitManifest } from '@ngaf/cockpit-registry';
import {
buildNavigationTree,
getCapabilityPresentation,
diff --git a/apps/cockpit/src/lib/route-resolution.ts b/apps/cockpit/src/lib/route-resolution.ts
index 8585863e0..27502c5fa 100644
--- a/apps/cockpit/src/lib/route-resolution.ts
+++ b/apps/cockpit/src/lib/route-resolution.ts
@@ -2,7 +2,7 @@ import {
resolveManifestLanguage,
type CockpitLanguage,
type CockpitManifestEntry,
-} from '@cacheplane/cockpit-registry';
+} from '@ngaf/cockpit-registry';
import { langgraphStreamingPythonModule } from '../../../../cockpit/langgraph/streaming/python/src/index';
import { langgraphPersistencePythonModule } from '../../../../cockpit/langgraph/persistence/python/src/index';
import { langgraphInterruptsPythonModule } from '../../../../cockpit/langgraph/interrupts/python/src/index';
diff --git a/apps/cockpit/src/lib/utils.ts b/apps/cockpit/src/lib/utils.ts
index eebaf420b..82e5f6084 100644
--- a/apps/cockpit/src/lib/utils.ts
+++ b/apps/cockpit/src/lib/utils.ts
@@ -1 +1 @@
-export { cn } from '@cacheplane/ui-react';
+export { cn } from '@ngaf/ui-react';
diff --git a/apps/cockpit/tsconfig.json b/apps/cockpit/tsconfig.json
index d0efdb3e8..a4ad6512c 100644
--- a/apps/cockpit/tsconfig.json
+++ b/apps/cockpit/tsconfig.json
@@ -12,9 +12,9 @@
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"],
- "@cacheplane/design-tokens": ["../../libs/design-tokens/src/index.ts"],
- "@cacheplane/ui-react": ["../../libs/ui-react/src/index.ts"],
- "@cacheplane/cockpit-registry": ["../../libs/cockpit-registry/src/index.ts"]
+ "@ngaf/design-tokens": ["../../libs/design-tokens/src/index.ts"],
+ "@ngaf/ui-react": ["../../libs/ui-react/src/index.ts"],
+ "@ngaf/cockpit-registry": ["../../libs/cockpit-registry/src/index.ts"]
}
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
diff --git a/apps/demo/src/app/chat-demo/chat-demo.component.ts b/apps/demo/src/app/chat-demo/chat-demo.component.ts
index 6061eaaa4..490f641a8 100644
--- a/apps/demo/src/app/chat-demo/chat-demo.component.ts
+++ b/apps/demo/src/app/chat-demo/chat-demo.component.ts
@@ -1,5 +1,5 @@
import { Component, Input, OnInit, Injector, runInInjectionContext } from '@angular/core';
-import { agent } from '@cacheplane/langgraph';
+import { agent } from '@ngaf/langgraph';
import type { BaseMessage } from '@langchain/core/messages';
@Component({
diff --git a/apps/website/content/AGENTS.md.template b/apps/website/content/AGENTS.md.template
index b0ee7d128..588ec58cc 100644
--- a/apps/website/content/AGENTS.md.template
+++ b/apps/website/content/AGENTS.md.template
@@ -3,7 +3,7 @@
Angular agent framework for LangChain/LangGraph. Provides `agent()` — Signal-native streaming for Angular agents, built for LangGraph.
## Install
-npm install @cacheplane/langgraph
+npm install @ngaf/langgraph
## Key requirement
`agent()` MUST be called within an Angular injection context (component constructor or field initializer). Calling it in ngOnInit or any async context throws "NG0203: inject() must be called from an injection context".
@@ -11,13 +11,13 @@ npm install @cacheplane/langgraph
## Basic usage
```typescript
// app.config.ts
-import { provideAgent } from '@cacheplane/langgraph';
+import { provideAgent } from '@ngaf/langgraph';
export const appConfig: ApplicationConfig = {
providers: [provideAgent({ apiUrl: 'http://localhost:2024' })]
};
// chat.component.ts
-import { agent } from '@cacheplane/langgraph';
+import { agent } from '@ngaf/langgraph';
import type { BaseMessage } from '@langchain/core/messages';
@Component({ template: `
@@ -38,7 +38,7 @@ export class ChatComponent {
## MCP server (for tool access)
Add to ~/.claude/settings.json:
-{"mcpServers":{"angular-agent":{"command":"npx","args":["@cacheplane/langgraph-mcp"]}}}
+{"mcpServers":{"angular-agent":{"command":"npx","args":["@ngaf/langgraph-mcp"]}}}
## Version check
If this file is stale, fetch the latest: https://cacheplane.ai/llms-full.txt
diff --git a/apps/website/content/CLAUDE.md.template b/apps/website/content/CLAUDE.md.template
index b0ee7d128..588ec58cc 100644
--- a/apps/website/content/CLAUDE.md.template
+++ b/apps/website/content/CLAUDE.md.template
@@ -3,7 +3,7 @@
Angular agent framework for LangChain/LangGraph. Provides `agent()` — Signal-native streaming for Angular agents, built for LangGraph.
## Install
-npm install @cacheplane/langgraph
+npm install @ngaf/langgraph
## Key requirement
`agent()` MUST be called within an Angular injection context (component constructor or field initializer). Calling it in ngOnInit or any async context throws "NG0203: inject() must be called from an injection context".
@@ -11,13 +11,13 @@ npm install @cacheplane/langgraph
## Basic usage
```typescript
// app.config.ts
-import { provideAgent } from '@cacheplane/langgraph';
+import { provideAgent } from '@ngaf/langgraph';
export const appConfig: ApplicationConfig = {
providers: [provideAgent({ apiUrl: 'http://localhost:2024' })]
};
// chat.component.ts
-import { agent } from '@cacheplane/langgraph';
+import { agent } from '@ngaf/langgraph';
import type { BaseMessage } from '@langchain/core/messages';
@Component({ template: `
@@ -38,7 +38,7 @@ export class ChatComponent {
## MCP server (for tool access)
Add to ~/.claude/settings.json:
-{"mcpServers":{"angular-agent":{"command":"npx","args":["@cacheplane/langgraph-mcp"]}}}
+{"mcpServers":{"angular-agent":{"command":"npx","args":["@ngaf/langgraph-mcp"]}}}
## Version check
If this file is stale, fetch the latest: https://cacheplane.ai/llms-full.txt
diff --git a/apps/website/content/docs/agent/api/agent.mdx b/apps/website/content/docs/agent/api/agent.mdx
index 1ad011d5f..e388e3341 100644
--- a/apps/website/content/docs/agent/api/agent.mdx
+++ b/apps/website/content/docs/agent/api/agent.mdx
@@ -5,7 +5,7 @@
When the `url` signal changes, the resource tears down the previous connection and opens a fresh one automatically. You never write subscription management or cleanup logic yourself.
```ts
-import { agent } from '@cacheplane/langgraph';
+import { agent } from '@ngaf/langgraph';
// Inside a component or service with injection context
const repo = agent
The
Enterprise
Guide
to
Agent
Streaming
in
AngularThe Real Cost
The agent() API
Chapter 3: The agent() API
-What agent() Returns
interface AgentRef {
@@ -185,12 +185,12 @@ Production Checklist
Interrupt & Approval Flows
Chapter 7: Interrupt & Approval Flows
-How LangGraph interrupt() Works
The Interrupt Signal in Angular
-const agent = injectAgentRef({ threadId });
Edge Cases Worth Handling
Full LangGraph Feature Coverage
Chapter 4: Full LangGraph Feature Coverage
-Tool Call Streaming
-Subgraph Event Propagation
Time Travel
Time Travel
DeepAgent Multi-Agent Coordination
The `onCustomEvent` Hook
The
Enterprise
Guide
to
Agent
Chat
Interfaces
in
AngularDemo Versus Production
The Opportunity Cost
The Thesis
-The Thesis
Batteries-Included Components
Chapter 4: Batteries-Included Components
Two Tiers, One Decision
-The Headless Tier
@@ -102,8 +102,8 @@ The Headless Tier
The Prebuilt Tier
import { AgentService } from '@cacheplane/langgraph';
-import { ChatPrebuiltComponent } from '@cacheplane/chat';
+import { AgentService } from '@ngaf/langgraph';
+import { ChatPrebuiltComponent } from '@ngaf/chat';
The Prebuilt Tier
How the Component Model Connects
-Composing the Two Tiers
@@ -136,17 +136,17 @@ When to Migrate
Theming & Design System Integration
Chapter 6: Theming & Design System Integration
-The CSS Custom Property API
-Design Token Mapping
-Typography Integration
-Color System Integration
Brand Override Example
Token Limits and the Headless Tier
-Chapter 7: Generative UI in Chat
How Generative UI Messages Work in the Stream
-The json-render Spec
Google's A2UI Spec
-Integration with @cacheplane/render
-Integration with @ngaf/render
+The Registry Pattern in Chat
import { provideChatRenderer } from '@cacheplane/chat';
-import { provideRenderRegistry } from '@cacheplane/render';
+import { provideChatRenderer } from '@ngaf/chat';
+import { provideRenderRegistry } from '@ngaf/render';
import { DataTableComponent } from './components/data-table.component';
import { BookingFormComponent } from './components/booking-form.component';
import { ApprovalCardComponent } from './components/approval-card.component';
@@ -206,7 +206,7 @@ The Registry Pattern in Chat
Progressive Rendering via Streaming JSON Patches
-Chapter 7: Debug Tooling
What chat-debug Exposes
-Adding chat-debug
-import { ChatDebugComponent } from '@cacheplane/chat/debug';
+import { ChatDebugComponent } from '@ngaf/chat/debug';
Inspecting Messages and Tool Calls
Angular DevTools Integration
-Production Safety
The
Enterprise
Guide
to
Generative
UI
in
AngularConditional Rendering, Iteration, and Computed Properties
Google's A2UI Extension
@cacheplane/render in Angular
-@ngaf/render in Angular
+@Component({
template: `Chapter 5
State Management & Computed Functions
Chapter 4: State Management & Computed Functions
-signalStateStore(): Agent-Managed Reactive State
const store = signalStateStore({
diff --git a/apps/website/scripts/generate-whitepaper.ts b/apps/website/scripts/generate-whitepaper.ts
index c03f65bce..b13089359 100644
--- a/apps/website/scripts/generate-whitepaper.ts
+++ b/apps/website/scripts/generate-whitepaper.ts
@@ -116,7 +116,7 @@ Context: The most advanced production agents emit structured UI specs — not ju
Cover:
- The onCustomEvent pattern in LangGraph: how agents emit structured data
-- The @cacheplane/render approach: json-render specs, defineAngularRegistry(),
Every agent UI primitive,
diff --git a/apps/website/src/components/landing/CockpitCTA.tsx b/apps/website/src/components/landing/CockpitCTA.tsx
index 3d57aef22..c1d395c57 100644
--- a/apps/website/src/components/landing/CockpitCTA.tsx
+++ b/apps/website/src/components/landing/CockpitCTA.tsx
@@ -1,6 +1,6 @@
'use client';
import { motion } from 'framer-motion';
-import { tokens } from '@cacheplane/design-tokens';
+import { tokens } from '@ngaf/design-tokens';
export function CockpitCTA() {
return (
diff --git a/apps/website/src/components/landing/CodeBlock.tsx b/apps/website/src/components/landing/CodeBlock.tsx
index c26b3fb03..64857f74b 100644
--- a/apps/website/src/components/landing/CodeBlock.tsx
+++ b/apps/website/src/components/landing/CodeBlock.tsx
@@ -1,5 +1,5 @@
import { codeToHtml } from 'shiki';
-import { tokens } from '@cacheplane/design-tokens';
+import { tokens } from '@ngaf/design-tokens';
const EXAMPLE = `// app.config.ts
provideAgent({ apiUrl: 'http://localhost:2024' })
diff --git a/apps/website/src/components/landing/DeepAgentsShowcase.tsx b/apps/website/src/components/landing/DeepAgentsShowcase.tsx
index 7566fb788..6452c364a 100644
--- a/apps/website/src/components/landing/DeepAgentsShowcase.tsx
+++ b/apps/website/src/components/landing/DeepAgentsShowcase.tsx
@@ -1,5 +1,5 @@
import { codeToHtml } from 'shiki';
-import { tokens } from '@cacheplane/design-tokens';
+import { tokens } from '@ngaf/design-tokens';
import { CapabilityCard } from './CapabilityCard';
const CAPABILITIES = [
diff --git a/apps/website/src/components/landing/EmbedFrame.tsx b/apps/website/src/components/landing/EmbedFrame.tsx
index f0100d4ec..722ff2fc5 100644
--- a/apps/website/src/components/landing/EmbedFrame.tsx
+++ b/apps/website/src/components/landing/EmbedFrame.tsx
@@ -1,6 +1,6 @@
'use client';
import { useState } from 'react';
-import { tokens } from '@cacheplane/design-tokens';
+import { tokens } from '@ngaf/design-tokens';
interface EmbedFrameProps {
src: string;
diff --git a/apps/website/src/components/landing/FeatureStrip.tsx b/apps/website/src/components/landing/FeatureStrip.tsx
index ee75e9bbd..ab01b1eae 100644
--- a/apps/website/src/components/landing/FeatureStrip.tsx
+++ b/apps/website/src/components/landing/FeatureStrip.tsx
@@ -1,6 +1,6 @@
'use client';
import { motion } from 'framer-motion';
-import { tokens } from '@cacheplane/design-tokens';
+import { tokens } from '@ngaf/design-tokens';
const FEATURES = [
{ icon: '\u26A1', title: 'Token-by-token streaming', desc: 'Real-time SSE streaming via FetchStreamTransport. Messages update as each token arrives.' },
diff --git a/apps/website/src/components/landing/GenerativeUIFrame.tsx b/apps/website/src/components/landing/GenerativeUIFrame.tsx
index b3a9e1469..dd49436cb 100644
--- a/apps/website/src/components/landing/GenerativeUIFrame.tsx
+++ b/apps/website/src/components/landing/GenerativeUIFrame.tsx
@@ -1,6 +1,6 @@
'use client';
import { useEffect, useRef } from 'react';
-import { tokens } from '@cacheplane/design-tokens';
+import { tokens } from '@ngaf/design-tokens';
export function GenerativeUIFrame() {
const frameRef = useRef
- Incrementally building chat vs @cacheplane/chat
+ Incrementally building chat vs @ngaf/chat
@@ -62,7 +62,7 @@ export function ChatLandingComparison() {
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', 'Build Incrementally', '@cacheplane/chat'].map((h, i) => (
+ {['Capability', 'Build Incrementally', '@ngaf/chat'].map((h, i) => (
- With @cacheplane/chat
+ With @ngaf/chat
- Hardcoded agent UI vs @cacheplane/render
+ Hardcoded agent UI vs @ngaf/render
@@ -61,7 +61,7 @@ export function RenderComparison() {
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', 'Hardcoded Approach', '@cacheplane/render'].map((h, i) => (
+ {['Capability', 'Hardcoded Approach', '@ngaf/render'].map((h, i) => (
- With @cacheplane/render
+ With @ngaf/render
= {
diff --git a/apps/website/src/components/landing/solutions/SolutionHero.tsx b/apps/website/src/components/landing/solutions/SolutionHero.tsx
index f68116f40..19317cd96 100644
--- a/apps/website/src/components/landing/solutions/SolutionHero.tsx
+++ b/apps/website/src/components/landing/solutions/SolutionHero.tsx
@@ -1,7 +1,7 @@
'use client';
import { motion } from 'framer-motion';
import Link from 'next/link';
-import { tokens } from '@cacheplane/design-tokens';
+import { tokens } from '@ngaf/design-tokens';
import type { SolutionConfig } from '../../../lib/solutions-data';
interface SolutionHeroProps {
diff --git a/apps/website/src/components/landing/solutions/SolutionProblem.tsx b/apps/website/src/components/landing/solutions/SolutionProblem.tsx
index a8245c1ac..c87d7d32f 100644
--- a/apps/website/src/components/landing/solutions/SolutionProblem.tsx
+++ b/apps/website/src/components/landing/solutions/SolutionProblem.tsx
@@ -1,6 +1,6 @@
'use client';
import { motion } from 'framer-motion';
-import { tokens } from '@cacheplane/design-tokens';
+import { tokens } from '@ngaf/design-tokens';
import type { SolutionPainPoint } from '../../../lib/solutions-data';
interface SolutionProblemProps {
diff --git a/apps/website/src/components/landing/solutions/SolutionProofPoints.tsx b/apps/website/src/components/landing/solutions/SolutionProofPoints.tsx
index 7620d1fc3..06f03eaa1 100644
--- a/apps/website/src/components/landing/solutions/SolutionProofPoints.tsx
+++ b/apps/website/src/components/landing/solutions/SolutionProofPoints.tsx
@@ -1,6 +1,6 @@
'use client';
import { motion } from 'framer-motion';
-import { tokens } from '@cacheplane/design-tokens';
+import { tokens } from '@ngaf/design-tokens';
import type { ProofPoint } from '../../../lib/solutions-data';
interface SolutionProofPointsProps {
diff --git a/apps/website/src/components/landing/solutions/SolutionsGrid.tsx b/apps/website/src/components/landing/solutions/SolutionsGrid.tsx
index 0eb0e8764..f76592a0c 100644
--- a/apps/website/src/components/landing/solutions/SolutionsGrid.tsx
+++ b/apps/website/src/components/landing/solutions/SolutionsGrid.tsx
@@ -1,7 +1,7 @@
'use client';
import { motion } from 'framer-motion';
import Link from 'next/link';
-import { tokens } from '@cacheplane/design-tokens';
+import { tokens } from '@ngaf/design-tokens';
import { SOLUTIONS } from '../../../lib/solutions-data';
export function SolutionsGrid() {
diff --git a/apps/website/src/components/pricing/CompareTable.tsx b/apps/website/src/components/pricing/CompareTable.tsx
index 5436c2daa..97258513e 100644
--- a/apps/website/src/components/pricing/CompareTable.tsx
+++ b/apps/website/src/components/pricing/CompareTable.tsx
@@ -1,5 +1,5 @@
'use client';
-import { tokens } from '@cacheplane/design-tokens';
+import { tokens } from '@ngaf/design-tokens';
const ROWS = [
{ feature: 'npm install', oss: true, seat: true, app: true, enterprise: true },
diff --git a/apps/website/src/components/pricing/LeadForm.tsx b/apps/website/src/components/pricing/LeadForm.tsx
index 1ad38269d..39b1ab70f 100644
--- a/apps/website/src/components/pricing/LeadForm.tsx
+++ b/apps/website/src/components/pricing/LeadForm.tsx
@@ -1,6 +1,6 @@
'use client';
import { useState } from 'react';
-import { tokens } from '@cacheplane/design-tokens';
+import { tokens } from '@ngaf/design-tokens';
export function LeadForm() {
const [status, setStatus] = useState<'idle' | 'sending' | 'sent' | 'error'>('idle');
diff --git a/apps/website/src/components/pricing/PricingGrid.tsx b/apps/website/src/components/pricing/PricingGrid.tsx
index 0d5b78fdb..b1cd2567a 100644
--- a/apps/website/src/components/pricing/PricingGrid.tsx
+++ b/apps/website/src/components/pricing/PricingGrid.tsx
@@ -1,5 +1,5 @@
'use client';
-import { tokens } from '@cacheplane/design-tokens';
+import { tokens } from '@ngaf/design-tokens';
const PLANS = [
{
@@ -9,7 +9,7 @@ const PLANS = [
features: ['MIT License', 'All libraries', 'Commercial use welcome', 'Community support'],
highlight: false,
cta: 'Get Started',
- ctaHref: 'https://www.npmjs.com/package/@cacheplane/langgraph',
+ ctaHref: 'https://www.npmjs.com/package/@ngaf/langgraph',
},
{
name: 'Enterprise',
diff --git a/apps/website/src/components/shared/AnnouncementToast.tsx b/apps/website/src/components/shared/AnnouncementToast.tsx
index a4f559023..6c9ea7cef 100644
--- a/apps/website/src/components/shared/AnnouncementToast.tsx
+++ b/apps/website/src/components/shared/AnnouncementToast.tsx
@@ -1,7 +1,7 @@
'use client';
import { useState, useEffect } from 'react';
import { motion, AnimatePresence } from 'framer-motion';
-import { tokens } from '@cacheplane/design-tokens';
+import { tokens } from '@ngaf/design-tokens';
/**
* Bump this date to re-show the toast for all users.
diff --git a/apps/website/src/components/shared/Footer.tsx b/apps/website/src/components/shared/Footer.tsx
index 3f6431bd4..a0ca1391c 100644
--- a/apps/website/src/components/shared/Footer.tsx
+++ b/apps/website/src/components/shared/Footer.tsx
@@ -2,7 +2,7 @@
import { useState } from 'react';
import Link from 'next/link';
import { motion } from 'framer-motion';
-import { tokens } from '@cacheplane/design-tokens';
+import { tokens } from '@ngaf/design-tokens';
function GitHubIcon() {
return (
@@ -120,7 +120,7 @@ export function Footer() {
aria-label="GitHub">