diff --git a/.claude/launch.json b/.claude/launch.json
index ff4c563eb..74c73044d 100644
--- a/.claude/launch.json
+++ b/.claude/launch.json
@@ -4,8 +4,9 @@
{
"name": "website-dev",
"runtimeExecutable": "/bin/bash",
- "runtimeArgs": ["-c", "export PATH=/Users/blove/.nvm/versions/node/v22.14.0/bin:$PATH && npx nx serve website"],
- "port": 3000
+ "runtimeArgs": ["-c", "export PATH=/Users/blove/.nvm/versions/node/v22.14.0/bin:$PATH && npx nx serve website --port $PORT"],
+ "port": 3000,
+ "autoPort": true
},
{
"name": "cockpit",
diff --git a/apps/website/content/docs-v2/api/agent.mdx b/apps/website/content/docs/agent/api/agent.mdx
similarity index 95%
rename from apps/website/content/docs-v2/api/agent.mdx
rename to apps/website/content/docs/agent/api/agent.mdx
index 7475f7595..3b89c802e 100644
--- a/apps/website/content/docs-v2/api/agent.mdx
+++ b/apps/website/content/docs/agent/api/agent.mdx
@@ -52,21 +52,21 @@ For plain HTTP requests that return a single value and complete, Angular's built
Build your first streaming component end-to-end in under five minutes.
Deep dive into SSE lifecycle, error handling, and reconnect strategies.
Understand how angular integrates with Angular's reactivity model.
diff --git a/apps/website/content/docs-v2/api/api-docs.json b/apps/website/content/docs/agent/api/api-docs.json
similarity index 100%
rename from apps/website/content/docs-v2/api/api-docs.json
rename to apps/website/content/docs/agent/api/api-docs.json
diff --git a/apps/website/content/docs-v2/api/fetch-stream-transport.mdx b/apps/website/content/docs/agent/api/fetch-stream-transport.mdx
similarity index 95%
rename from apps/website/content/docs-v2/api/fetch-stream-transport.mdx
rename to apps/website/content/docs/agent/api/fetch-stream-transport.mdx
index 0cdcb409a..1f6977845 100644
--- a/apps/website/content/docs-v2/api/fetch-stream-transport.mdx
+++ b/apps/website/content/docs/agent/api/fetch-stream-transport.mdx
@@ -42,21 +42,21 @@ The transport handles:
Learn how the SSE lifecycle maps to resource signals and how to handle reconnects.
Server configuration for SSE: headers, timeouts, and edge runtime considerations.
The test-time counterpart — push values synchronously without a real server.
diff --git a/apps/website/content/docs-v2/api/mock-stream-transport.mdx b/apps/website/content/docs/agent/api/mock-stream-transport.mdx
similarity index 96%
rename from apps/website/content/docs-v2/api/mock-stream-transport.mdx
rename to apps/website/content/docs/agent/api/mock-stream-transport.mdx
index 1885a0d45..a7c45ca22 100644
--- a/apps/website/content/docs-v2/api/mock-stream-transport.mdx
+++ b/apps/website/content/docs/agent/api/mock-stream-transport.mdx
@@ -78,21 +78,21 @@ describe('RepoComponent', () => {
Full testing patterns including component harnesses and multi-stream scenarios.
The production transport that MockAgentTransport replaces in tests.
Full reference for the primitive you are testing against.
diff --git a/apps/website/content/docs-v2/api/provide-agent.mdx b/apps/website/content/docs/agent/api/provide-agent.mdx
similarity index 94%
rename from apps/website/content/docs-v2/api/provide-agent.mdx
rename to apps/website/content/docs/agent/api/provide-agent.mdx
index 4ef91f911..4159dc5a3 100644
--- a/apps/website/content/docs-v2/api/provide-agent.mdx
+++ b/apps/website/content/docs/agent/api/provide-agent.mdx
@@ -51,21 +51,21 @@ provideAgent({ transport: MockAgentTransport })
Step-by-step setup guide including peer dependencies and NgModule support.
Configure transports for production, SSR, and edge runtimes.
Full reference for the core primitive you configure here.
diff --git a/apps/website/content/docs-v2/concepts/agent-architecture.mdx b/apps/website/content/docs/agent/concepts/agent-architecture.mdx
similarity index 100%
rename from apps/website/content/docs-v2/concepts/agent-architecture.mdx
rename to apps/website/content/docs/agent/concepts/agent-architecture.mdx
diff --git a/apps/website/content/docs-v2/concepts/angular-signals.mdx b/apps/website/content/docs/agent/concepts/angular-signals.mdx
similarity index 100%
rename from apps/website/content/docs-v2/concepts/angular-signals.mdx
rename to apps/website/content/docs/agent/concepts/angular-signals.mdx
diff --git a/apps/website/content/docs-v2/concepts/langgraph-basics.mdx b/apps/website/content/docs/agent/concepts/langgraph-basics.mdx
similarity index 100%
rename from apps/website/content/docs-v2/concepts/langgraph-basics.mdx
rename to apps/website/content/docs/agent/concepts/langgraph-basics.mdx
diff --git a/apps/website/content/docs-v2/concepts/state-management.mdx b/apps/website/content/docs/agent/concepts/state-management.mdx
similarity index 100%
rename from apps/website/content/docs-v2/concepts/state-management.mdx
rename to apps/website/content/docs/agent/concepts/state-management.mdx
diff --git a/apps/website/content/docs-v2/getting-started/installation.mdx b/apps/website/content/docs/agent/getting-started/installation.mdx
similarity index 100%
rename from apps/website/content/docs-v2/getting-started/installation.mdx
rename to apps/website/content/docs/agent/getting-started/installation.mdx
diff --git a/apps/website/content/docs-v2/getting-started/introduction.mdx b/apps/website/content/docs/agent/getting-started/introduction.mdx
similarity index 100%
rename from apps/website/content/docs-v2/getting-started/introduction.mdx
rename to apps/website/content/docs/agent/getting-started/introduction.mdx
diff --git a/apps/website/content/docs-v2/getting-started/quickstart.mdx b/apps/website/content/docs/agent/getting-started/quickstart.mdx
similarity index 100%
rename from apps/website/content/docs-v2/getting-started/quickstart.mdx
rename to apps/website/content/docs/agent/getting-started/quickstart.mdx
diff --git a/apps/website/content/docs-v2/guides/deployment.mdx b/apps/website/content/docs/agent/guides/deployment.mdx
similarity index 100%
rename from apps/website/content/docs-v2/guides/deployment.mdx
rename to apps/website/content/docs/agent/guides/deployment.mdx
diff --git a/apps/website/content/docs-v2/guides/interrupts.mdx b/apps/website/content/docs/agent/guides/interrupts.mdx
similarity index 100%
rename from apps/website/content/docs-v2/guides/interrupts.mdx
rename to apps/website/content/docs/agent/guides/interrupts.mdx
diff --git a/apps/website/content/docs-v2/guides/memory.mdx b/apps/website/content/docs/agent/guides/memory.mdx
similarity index 100%
rename from apps/website/content/docs-v2/guides/memory.mdx
rename to apps/website/content/docs/agent/guides/memory.mdx
diff --git a/apps/website/content/docs-v2/guides/persistence.mdx b/apps/website/content/docs/agent/guides/persistence.mdx
similarity index 100%
rename from apps/website/content/docs-v2/guides/persistence.mdx
rename to apps/website/content/docs/agent/guides/persistence.mdx
diff --git a/apps/website/content/docs-v2/guides/streaming.mdx b/apps/website/content/docs/agent/guides/streaming.mdx
similarity index 100%
rename from apps/website/content/docs-v2/guides/streaming.mdx
rename to apps/website/content/docs/agent/guides/streaming.mdx
diff --git a/apps/website/content/docs-v2/guides/subgraphs.mdx b/apps/website/content/docs/agent/guides/subgraphs.mdx
similarity index 100%
rename from apps/website/content/docs-v2/guides/subgraphs.mdx
rename to apps/website/content/docs/agent/guides/subgraphs.mdx
diff --git a/apps/website/content/docs-v2/guides/testing.mdx b/apps/website/content/docs/agent/guides/testing.mdx
similarity index 100%
rename from apps/website/content/docs-v2/guides/testing.mdx
rename to apps/website/content/docs/agent/guides/testing.mdx
diff --git a/apps/website/content/docs-v2/guides/time-travel.mdx b/apps/website/content/docs/agent/guides/time-travel.mdx
similarity index 100%
rename from apps/website/content/docs-v2/guides/time-travel.mdx
rename to apps/website/content/docs/agent/guides/time-travel.mdx
diff --git a/apps/website/content/docs/chat/api/chat-config.mdx b/apps/website/content/docs/chat/api/chat-config.mdx
new file mode 100644
index 000000000..f734451a3
--- /dev/null
+++ b/apps/website/content/docs/chat/api/chat-config.mdx
@@ -0,0 +1,132 @@
+# ChatConfig
+
+`ChatConfig` is the configuration interface accepted by `provideChat()`. It defines global settings for chat composition components including the generative UI registry, avatar styling, and assistant naming.
+
+**Import:**
+
+```typescript
+import type { ChatConfig } from '@cacheplane/chat';
+```
+
+## Interface Definition
+
+```typescript
+interface ChatConfig {
+ /** Default render registry for generative UI components. */
+ renderRegistry?: AngularRegistry;
+
+ /** Override the default AI avatar label (default: "A"). */
+ avatarLabel?: string;
+
+ /** Override the default assistant display name (default: "Assistant"). */
+ assistantName?: string;
+}
+```
+
+## Properties
+
+### renderRegistry
+
+```typescript
+renderRegistry?: AngularRegistry
+```
+
+The component registry used by `ChatGenerativeUiComponent` to resolve JSON UI specs to Angular components. This is an `AngularRegistry` from `@cacheplane/render`.
+
+When not provided, generative UI components will not render -- the `chat-generative-ui` primitive will simply show nothing for any spec passed to it.
+
+**Example:**
+
+```typescript
+import { createAngularRegistry } from '@cacheplane/render';
+import { WeatherCardComponent } from './weather-card.component';
+import { ChartComponent } from './chart.component';
+
+const registry = createAngularRegistry({
+ weather_card: WeatherCardComponent,
+ chart: ChartComponent,
+});
+
+provideChat({ renderRegistry: registry });
+```
+
+See the [Generative UI guide](/docs/chat/guides/generative-ui) for detailed setup.
+
+### avatarLabel
+
+```typescript
+avatarLabel?: string
+```
+
+A short string (typically one or two characters) displayed in the AI avatar badge that appears next to assistant messages in composition components.
+
+**Default:** `"A"`
+
+**Example:**
+
+```typescript
+provideChat({ avatarLabel: 'AI' });
+```
+
+The avatar badge is a small square element styled with `--chat-avatar-bg` and `--chat-avatar-text` CSS variables.
+
+### assistantName
+
+```typescript
+assistantName?: string
+```
+
+The display name for the AI assistant. Used in labels, ARIA attributes, and any place where the assistant needs a human-readable name.
+
+**Default:** `"Assistant"`
+
+**Example:**
+
+```typescript
+provideChat({ assistantName: 'Code Copilot' });
+```
+
+## Accessing ChatConfig at Runtime
+
+Inject `CHAT_CONFIG` to read configuration values in your own components:
+
+```typescript
+import { inject } from '@angular/core';
+import { CHAT_CONFIG } from '@cacheplane/chat';
+import type { ChatConfig } from '@cacheplane/chat';
+
+@Component({
+ selector: 'app-chat-header',
+ template: `
+
{{ assistantName }}
+ `,
+})
+export class ChatHeaderComponent {
+ private config = inject(CHAT_CONFIG, { optional: true });
+
+ get assistantName(): string {
+ return this.config?.assistantName ?? 'Assistant';
+ }
+}
+```
+
+## Relationship to Other Types
+
+`ChatConfig` references the following external type:
+
+| Type | Package | Description |
+|------|---------|-------------|
+| `AngularRegistry` | `@cacheplane/render` | Maps JSON spec type strings to Angular component classes |
+
+## Type Location
+
+The `ChatConfig` interface is defined in two files within the library:
+
+- `libs/chat/src/lib/provide-chat.ts` -- The canonical definition with JSDoc comments, alongside the `provideChat()` function and `CHAT_CONFIG` token
+- `libs/chat/src/lib/chat.types.ts` -- A simplified re-export for internal use
+
+The public API exports `ChatConfig` as a type-only export:
+
+```typescript
+export type { ChatConfig } from './lib/provide-chat';
+```
diff --git a/apps/website/content/docs/chat/api/create-mock-agent-ref.mdx b/apps/website/content/docs/chat/api/create-mock-agent-ref.mdx
new file mode 100644
index 000000000..db6bcb3e9
--- /dev/null
+++ b/apps/website/content/docs/chat/api/create-mock-agent-ref.mdx
@@ -0,0 +1,238 @@
+# createMockAgentRef()
+
+`createMockAgentRef()` creates a mock `AgentRef` with writable signals for testing chat components. Instead of connecting to a real LangGraph agent, you get an object whose signals you can set directly to simulate any agent state.
+
+**Import:**
+
+```typescript
+import { createMockAgentRef } from '@cacheplane/chat';
+```
+
+## Signature
+
+```typescript
+function createMockAgentRef(initial?: {
+ messages?: BaseMessage[];
+ status?: ResourceStatus;
+ isLoading?: boolean;
+ error?: unknown;
+ hasValue?: boolean;
+ isThreadLoading?: boolean;
+}): MockAgentRef
+```
+
+### Parameters
+
+| Parameter | Type | Default | Description |
+|-----------|------|---------|-------------|
+| `initial` | `object` | `{}` | Optional initial values for the mock's signals |
+
+### Initial Options
+
+| Option | Type | Default | Description |
+|--------|------|---------|-------------|
+| `messages` | `BaseMessage[]` | `[]` | Initial message list |
+| `status` | `ResourceStatus` | `ResourceStatus.Idle` | Initial resource status |
+| `isLoading` | `boolean` | `false` | Initial loading state |
+| `error` | `unknown` | `null` | Initial error value |
+| `hasValue` | `boolean` | `false` | Whether the ref has a resolved value |
+| `isThreadLoading` | `boolean` | `false` | Whether thread data is loading |
+
+### Returns
+
+A `MockAgentRef` object -- an `AgentRef` with all signals replaced by `WritableSignal` instances.
+
+## MockAgentRef Interface
+
+```typescript
+interface MockAgentRef extends AgentRef {
+ messages: WritableSignal;
+ status: WritableSignal;
+ error: WritableSignal;
+ interrupt: WritableSignal | undefined>;
+ interrupts: WritableSignal[]>;
+ isLoading: WritableSignal;
+ hasValue: WritableSignal;
+ value: WritableSignal;
+ toolProgress: WritableSignal;
+ toolCalls: WritableSignal;
+ branch: WritableSignal;
+ history: WritableSignal[]>;
+ isThreadLoading: WritableSignal;
+ subagents: WritableSignal