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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 6 additions & 0 deletions .claude/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@
"runtimeExecutable": "/bin/bash",
"runtimeArgs": ["-c", "export PATH=/Users/blove/.nvm/versions/node/v22.14.0/bin:$PATH && npx nx serve website"],
"port": 3000
},
{
"name": "cockpit",
"runtimeExecutable": "/bin/bash",
"runtimeArgs": ["-c", "export PATH=/Users/blove/.nvm/versions/node/v22.14.0/bin:$PATH && npx nx serve cockpit --port 4201"],
"port": 4201
}
]
}
14 changes: 13 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,18 @@ jobs:
- run: npx nx build cockpit --skip-nx-cache
- run: npx nx test cockpit --skip-nx-cache

cockpit-examples-build:
name: Cockpit — build all examples
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6.0.2
- uses: actions/setup-node@v6.3.0
with:
node-version: 22
cache: npm
- run: npm ci
- run: npx nx run-many -t build --projects='cockpit-*-angular' --skip-nx-cache

cockpit-smoke:
name: Cockpit — representative capability smoke
runs-on: ubuntu-latest
Expand Down Expand Up @@ -150,7 +162,7 @@ jobs:

deploy:
name: Deploy → Vercel
needs: [library, website, cockpit, cockpit-smoke, cockpit-secret-integration, cockpit-deploy-smoke, mcp, chat-agent-smoke, cockpit-e2e, website-e2e]
needs: [library, website, cockpit, cockpit-examples-build, cockpit-smoke, cockpit-secret-integration, cockpit-deploy-smoke, mcp, chat-agent-smoke, cockpit-e2e, website-e2e]
runs-on: ubuntu-latest
# Only deploy on pushes to main, not on pull requests
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
Expand Down
67 changes: 67 additions & 0 deletions .github/workflows/deploy-langgraph.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
name: Deploy LangGraph

on:
push:
branches: [main]
paths:
- 'cockpit/**/python/**'
workflow_dispatch:
inputs:
capability:
description: 'Capability path (e.g., langgraph/streaming)'
required: false
type: string

jobs:
deploy:
name: Deploy to LangGraph Cloud
runs-on: ubuntu-latest
strategy:
matrix:
include:
- name: langgraph-streaming
path: cockpit/langgraph/streaming/python
- name: langgraph-persistence
path: cockpit/langgraph/persistence/python
- name: langgraph-interrupts
path: cockpit/langgraph/interrupts/python
- name: langgraph-memory
path: cockpit/langgraph/memory/python
- name: langgraph-durable-execution
path: cockpit/langgraph/durable-execution/python
- name: langgraph-subgraphs
path: cockpit/langgraph/subgraphs/python
- name: langgraph-time-travel
path: cockpit/langgraph/time-travel/python
- name: langgraph-deployment-runtime
path: cockpit/langgraph/deployment-runtime/python
- name: deep-agents-planning
path: cockpit/deep-agents/planning/python
- name: deep-agents-filesystem
path: cockpit/deep-agents/filesystem/python
- name: deep-agents-subagents
path: cockpit/deep-agents/subagents/python
- name: deep-agents-memory
path: cockpit/deep-agents/memory/python
- name: deep-agents-skills
path: cockpit/deep-agents/skills/python
- name: deep-agents-sandboxes
path: cockpit/deep-agents/sandboxes/python
steps:
- uses: actions/checkout@v6.0.2

- uses: actions/setup-python@v5
with:
python-version: '3.12'

- name: Install langgraph-cli
run: pip install langgraph-cli

- name: Deploy ${{ matrix.name }}
if: |
github.event_name == 'workflow_dispatch' && (inputs.capability == '' || contains(matrix.path, inputs.capability))
|| github.event_name == 'push'
working-directory: ${{ matrix.path }}
run: langgraph deploy
env:
LANGSMITH_API_KEY: ${{ secrets.LANGSMITH_API_KEY }}
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,10 @@ apps/website/public/demo/
.next
out
.vercel

# LangGraph
.langgraph_api/
langgraph-combined.json

# Playwright
test-results/
65 changes: 65 additions & 0 deletions apps/cockpit/e2e/all-examples-smoke.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import { expect, test } from '@playwright/test';

/**
* Smoke test that verifies every capability example's Angular app is running
* and can render the chat interface. Requires all 14 Angular apps to be served.
*
* Run with: npx playwright test apps/cockpit/e2e/all-examples-smoke.spec.ts
*
* Prerequisites:
* npx tsx apps/cockpit/scripts/serve-example.ts --all
* OR: nx run cockpit:serve-all
*/

