Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<p align="center">
<img
src="https://cacheplane.ai/assets/hero.svg"
alt="Angular Agent Framework — agent UI primitives for Angular"
alt="Agent UI for Angular — agent UI primitives for Angular"
width="100%"
/>
</p>
Expand Down Expand Up @@ -109,7 +109,7 @@ That's it. `chat.messages()` and `chat.status()` are Angular Signals. Bind them
<p align="center">
<img
src="https://cacheplane.ai/assets/arch-diagram.svg"
alt="Angular Agent Framework architecture: Angular Component → agent() → StreamManager Bridge → LangGraph Platform, with signals returned reactively"
alt="Agent UI for Angular architecture: Angular Component → agent() → StreamManager Bridge → LangGraph Platform, with signals returned reactively"
width="100%"
/>
</p>
Expand Down
8 changes: 4 additions & 4 deletions apps/cockpit/src/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,17 @@ import { AnalyticsBootstrap } from '../components/analytics-bootstrap';
import './cockpit.css';

export const metadata = {
title: 'Cockpit — Angular Agent Framework',
description: 'The live reference app for the Angular Agent Framework. Real LangGraph + AG-UI agents through the Angular surface you’ll ship.',
title: 'Cockpit — Agent UI for Angular',
description: 'The live reference app for Agent UI for Angular. Real LangGraph + AG-UI agents through the Angular surface you’ll ship.',
openGraph: {
title: 'Cockpit — Angular Agent Framework',
title: 'Cockpit — Agent UI for Angular',
description: 'The live reference app for the framework. Real LangGraph + AG-UI agents through the same Angular surface you’ll ship.',
type: 'website',
siteName: 'Cockpit',
},
twitter: {
card: 'summary_large_image',
title: 'Cockpit — Angular Agent Framework',
title: 'Cockpit — Agent UI for Angular',
description: 'The live reference app for the framework. Real LangGraph + AG-UI agents through the Angular surface you’ll ship.',
},
};
Expand Down
4 changes: 2 additions & 2 deletions apps/cockpit/src/app/opengraph-image.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { ImageResponse } from 'next/og';
import { darkOverrides } from '@ngaf/design-tokens';

export const runtime = 'edge';
export const alt = 'Cockpit — the live reference app for the Angular Agent Framework';
export const alt = 'Cockpit — the live reference app for Agent UI for Angular';
export const size = { width: 1200, height: 630 };
export const contentType = 'image/png';

Expand Down Expand Up @@ -71,7 +71,7 @@ export default async function OpenGraphImage() {
marginBottom: 24,
}}
>
Cockpit · Angular Agent Framework
Cockpit · Agent UI for Angular
</div>

{/* Headline — Inter Bold (cockpit chrome is sans-serif Linear-style) */}
Expand Down
60 changes: 57 additions & 3 deletions apps/cockpit/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,64 @@
"@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"],
"@ngaf/telemetry/shared": ["../../libs/telemetry/src/shared/public-api.ts"],
"@ngaf/telemetry/browser": ["../../libs/telemetry/src/browser/public-api.ts"]
"@ngaf/telemetry/shared": [
"../../libs/telemetry/src/shared/public-api.ts"
],
"@ngaf/telemetry/browser": [
"../../libs/telemetry/src/browser/public-api.ts"
]
}
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
"exclude": ["node_modules"]
"exclude": ["node_modules"],
"references": [
{
"path": "../../cockpit/deep-agents/sandboxes/python"
},
{
"path": "../../cockpit/deep-agents/skills/python"
},
{
"path": "../../cockpit/deep-agents/subagents/python"
},
{
"path": "../../cockpit/deep-agents/filesystem/python"
},
{
"path": "../../cockpit/deep-agents/planning/python"
},
{
"path": "../../cockpit/deep-agents/memory/python"
},
{
"path": "../../cockpit/langgraph/deployment-runtime/python"
},
{
"path": "../../cockpit/langgraph/time-travel/python"
},
{
"path": "../../cockpit/langgraph/subgraphs/python"
},
{
"path": "../../cockpit/langgraph/durable-execution/python"
},
{
"path": "../../cockpit/langgraph/memory/python"
},
{
"path": "../../cockpit/langgraph/interrupts/python"
},
{
"path": "../../cockpit/langgraph/persistence/python"
},
{
"path": "../../cockpit/langgraph/streaming/python"
},
{
"path": "../../libs/design-tokens"
},
{
"path": "../../libs/telemetry"
}
]
}
14 changes: 13 additions & 1 deletion apps/minting-service/tsconfig.app.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,17 @@
"emitDeclarationOnly": false
},
"include": ["src/**/*.ts", "handlers/**/*.ts", "scripts/**/*.ts"],
"exclude": ["src/**/*.spec.ts", "handlers/**/*.spec.ts", "scripts/**/*.spec.ts"]
"exclude": [
"src/**/*.spec.ts",
"handlers/**/*.spec.ts",
"scripts/**/*.spec.ts"
],
"references": [
{
"path": "../../libs/licensing/tsconfig.lib.json"
},
{
"path": "../../libs/db/tsconfig.lib.json"
}
]
}
2 changes: 1 addition & 1 deletion apps/website/content/AGENTS.md.template
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Angular Agent Framework v@VERSION@
# Agent UI for Angular v@VERSION@

