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

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions apps/website/e2e/website.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,13 @@ test('/llms.txt returns plain text', async ({ page }) => {
const response = await page.goto('/llms.txt');
expect(response?.headers()['content-type']).toContain('text/plain');
});

test('marketing pages do not link to retired whitepaper PDFs', async ({ page }) => {
for (const route of ['/', '/angular', '/render', '/chat', '/pilot-to-prod', '/solutions']) {
await page.goto(route);
const retiredLinks = await page.locator('a[href$=".pdf"]').evaluateAll(links =>
links.map(link => link.getAttribute('href')).filter(Boolean),
);
expect(retiredLinks, `${route} has retired PDF links`).toEqual([]);
}
});
6 changes: 3 additions & 3 deletions apps/website/emails/angular-download.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { wrapEmail, esc } from './email-wrapper';

const DOWNLOAD_URL = 'https://cacheplane.ai/whitepapers/angular.pdf';
const DOCS_URL = 'https://cacheplane.ai/docs/agent/api/agent';

export function angularDownloadHtml(name?: string): string {
return wrapEmail({
body: `
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 8px;line-height:1.3">Your Enterprise Guide to Agent Streaming</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">${name ? `Hi ${esc(name)}, t` : 'T'}he guide covers six chapters: the last-mile problem, the agent() API, thread persistence, interrupt flows, full LangGraph feature coverage, and deterministic testing.</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">${name ? `Hi ${esc(name)}, t` : 'T'}he guide is being refreshed to match the current @ngaf/langgraph API. We will send the updated version when it is ready. In the meantime, start with the current agent() reference.</p>
<div style="text-align:center;margin:0 0 4px">
<a href="${DOWNLOAD_URL}" style="display:inline-block;background-color:#004090;color:#fff;padding:12px 32px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">Download the Guide</a>
<a href="${DOCS_URL}" style="display:inline-block;background-color:#004090;color:#fff;padding:12px 32px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">Read the agent() Docs</a>
</div>
`,
});
Expand Down
6 changes: 3 additions & 3 deletions apps/website/emails/chat-download.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { wrapEmail, esc } from './email-wrapper';

const DOWNLOAD_URL = 'https://cacheplane.ai/whitepapers/chat.pdf';
const DOCS_URL = 'https://cacheplane.ai/docs/chat/components/chat';

export function chatDownloadHtml(name?: string): string {
return wrapEmail({
body: `
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 8px;line-height:1.3">Your Enterprise Guide to Agent Chat Interfaces</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">${name ? `Hi ${esc(name)}, t` : 'T'}he guide covers five chapters: the sprint tax, batteries-included components, theming and design system integration, generative UI in chat, and debug tooling.</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">${name ? `Hi ${esc(name)}, t` : 'T'}he guide is being refreshed to match the current @ngaf/chat API. We will send the updated version when it is ready. In the meantime, the current chat component docs are live.</p>
<div style="text-align:center;margin:0 0 4px">
<a href="${DOWNLOAD_URL}" style="display:inline-block;background-color:#5a00c8;color:#fff;padding:12px 32px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">Download the Guide</a>
<a href="${DOCS_URL}" style="display:inline-block;background-color:#5a00c8;color:#fff;padding:12px 32px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">Read the Chat Docs</a>
</div>
`,
});
Expand Down
2 changes: 1 addition & 1 deletion apps/website/emails/drip-whitepaper-followup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export function dripWhitepaperFollowupHtml(day: number): { subject: string; html
<p style="font-size:11px;font-family:monospace;text-transform:uppercase;letter-spacing:0.08em;color:#004090;font-weight:700;margin:0 0 8px">Whitepaper Follow-up</p>
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 14px;line-height:1.3">Did you get a chance to read Chapter 3?</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">Chapter 3 covers <strong>tool-call rendering</strong> — how to surface agent actions as real UI instead of raw JSON. It's the chapter most teams bookmark first.</p>
<a href="https://cacheplane.ai/whitepaper.pdf" style="display:inline-block;background-color:#004090;color:#fff;padding:12px 28px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">Read the Guide →</a>
<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">Read the Current Docs →</a>
`,
showUnsubscribe: true,
}),
Expand Down
6 changes: 3 additions & 3 deletions apps/website/emails/render-download.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { wrapEmail, esc } from './email-wrapper';

const DOWNLOAD_URL = 'https://cacheplane.ai/whitepapers/render.pdf';
const DOCS_URL = 'https://cacheplane.ai/docs/render/getting-started/introduction';

export function renderDownloadHtml(name?: string): string {
return wrapEmail({
body: `
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 8px;line-height:1.3">Your Enterprise Guide to Generative UI</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">${name ? `Hi ${esc(name)}, t` : 'T'}he guide covers five chapters: the coupling problem, declarative UI specs with Vercel's json-render standard, the component registry, streaming JSON patches, and state management.</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">${name ? `Hi ${esc(name)}, t` : 'T'}he guide is being refreshed to match the current @ngaf/render API. We will send the updated version when it is ready. In the meantime, the current render docs are live.</p>
<div style="text-align:center;margin:0 0 4px">
<a href="${DOWNLOAD_URL}" style="display:inline-block;background-color:#1a7a40;color:#fff;padding:12px 32px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">Download the Guide</a>
<a href="${DOCS_URL}" style="display:inline-block;background-color:#1a7a40;color:#fff;padding:12px 32px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">Read the Render Docs</a>
</div>
`,
});
Expand Down
6 changes: 3 additions & 3 deletions apps/website/emails/whitepaper-download.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { wrapEmail, esc } from './email-wrapper';

const DOWNLOAD_URL = 'https://cacheplane.ai/whitepaper.pdf';
const DOCS_URL = 'https://cacheplane.ai/docs';

export function whitepaperDownloadHtml(name?: string): string {
return wrapEmail({
body: `
<p style="font-size:20px;font-weight:700;color:#1a1a2e;margin:0 0 8px;line-height:1.3">Your Angular Agent Readiness Guide</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">${name ? `Hi ${esc(name)}, t` : 'T'}he guide covers six production-readiness dimensions: streaming state, thread persistence, tool-call rendering, human approval flows, generative UI, and deterministic testing.</p>
<p style="font-size:14px;color:#555770;line-height:1.7;margin:0 0 24px">${name ? `Hi ${esc(name)}, t` : 'T'}he guide is being refreshed to match the current Angular Agent Framework API. We will send the updated version when it is ready. In the meantime, the docs cover the current agent(), chat, render, and AG-UI surfaces.</p>
<div style="text-align:center;margin:0 0 4px">
<a href="${DOWNLOAD_URL}" style="display:inline-block;background-color:#004090;color:#fff;padding:12px 32px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">Download the Guide</a>
<a href="${DOCS_URL}" style="display:inline-block;background-color:#004090;color:#fff;padding:12px 32px;border-radius:8px;font-size:14px;font-weight:700;text-decoration:none">Read the Current Docs</a>
</div>
`,
});
Expand Down
167 changes: 0 additions & 167 deletions apps/website/public/whitepaper-preview.html

This file was deleted.

Binary file removed apps/website/public/whitepaper.pdf
Binary file not shown.
Loading
Loading