const EXAMPLES = [
{ name: 'streaming', port: 4300, selector: 'app-streaming' },
{ name: 'persistence', port: 4301, selector: 'app-persistence' },
{ name: 'interrupts', port: 4302, selector: 'app-interrupts' },
{ name: 'memory', port: 4303, selector: 'app-memory' },
{ name: 'durable-execution', port: 4304, selector: 'app-durable-execution' },
{ name: 'subgraphs', port: 4305, selector: 'app-subgraphs' },
{ name: 'time-travel', port: 4306, selector: 'app-time-travel' },
{ name: 'deployment-runtime', port: 4307, selector: 'app-deployment-runtime' },
{ name: 'planning', port: 4310, selector: 'app-planning' },
{ name: 'filesystem', port: 4311, selector: 'app-filesystem' },
{ name: 'da-subagents', port: 4312, selector: 'app-subagents' },
{ name: 'da-memory', port: 4313, selector: 'app-da-memory' },
{ name: 'skills', port: 4314, selector: 'app-skills' },
{ name: 'sandboxes', port: 4315, selector: 'app-sandboxes' },
] as const;

test.describe('All Examples Smoke Test', () => {
for (const example of EXAMPLES) {
test(`${example.name} (port ${example.port}) renders chat UI`, async ({ page }) => {
await page.goto(`http://localhost:${example.port}`, { timeout: 15000 });
await page.waitForSelector(example.selector, { state: 'attached', timeout: 10000 });

// Verify the chat component renders
await expect(page.locator('cp-chat')).toBeVisible({ timeout: 5000 });

// Verify input and send button exist
await expect(page.locator('input[name="prompt"]')).toBeVisible({ timeout: 5000 });
await expect(page.locator('button[type="submit"]')).toBeVisible({ timeout: 5000 });
});
}
});