Agent UI primitives and LangGraph streaming adapters for Angular.

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

Agent UI primitives and LangGraph streaming adapters for Angular.

Expand Down
4 changes: 2 additions & 2 deletions apps/website/e2e/website.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,15 +117,15 @@ test('docs pages render canonical and social metadata', async ({ page }) => {
);
await expect(page.locator('meta[property="og:title"]')).toHaveAttribute(
'content',
'Streaming - Agent Docs - Angular Agent Framework',
'Streaming - Agent Docs - Agent UI for Angular',
);
await expect(page.locator('meta[property="og:url"]')).toHaveAttribute(
'content',
'https://cacheplane.ai/docs/agent/guides/streaming',
);
await expect(page.locator('meta[name="twitter:title"]')).toHaveAttribute(
'content',
'Streaming - Agent Docs - Angular Agent Framework',
'Streaming - Agent Docs - Agent UI for Angular',
);
});

Expand Down
4 changes: 2 additions & 2 deletions apps/website/emails/email-wrapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ export function wrapEmail(opts: {
<body style="font-family:Inter,Arial,sans-serif;background-color:#f4f6fb;padding:40px 16px;margin:0">
<div style="max-width:520px;margin:0 auto;background:#ffffff;border:1px solid #e6e8ee;border-radius:14px;overflow:hidden">
<div style="padding:20px 32px;border-bottom:1px solid #e6e8ee">
<div style="font-size:14px;font-weight:700;color:#1a1a2e;letter-spacing:-0.01em">🛩️ Angular Agent Framework</div>
<div style="font-size:14px;font-weight:700;color:#1a1a2e;letter-spacing:-0.01em">🛩️ Agent UI for Angular</div>
</div>
<div style="padding:32px">
${opts.body}
<div style="border-top:1px solid #e6e8ee;margin-top:28px;padding-top:16px">
<p style="font-size:11px;color:#8b8fa3;line-height:1.5;margin:0">Angular Agent Framework — Signal-native streaming for LangGraph.</p>
<p style="font-size:11px;color:#8b8fa3;line-height:1.5;margin:0">Agent UI for Angular — Signal-native streaming for LangGraph.</p>
${opts.showUnsubscribe ? '<p style="font-size:10px;color:#8b8fa3;margin:6px 0 0"><a href="https://cacheplane.ai/api/unsubscribe?email=RECIPIENT" style="color:#8b8fa3;text-decoration:underline">Unsubscribe</a></p>' : ''}
</div>
</div>
Expand Down
9 changes: 5 additions & 4 deletions apps/website/emails/lead-notification.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
import { wrapEmail, esc } from './email-wrapper';

interface LeadNotificationProps {
name: string;
name?: string;
email: string;
company: string;
message: string;
company?: string;
message?: string;
ts: string;
}

export function leadNotificationHtml({ name, email, company, message, ts }: LeadNotificationProps): string {
const displayName = name && name.length > 0 ? name : 'No name provided';
return wrapEmail({
body: `
<p style="font-size:11px;font-family:monospace;text-transform:uppercase;letter-spacing:0.08em;color:#DD0031;font-weight:700;margin:0 0 8px">New Lead</p>
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 4px">${esc(name)}</p>
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 4px">${esc(displayName)}</p>
<p style="font-size:14px;color:#8b8fa3;margin:0 0 16px">${esc(email)}${company ? ` — ${esc(company)}` : ''}</p>
${message ? `<div style="border-top:1px solid #e6e8ee;padding-top:14px;margin-bottom:4px"><p style="font-size:14px;color:#555770;line-height:1.7;margin:0">${esc(message)}</p></div>` : ''}
<div style="border-top:1px solid #e6e8ee;padding-top:14px;margin-top:14px">
Expand Down
2 changes: 1 addition & 1 deletion apps/website/emails/newsletter-welcome.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { wrapEmail } from './email-wrapper';
export function newsletterWelcomeHtml(): string {
return wrapEmail({
body: `
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 8px;line-height:1.3">Welcome to Angular Agent Framework updates</p>
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 8px;line-height:1.3">Welcome to Agent UI for Angular updates</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">You'll receive updates on new capabilities, production patterns, and Angular agent best practices. We keep it focused and infrequent — no spam.</p>
<a href="https://cacheplane.ai/docs" style="display:inline-block;background-color:#004090;color:#fff;padding:12px 28px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">Explore the Docs</a>
`,
Expand Down
2 changes: 1 addition & 1 deletion apps/website/lib/resend.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ function getResend(): Resend | null {
}

export const AUDIENCE_ID = process.env.RESEND_AUDIENCE_ID || '';
export const FROM = process.env.RESEND_FROM || 'Angular Agent Framework <hello@cacheplane.io>';
export const FROM = process.env.RESEND_FROM || 'Agent UI for Angular <hello@cacheplane.io>';
export const NOTIFY_TO = process.env.RESEND_NOTIFY_TO || 'hello@cacheplane.io';

/** Send an email via Resend. No-ops when API key is missing. */
Expand Down
2 changes: 1 addition & 1 deletion apps/website/public/AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Angular Agent Framework v0.0.32
# Agent UI for Angular v0.0.32

Agent UI primitives and LangGraph streaming adapters for Angular.

Expand Down
2 changes: 1 addition & 1 deletion apps/website/public/CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Angular Agent Framework v0.0.32
# Agent UI for Angular v0.0.32

Agent UI primitives and LangGraph streaming adapters for Angular.

Expand Down
2 changes: 1 addition & 1 deletion apps/website/public/assets/hero.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions apps/website/scripts/generate-narrative-docs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ const API_DOCS_ROOT = 'apps/website/content/docs';
const TOPICS = [
{
slug: 'introduction',
prompt: 'Write an introduction to the Angular Agent Framework library. Explain what it does, who it is for, and why it exists. Include a minimal getting-started example.',
prompt: 'Write an introduction to the Agent UI for Angular library. Explain what it does, who it is for, and why it exists. Include a minimal getting-started example.',
},
{
slug: 'streaming',
Expand All @@ -36,7 +36,7 @@ async function generateDoc(slug: string, prompt: string, apiDocsJson: string): P
max_tokens: 2048,
messages: [{
role: 'user',
content: `You are writing documentation for the Angular Agent Framework library.
content: `You are writing documentation for the Agent UI for Angular library.
Here is the TypeDoc API reference JSON:\n\n${apiDocsJson}\n\n${prompt}

Write clean, developer-friendly MDX documentation. Use precise, no-fluff prose. Include code examples. Start with a single # heading.`,
Expand Down
2 changes: 1 addition & 1 deletion apps/website/scripts/generate-whitepaper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ if (!process.env['ANTHROPIC_API_KEY'] && loadEnvFile && fs.existsSync('.env')) {
const client = new Anthropic();
const MODEL = process.env['ANTHROPIC_MODEL'] ?? 'claude-opus-4-5';

const CURRENT_API_CONTEXT = `You are writing public technical whitepapers for Cacheplane Angular Agent Framework.
const CURRENT_API_CONTEXT = `You are writing public technical whitepapers for Cacheplane Agent UI for Angular.

Use only the current API surface:
- Package names are @ngaf/langgraph, @ngaf/render, @ngaf/chat, and @ngaf/ag-ui.
Expand Down
2 changes: 1 addition & 1 deletion apps/website/src/app/api/email-preview/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ const TEMPLATES: Record<string, () => { subject: string; html: string }> = {
html: whitepaperDownloadHtml('Brian'),
}),
'newsletter-welcome': () => ({
subject: 'Welcome to Angular Agent Framework updates',
subject: 'Welcome to Agent UI for Angular updates',
html: newsletterWelcomeHtml(),
}),
'lead-notification': () => ({
Expand Down
6 changes: 3 additions & 3 deletions apps/website/src/app/api/leads/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ export async function POST(req: NextRequest) {
const company = sanitize(body.company, 200);
const message = sanitize(body.message, 2000);

if (!name || !email) {
return NextResponse.json({ error: 'name and email required' }, { status: 400 });
if (!email) {
return NextResponse.json({ error: 'email required' }, { status: 400 });
}

const ts = new Date().toISOString();
Expand All @@ -40,7 +40,7 @@ export async function POST(req: NextRequest) {
sendEmail({
from: FROM,
to: NOTIFY_TO,
subject: `New lead: ${name}${company ? ` at ${company}` : ''}`,
subject: `New lead: ${name || email}${company ? ` at ${company}` : ''}`,
html: leadNotificationHtml({ name, email, company, message, ts }),
}),
addToAudience(email, name),
Expand Down
2 changes: 1 addition & 1 deletion apps/website/src/app/api/newsletter/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ export async function POST(req: NextRequest) {
sendEmail({
from: FROM,
to: email,
subject: 'Welcome to Angular Agent Framework updates',
subject: 'Welcome to Agent UI for Angular updates',
html: newsletterWelcomeHtml(),
}),
addToAudience(email),
Expand Down
72 changes: 72 additions & 0 deletions apps/website/src/app/contact/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
// SPDX-License-Identifier: MIT
import type { Metadata } from 'next';
import React, { Suspense } from 'react';
import { tokens } from '@ngaf/design-tokens';
import { Container } from '../../components/ui/Container';
import { Section } from '../../components/ui/Section';
import { Eyebrow } from '../../components/ui/Eyebrow';
import { ContactForm } from '../../components/contact/ContactForm';
import { GitHubStarsPill } from '../../components/contact/GitHubStarsPill';
import { SlaCard } from '../../components/contact/SlaCard';
import { AltChannelRow } from '../../components/contact/AltChannelRow';

export const metadata: Metadata = {
title: 'Talk to an engineer — Cacheplane',
description:
"Tell us what you're shipping. We'll reply within one business day — usually with code, not a calendar invite.",
openGraph: {
title: 'Talk to an engineer — Cacheplane',
description: "Tell us what you're shipping. We'll reply within one business day.",
type: 'website',
},
};

export default function ContactPage() {
return (
<Section surface="canvas" ariaLabelledBy="contact-heading">
<Container>
<div style={{ maxWidth: 720 }}>
<Eyebrow tone="accent" style={{ marginBottom: 16 }}>Contact</Eyebrow>
<h1
id="contact-heading"
style={{
fontFamily: tokens.typography.h1.family,
fontSize: tokens.typography.h1.size,
lineHeight: tokens.typography.h1.line,
fontWeight: 700,
color: tokens.colors.textPrimary,
margin: 0,
marginBottom: 16,
letterSpacing: '-0.02em',
}}
>
Talk to an engineer.
</h1>
<p
style={{
fontFamily: tokens.typography.bodyLg.family,
fontSize: tokens.typography.bodyLg.size,
lineHeight: tokens.typography.bodyLg.line,
color: tokens.colors.textSecondary,
margin: 0,
marginBottom: 24,
maxWidth: '60ch',
}}
>
Tell us what you&apos;re shipping. We&apos;ll reply within one business day — usually with code, not a calendar invite.
</p>
<div style={{ marginBottom: 24 }}>
<SlaCard />
</div>
<Suspense>
<ContactForm />
</Suspense>
<div style={{ marginTop: 32, display: 'flex', flexDirection: 'column', gap: 16 }}>
<GitHubStarsPill />
<AltChannelRow />
</div>
</div>
</Container>
</Section>
);
}
Loading
Loading