diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 528a7fb40..aa1113a2e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -102,7 +102,7 @@ jobs: node-version: 22 cache: npm - run: npm ci - - run: npx tsx apps/cockpit/scripts/deploy-smoke.ts --url https://cockpit.stream-resource.dev --dry-run + - run: npx tsx apps/cockpit/scripts/deploy-smoke.ts --url https://cockpit.cacheplane.ai --dry-run mcp: name: MCP — build / smoke @@ -239,7 +239,7 @@ jobs: if: steps.affected.outputs.website == 'true' run: npx nx e2e website --skip-nx-cache env: - BASE_URL: https://stream-resource.dev + BASE_URL: https://cacheplane.ai - name: Prepare cockpit Vercel project if: steps.affected.outputs.cockpit == 'true' run: | @@ -259,7 +259,7 @@ jobs: - name: Verify deployed cockpit if: steps.affected.outputs.cockpit == 'true' run: | - npx tsx apps/cockpit/scripts/deploy-smoke.ts --url https://cockpit.stream-resource.dev --retries 20 --retry-delay-ms 5000 + npx tsx apps/cockpit/scripts/deploy-smoke.ts --url https://cockpit.cacheplane.ai --retries 20 --retry-delay-ms 5000 # ── Angular examples deploy ────────────────────────────────────────── - name: Check if examples changed @@ -314,6 +314,6 @@ jobs: - name: Run production smoke tests run: npx playwright test apps/cockpit/e2e/production-smoke.spec.ts --reporter=list env: - BASE_URL: https://cockpit.stream-resource.dev - EXAMPLES_URL: https://examples.stream-resource.dev + BASE_URL: https://cockpit.cacheplane.ai + EXAMPLES_URL: https://examples.cacheplane.ai OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} diff --git a/COMMERCIAL.md b/COMMERCIAL.md index 7fe244ca5..8ab6900dd 100644 --- a/COMMERCIAL.md +++ b/COMMERCIAL.md @@ -23,7 +23,7 @@ Any use in a for-profit product, service, or organization requires a paid commer ## Purchase or inquire -- Website: https://stream-resource.dev/pricing +- Website: https://cacheplane.ai/pricing - Email: hello@cacheplane.ai See [`LICENSE-COMMERCIAL`](./LICENSE-COMMERCIAL) for the full commercial license terms. diff --git a/README.md b/README.md index 1ef81f2df..0452fc388 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
Whitepaper Follow-up Did you get a chance to read Chapter 3? Chapter 3 covers tool-call rendering — how to surface agent actions as real UI instead of raw JSON. It's the chapter most teams bookmark first. Production Readiness The gap between demo and production Half of GenAI projects die after proof of concept. The gap isn't the model — it's the frontend production path: streaming state, thread persistence, human approval flows, and deterministic testing. Month 1 · First agent in staging Month 3 · Production deployment Angular Agent Framework — Signal-native streaming for LangGraph. Welcome to Angular Agent Framework updates You'll receive updates on new capabilities, production patterns, and Angular agent best practices. We keep it focused and infrequent — no spam.
@@ -17,7 +17,7 @@
-
+
@@ -110,7 +110,7 @@ That's it. `chat.messages()` is an Angular Signal. Bind it directly in your temp
@@ -129,17 +129,17 @@ That's it. `chat.messages()` is an Angular Signal. Bind it directly in your temp
| **Application Deployment** | $2,000 / app | One-time per application — covers dev, staging, and prod |
| **Enterprise** | Custom | Volume licensing, priority support, custom contract |
-[Full pricing details and license terms →](https://stream-resource.dev/pricing)
+[Full pricing details and license terms →](https://cacheplane.ai/pricing)
---
## Documentation
-- [Getting Started](https://stream-resource.dev/docs/getting-started)
-- [API Reference](https://stream-resource.dev/api-reference)
-- [Testing with MockAgentTransport](https://stream-resource.dev/docs/testing)
-- [Human-in-the-Loop / Interrupts](https://stream-resource.dev/docs/interrupts)
-- [Subagent Streaming](https://stream-resource.dev/docs/subagents)
+- [Getting Started](https://cacheplane.ai/docs/getting-started)
+- [API Reference](https://cacheplane.ai/api-reference)
+- [Testing with MockAgentTransport](https://cacheplane.ai/docs/testing)
+- [Human-in-the-Loop / Interrupts](https://cacheplane.ai/docs/interrupts)
+- [Subagent Streaming](https://cacheplane.ai/docs/subagents)
---
@@ -150,4 +150,4 @@ That's it. `chat.messages()` is an Angular Signal. Bind it directly in your temp
- **PolyForm Noncommercial 1.0.0** — free for noncommercial use (personal projects, academic, research, non-profit internal tooling). See [`LICENSE`](./LICENSE).
- **Angular Agent Framework Commercial License** — required for any for-profit or revenue-generating use. See [`LICENSE-COMMERCIAL`](./LICENSE-COMMERCIAL) and [`COMMERCIAL.md`](./COMMERCIAL.md).
-This is **not** an open-source license. Commercial use — including use in a for-profit product, service, or organization — requires a paid commercial license. See [pricing](https://stream-resource.dev/pricing).
+This is **not** an open-source license. Commercial use — including use in a for-profit product, service, or organization — requires a paid commercial license. See [pricing](https://cacheplane.ai/pricing).
diff --git a/apps/cockpit/e2e/production-smoke.spec.ts b/apps/cockpit/e2e/production-smoke.spec.ts
index 7f00dbad9..fd78774e3 100644
--- a/apps/cockpit/e2e/production-smoke.spec.ts
+++ b/apps/cockpit/e2e/production-smoke.spec.ts
@@ -4,16 +4,16 @@ import { expect, test } from '@playwright/test';
* Production smoke test — verifies the deployed stack works end-to-end.
*
* Requires:
- * EXAMPLES_URL - e.g., https://examples.stream-resource.dev
+ * EXAMPLES_URL - e.g., https://examples.cacheplane.ai
* OPENAI_API_KEY - for send/receive tests (optional)
*
* Run:
- * BASE_URL=https://cockpit.stream-resource.dev \
- * EXAMPLES_URL=https://examples.stream-resource.dev \
+ * BASE_URL=https://cockpit.cacheplane.ai \
+ * EXAMPLES_URL=https://examples.cacheplane.ai \
* npx playwright test apps/cockpit/e2e/production-smoke.spec.ts
*/
-const EXAMPLES_URL = process.env['EXAMPLES_URL'] ?? 'https://examples.stream-resource.dev';
+const EXAMPLES_URL = process.env['EXAMPLES_URL'] ?? 'https://examples.cacheplane.ai';
const CAPABILITIES = [
'langgraph/streaming',
diff --git a/apps/cockpit/scripts/deploy-smoke.spec.ts b/apps/cockpit/scripts/deploy-smoke.spec.ts
index b00c951a8..9c1720157 100644
--- a/apps/cockpit/scripts/deploy-smoke.spec.ts
+++ b/apps/cockpit/scripts/deploy-smoke.spec.ts
@@ -6,7 +6,7 @@ describe('deploy smoke helper', () => {
expect(
parseDeploySmokeArgs([
'--url',
- 'https://cockpit.stream-resource.dev',
+ 'https://cockpit.cacheplane.ai',
'--dry-run',
'--retries',
'5',
@@ -14,7 +14,7 @@ describe('deploy smoke helper', () => {
'1000',
])
).toEqual({
- url: 'https://cockpit.stream-resource.dev',
+ url: 'https://cockpit.cacheplane.ai',
expectedTitle: 'Cockpit',
dryRun: true,
retries: 5,
@@ -25,11 +25,11 @@ describe('deploy smoke helper', () => {
it('formats dry-run output without performing a network request', async () => {
await expect(
runDeploySmoke({
- url: 'https://cockpit.stream-resource.dev',
+ url: 'https://cockpit.cacheplane.ai',
expectedTitle: 'Cockpit',
dryRun: true,
})
- ).resolves.toBe('dry-run:https://cockpit.stream-resource.dev:Cockpit');
+ ).resolves.toBe('dry-run:https://cockpit.cacheplane.ai:Cockpit');
});
it('retries until the deployment responds with the expected title', async () => {
@@ -46,13 +46,13 @@ describe('deploy smoke helper', () => {
await expect(
runDeploySmoke({
- url: 'https://cockpit.stream-resource.dev',
+ url: 'https://cockpit.cacheplane.ai',
retries: 1,
retryDelayMs: 1,
fetchImpl,
sleep,
})
- ).resolves.toBe('pass:https://cockpit.stream-resource.dev:Cockpit');
+ ).resolves.toBe('pass:https://cockpit.cacheplane.ai:Cockpit');
expect(fetchImpl).toHaveBeenCalledTimes(2);
expect(sleep).toHaveBeenCalledTimes(1);
diff --git a/apps/cockpit/src/lib/content-bundle.spec.ts b/apps/cockpit/src/lib/content-bundle.spec.ts
index 6de2f442f..1e61d58a9 100644
--- a/apps/cockpit/src/lib/content-bundle.spec.ts
+++ b/apps/cockpit/src/lib/content-bundle.spec.ts
@@ -28,10 +28,10 @@ describe('resolveRuntimeUrl', () => {
});
it('uses NEXT_PUBLIC_COCKPIT_RUNTIME_BASE_URL when set', () => {
- vi.stubEnv('NEXT_PUBLIC_COCKPIT_RUNTIME_BASE_URL', 'https://examples.stream-resource.dev');
+ vi.stubEnv('NEXT_PUBLIC_COCKPIT_RUNTIME_BASE_URL', 'https://examples.cacheplane.ai');
expect(
resolveRuntimeUrl({ runtimeUrl: 'langgraph/streaming', devPort: 4300 })
- ).toBe('https://examples.stream-resource.dev/langgraph/streaming');
+ ).toBe('https://examples.cacheplane.ai/langgraph/streaming');
});
it('falls back to localhost with devPort when no env var is set', () => {
@@ -49,7 +49,7 @@ describe('resolveRuntimeUrl', () => {
});
it('returns null when runtimeUrl is undefined even with env var set', () => {
- vi.stubEnv('NEXT_PUBLIC_COCKPIT_RUNTIME_BASE_URL', 'https://examples.stream-resource.dev');
+ vi.stubEnv('NEXT_PUBLIC_COCKPIT_RUNTIME_BASE_URL', 'https://examples.cacheplane.ai');
expect(
resolveRuntimeUrl({ runtimeUrl: undefined, devPort: undefined })
).toBeNull();
diff --git a/apps/website/content/docs/render/api/views.mdx b/apps/website/content/docs/render/api/views.mdx
new file mode 100644
index 000000000..9e88f82fc
--- /dev/null
+++ b/apps/website/content/docs/render/api/views.mdx
@@ -0,0 +1,135 @@
+---
+title: views()
+description: Create and compose view registries for generative UI rendering
+---
+
+# views()
+
+Creates an immutable view registry mapping names to Angular components. Views are rendered inline in the chat when the agent produces a JSON spec.
+
+## Usage
+
+```typescript
+import { views } from '@cacheplane/render';
+
+const ui = views({
+ 'plan-checklist': PlanChecklistComponent,
+ 'file-preview': FilePreviewComponent,
+ 'code-output': CodeOutputComponent,
+});
+```
+
+Pass to the chat component:
+
+```html
+
{{ title() }}
+ {{ title() }}
+