test.describe('All Examples Send Message Test', () => {
// This test requires a running LangGraph backend with OPENAI_API_KEY
test.skip(({ }, testInfo) => !process.env['OPENAI_API_KEY'], 'Requires OPENAI_API_KEY');

for (const example of EXAMPLES) {
test(`${example.name} (port ${example.port}) sends and receives a message`, async ({ page }) => {
await page.goto(`http://localhost:${example.port}`, { timeout: 15000 });
await page.waitForSelector(example.selector, { state: 'attached', timeout: 10000 });

// Type and send a message
await page.fill('input[name="prompt"]', 'hello');
await page.click('button[type="submit"]');

// Wait for AI response
await expect(page.locator('.cp-message--ai, [class*="message--ai"]')).toBeVisible({ timeout: 30000 });
await expect(page.locator('.cp-message--ai .cp-message__content, [class*="message__content"]')).not.toBeEmpty({ timeout: 30000 });
});
}
});
8 changes: 7 additions & 1 deletion apps/cockpit/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,14 @@
"version": "0.0.1",
"private": true,
"dependencies": {
"@radix-ui/react-slot": "^1.1.0",
"@radix-ui/react-tabs": "^1.1.0",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
"marked": "^15.0.0",
"next": "~16.1.6",
"react": "^19.0.0",
"react-dom": "^19.0.0"
"react-dom": "^19.0.0",
"tailwind-merge": "^2.5.0"
}
}
6 changes: 6 additions & 0 deletions apps/cockpit/postcss.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// apps/cockpit/postcss.config.mjs
export default {
plugins: {
'@tailwindcss/postcss': {},
},
};
161 changes: 161 additions & 0 deletions apps/cockpit/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,167 @@
"options": {
"config": "apps/cockpit/playwright.config.ts"
}
},
"serve-streaming": {
"executor": "nx:run-commands",
"options": {
"commands": [
"npx nx serve cockpit --port 4201",
"npx nx serve cockpit-langgraph-streaming-angular --port 4300",
"cd cockpit/langgraph/streaming/python && source $HOME/.local/bin/env 2>/dev/null; uv sync && uv run langgraph dev --port 8123"
],
"parallel": true
}
},
"serve-persistence": {
"executor": "nx:run-commands",
"options": {
"commands": [
"npx nx serve cockpit --port 4201",
"npx nx serve cockpit-langgraph-persistence-angular --port 4301",
"cd cockpit/langgraph/persistence/python && source $HOME/.local/bin/env 2>/dev/null; uv sync && uv run langgraph dev --port 8123"
],
"parallel": true
}
},
"serve-interrupts": {
"executor": "nx:run-commands",
"options": {
"commands": [
"npx nx serve cockpit --port 4201",
"npx nx serve cockpit-langgraph-interrupts-angular --port 4302",
"cd cockpit/langgraph/interrupts/python && source $HOME/.local/bin/env 2>/dev/null; uv sync && uv run langgraph dev --port 8123"
],
"parallel": true
}
},
"serve-memory": {
"executor": "nx:run-commands",
"options": {
"commands": [
"npx nx serve cockpit --port 4201",
"npx nx serve cockpit-langgraph-memory-angular --port 4303",
"cd cockpit/langgraph/memory/python && source $HOME/.local/bin/env 2>/dev/null; uv sync && uv run langgraph dev --port 8123"
],
"parallel": true
}
},
"serve-durable-execution": {
"executor": "nx:run-commands",
"options": {
"commands": [
"npx nx serve cockpit --port 4201",
"npx nx serve cockpit-langgraph-durable-execution-angular --port 4304",
"cd cockpit/langgraph/durable-execution/python && source $HOME/.local/bin/env 2>/dev/null; uv sync && uv run langgraph dev --port 8123"
],
"parallel": true
}
},
"serve-subgraphs": {
"executor": "nx:run-commands",
"options": {
"commands": [
"npx nx serve cockpit --port 4201",
"npx nx serve cockpit-langgraph-subgraphs-angular --port 4305",
"cd cockpit/langgraph/subgraphs/python && source $HOME/.local/bin/env 2>/dev/null; uv sync && uv run langgraph dev --port 8123"
],
"parallel": true
}
},
"serve-time-travel": {
"executor": "nx:run-commands",
"options": {
"commands": [
"npx nx serve cockpit --port 4201",
"npx nx serve cockpit-langgraph-time-travel-angular --port 4306",
"cd cockpit/langgraph/time-travel/python && source $HOME/.local/bin/env 2>/dev/null; uv sync && uv run langgraph dev --port 8123"
],
"parallel": true
}
},
"serve-deployment-runtime": {
"executor": "nx:run-commands",
"options": {
"commands": [
"npx nx serve cockpit --port 4201",
"npx nx serve cockpit-langgraph-deployment-runtime-angular --port 4307",
"cd cockpit/langgraph/deployment-runtime/python && source $HOME/.local/bin/env 2>/dev/null; uv sync && uv run langgraph dev --port 8123"
],
"parallel": true
}
},
"serve-planning": {
"executor": "nx:run-commands",
"options": {
"commands": [
"npx nx serve cockpit --port 4201",
"npx nx serve cockpit-deep-agents-planning-angular --port 4310",
"cd cockpit/deep-agents/planning/python && source $HOME/.local/bin/env 2>/dev/null; uv sync && uv run langgraph dev --port 8123"
],
"parallel": true
}
},
"serve-filesystem": {
"executor": "nx:run-commands",
"options": {
"commands": [
"npx nx serve cockpit --port 4201",
"npx nx serve cockpit-deep-agents-filesystem-angular --port 4311",
"cd cockpit/deep-agents/filesystem/python && source $HOME/.local/bin/env 2>/dev/null; uv sync && uv run langgraph dev --port 8123"
],
"parallel": true
}
},
"serve-da-subagents": {
"executor": "nx:run-commands",
"options": {
"commands": [
"npx nx serve cockpit --port 4201",
"npx nx serve cockpit-deep-agents-subagents-angular --port 4312",
"cd cockpit/deep-agents/subagents/python && source $HOME/.local/bin/env 2>/dev/null; uv sync && uv run langgraph dev --port 8123"
],
"parallel": true
}
},
"serve-da-memory": {
"executor": "nx:run-commands",
"options": {
"commands": [
"npx nx serve cockpit --port 4201",
"npx nx serve cockpit-deep-agents-memory-angular --port 4313",
"cd cockpit/deep-agents/memory/python && source $HOME/.local/bin/env 2>/dev/null; uv sync && uv run langgraph dev --port 8123"
],
"parallel": true
}
},
"serve-skills": {
"executor": "nx:run-commands",
"options": {
"commands": [
"npx nx serve cockpit --port 4201",
"npx nx serve cockpit-deep-agents-skills-angular --port 4314",
"cd cockpit/deep-agents/skills/python && source $HOME/.local/bin/env 2>/dev/null; uv sync && uv run langgraph dev --port 8123"
],
"parallel": true
}
},
"serve-sandboxes": {
"executor": "nx:run-commands",
"options": {
"commands": [
"npx nx serve cockpit --port 4201",
"npx nx serve cockpit-deep-agents-sandboxes-angular --port 4315",
"cd cockpit/deep-agents/sandboxes/python && source $HOME/.local/bin/env 2>/dev/null; uv sync && uv run langgraph dev --port 8123"
],
"parallel": true
}
},
"serve-all": {
"executor": "nx:run-commands",
"options": {
"command": "npx tsx apps/cockpit/scripts/serve-example.ts --all",
"cwd": "."
}
}
}
}
Loading
Loading