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
6 changes: 6 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,12 @@ jobs:
- { angular: cockpit-langgraph-subgraphs-angular, python: cockpit/langgraph/subgraphs/python }
- { angular: cockpit-langgraph-time-travel-angular, python: cockpit/langgraph/time-travel/python }
- { angular: cockpit-langgraph-deployment-runtime-angular, python: cockpit/langgraph/deployment-runtime/python }
- { angular: cockpit-deep-agents-planning-angular, python: cockpit/deep-agents/planning/python }
- { angular: cockpit-deep-agents-filesystem-angular, python: cockpit/deep-agents/filesystem/python }
- { angular: cockpit-deep-agents-subagents-angular, python: cockpit/deep-agents/subagents/python }
- { angular: cockpit-deep-agents-memory-angular, python: cockpit/deep-agents/memory/python }
- { angular: cockpit-deep-agents-skills-angular, python: cockpit/deep-agents/skills/python }
- { angular: cockpit-deep-agents-sandboxes-angular, python: cockpit/deep-agents/sandboxes/python }
steps:
- uses: actions/checkout@v6.0.2
- uses: actions/setup-node@v6.3.0
Expand Down
12 changes: 6 additions & 6 deletions apps/cockpit/scripts/capability-registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,12 @@ export const capabilities: readonly Capability[] = [
{ id: 'subgraphs', product: 'langgraph', topic: 'subgraphs', angularProject: 'cockpit-langgraph-subgraphs-angular', port: 4305, pythonPort: 5305, pythonDir: 'cockpit/langgraph/subgraphs/python', graphName: 'subgraphs' },
{ id: 'time-travel', product: 'langgraph', topic: 'time-travel', angularProject: 'cockpit-langgraph-time-travel-angular', port: 4306, pythonPort: 5306, pythonDir: 'cockpit/langgraph/time-travel/python', graphName: 'time-travel' },
{ id: 'deployment-runtime', product: 'langgraph', topic: 'deployment-runtime', angularProject: 'cockpit-langgraph-deployment-runtime-angular', port: 4307, pythonPort: 5307, pythonDir: 'cockpit/langgraph/deployment-runtime/python', graphName: 'deployment-runtime' },
{ id: 'da-planning', product: 'deep-agents', topic: 'planning', angularProject: 'cockpit-deep-agents-planning-angular', port: 4310, pythonDir: 'cockpit/deep-agents/planning/python', graphName: 'da-planning' },
{ id: 'da-filesystem', product: 'deep-agents', topic: 'filesystem', angularProject: 'cockpit-deep-agents-filesystem-angular', port: 4311, pythonDir: 'cockpit/deep-agents/filesystem/python', graphName: 'da-filesystem' },
{ id: 'da-subagents', product: 'deep-agents', topic: 'subagents', angularProject: 'cockpit-deep-agents-subagents-angular', port: 4312, pythonDir: 'cockpit/deep-agents/subagents/python', graphName: 'subagents' },
{ id: 'da-memory', product: 'deep-agents', topic: 'memory', angularProject: 'cockpit-deep-agents-memory-angular', port: 4313, pythonDir: 'cockpit/deep-agents/memory/python', graphName: 'da-memory' },
{ id: 'da-skills', product: 'deep-agents', topic: 'skills', angularProject: 'cockpit-deep-agents-skills-angular', port: 4314, pythonDir: 'cockpit/deep-agents/skills/python', graphName: 'da-skills' },
{ id: 'da-sandboxes', product: 'deep-agents', topic: 'sandboxes', angularProject: 'cockpit-deep-agents-sandboxes-angular', port: 4315, pythonDir: 'cockpit/deep-agents/sandboxes/python', graphName: 'da-sandboxes' },
{ id: 'da-planning', product: 'deep-agents', topic: 'planning', angularProject: 'cockpit-deep-agents-planning-angular', port: 4310, pythonPort: 5310, pythonDir: 'cockpit/deep-agents/planning/python', graphName: 'da-planning' },
{ id: 'da-filesystem', product: 'deep-agents', topic: 'filesystem', angularProject: 'cockpit-deep-agents-filesystem-angular', port: 4311, pythonPort: 5311, pythonDir: 'cockpit/deep-agents/filesystem/python', graphName: 'da-filesystem' },
{ id: 'da-subagents', product: 'deep-agents', topic: 'subagents', angularProject: 'cockpit-deep-agents-subagents-angular', port: 4312, pythonPort: 5312, pythonDir: 'cockpit/deep-agents/subagents/python', graphName: 'subagents' },
{ id: 'da-memory', product: 'deep-agents', topic: 'memory', angularProject: 'cockpit-deep-agents-memory-angular', port: 4313, pythonPort: 5313, pythonDir: 'cockpit/deep-agents/memory/python', graphName: 'da-memory' },
{ id: 'da-skills', product: 'deep-agents', topic: 'skills', angularProject: 'cockpit-deep-agents-skills-angular', port: 4314, pythonPort: 5314, pythonDir: 'cockpit/deep-agents/skills/python', graphName: 'da-skills' },
{ id: 'da-sandboxes', product: 'deep-agents', topic: 'sandboxes', angularProject: 'cockpit-deep-agents-sandboxes-angular', port: 4315, pythonPort: 5315, pythonDir: 'cockpit/deep-agents/sandboxes/python', graphName: 'da-sandboxes' },
// Render capabilities
{ id: 'r-spec-rendering', product: 'render', topic: 'spec-rendering', angularProject: 'cockpit-render-spec-rendering-angular', port: 4401, pythonDir: 'cockpit/render/spec-rendering/python', graphName: 'r-spec-rendering' },
{ id: 'r-element-rendering', product: 'render', topic: 'element-rendering', angularProject: 'cockpit-render-element-rendering-angular', port: 4402, pythonDir: 'cockpit/render/element-rendering/python', graphName: 'r-element-rendering' },
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// SPDX-License-Identifier: MIT
import { test, expect } from '@playwright/test';
import { submitAndWaitForResponse } from '../../../../../libs/e2e-harness/src';

test('da-filesystem: hello prompt produces assistant turn', async ({ page }) => {
const bubble = await submitAndWaitForResponse(page, 'Hello');
await expect(bubble).toBeVisible();
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"fixtures": [
{
"match": {
"userMessage": "Hello"
},
"response": {
"content": "Hello! How can I help you today? I can read or write files in the workspace\u2014tell me what you'd like to do (e.g., \"read file /path/to/file\" or \"write file /path/to/file with content ...\")."
}
}
]
}
11 changes: 11 additions & 0 deletions cockpit/deep-agents/filesystem/angular/e2e/global-setup-impl.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// SPDX-License-Identifier: MIT
import { resolve } from 'node:path';
import { createGlobalSetup } from '../../../../../libs/e2e-harness/src';

export default createGlobalSetup({
langgraphCwd: 'cockpit/deep-agents/filesystem/python',
langgraphPort: 5311,
angularProject: 'cockpit-deep-agents-filesystem-angular',
angularPort: 4311,
fixturesDir: resolve(__dirname, 'fixtures'),
});
18 changes: 18 additions & 0 deletions cockpit/deep-agents/filesystem/angular/e2e/playwright.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// SPDX-License-Identifier: MIT
import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
testDir: '.',
testMatch: '**/*.spec.ts',
fullyParallel: false,
workers: 1,
retries: process.env.CI ? 2 : 0,
reporter: process.env.CI ? [['list'], ['html', { open: 'never' }]] : 'list',
use: {
baseURL: 'http://localhost:4311',
trace: 'retain-on-failure',
},
projects: [{ name: 'chromium', use: { ...devices['Desktop Chrome'] } }],
globalSetup: './global-setup-impl.ts',
globalTeardown: require.resolve('../../../../../libs/e2e-harness/src/global-teardown'),
});
14 changes: 14 additions & 0 deletions cockpit/deep-agents/filesystem/angular/e2e/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "ES2022",
"moduleResolution": "Bundler",
"esModuleInterop": true,
"strict": true,
"skipLibCheck": true,
"noEmit": true,
"types": ["node"]
},
"include": ["**/*.ts"],
"exclude": ["node_modules", "test-results", "playwright-report"]
}
6 changes: 6 additions & 0 deletions cockpit/deep-agents/filesystem/angular/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,12 @@
"options": {
"command": "npx tsx -e \"import { deepAgentsFilesystemAngularModule } from './cockpit/deep-agents/filesystem/angular/src/index.ts'; const mod = deepAgentsFilesystemAngularModule; if (mod.id !== 'deep-agents-filesystem-angular') throw new Error('Unexpected id: ' + mod.id); if (mod.title !== 'Deep Agents Filesystem (Angular)') throw new Error('Unexpected title: ' + mod.title); console.log(JSON.stringify({ id: mod.id, title: mod.title }));\""
}
},
"e2e": {
"executor": "@nx/playwright:playwright",
"options": {
"config": "cockpit/deep-agents/filesystem/angular/e2e/playwright.config.ts"
}
}
}
}
6 changes: 4 additions & 2 deletions cockpit/deep-agents/filesystem/angular/proxy.conf.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
{
"/api": {
"target": "http://localhost:8123",
"target": "http://localhost:5311",
"secure": false,
"changeOrigin": true,
"pathRewrite": { "^/api": "" },
"pathRewrite": {
"^/api": ""
},
"ws": true
}
}
8 changes: 8 additions & 0 deletions cockpit/deep-agents/memory/angular/e2e/da-memory.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// SPDX-License-Identifier: MIT
import { test, expect } from '@playwright/test';
import { submitAndWaitForResponse } from '../../../../../libs/e2e-harness/src';

test('da-memory: hello prompt produces assistant turn', async ({ page }) => {
const bubble = await submitAndWaitForResponse(page, 'Hello');
await expect(bubble).toBeVisible();
});
18 changes: 18 additions & 0 deletions cockpit/deep-agents/memory/angular/e2e/fixtures/da-memory.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"fixtures": [
{
"match": {
"userMessage": "Hello"
},
"response": {
"content": "Hi \u2014 hello! How can I help you today?"
}
},
{
"match": {},
"response": {
"content": "{}"
}
}
]
}
11 changes: 11 additions & 0 deletions cockpit/deep-agents/memory/angular/e2e/global-setup-impl.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// SPDX-License-Identifier: MIT
import { resolve } from 'node:path';
import { createGlobalSetup } from '../../../../../libs/e2e-harness/src';

export default createGlobalSetup({
langgraphCwd: 'cockpit/deep-agents/memory/python',
langgraphPort: 5313,
angularProject: 'cockpit-deep-agents-memory-angular',
angularPort: 4313,
fixturesDir: resolve(__dirname, 'fixtures'),
});
18 changes: 18 additions & 0 deletions cockpit/deep-agents/memory/angular/e2e/playwright.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// SPDX-License-Identifier: MIT
import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
testDir: '.',
testMatch: '**/*.spec.ts',
fullyParallel: false,
workers: 1,
retries: process.env.CI ? 2 : 0,
reporter: process.env.CI ? [['list'], ['html', { open: 'never' }]] : 'list',
use: {
baseURL: 'http://localhost:4313',
trace: 'retain-on-failure',
},
projects: [{ name: 'chromium', use: { ...devices['Desktop Chrome'] } }],
globalSetup: './global-setup-impl.ts',
globalTeardown: require.resolve('../../../../../libs/e2e-harness/src/global-teardown'),
});
14 changes: 14 additions & 0 deletions cockpit/deep-agents/memory/angular/e2e/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "ES2022",
"moduleResolution": "Bundler",
"esModuleInterop": true,
"strict": true,
"skipLibCheck": true,
"noEmit": true,
"types": ["node"]
},
"include": ["**/*.ts"],
"exclude": ["node_modules", "test-results", "playwright-report"]
}
6 changes: 6 additions & 0 deletions cockpit/deep-agents/memory/angular/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,12 @@
"options": {
"command": "npx tsx -e \"import { deepAgentsMemoryAngularModule } from './cockpit/deep-agents/memory/angular/src/index.ts'; const mod = deepAgentsMemoryAngularModule; if (mod.id !== 'deep-agents-memory-angular') throw new Error('Unexpected id: ' + mod.id); if (mod.title !== 'Deep Agents Memory (Angular)') throw new Error('Unexpected title: ' + mod.title); console.log(JSON.stringify({ id: mod.id, title: mod.title }));\""
}
},
"e2e": {
"executor": "@nx/playwright:playwright",
"options": {
"config": "cockpit/deep-agents/memory/angular/e2e/playwright.config.ts"
}
}
}
}
6 changes: 4 additions & 2 deletions cockpit/deep-agents/memory/angular/proxy.conf.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
{
"/api": {
"target": "http://localhost:8123",
"target": "http://localhost:5313",
"secure": false,
"changeOrigin": true,
"pathRewrite": { "^/api": "" },
"pathRewrite": {
"^/api": ""
},
"ws": true
}
}
8 changes: 8 additions & 0 deletions cockpit/deep-agents/planning/angular/e2e/da-planning.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// SPDX-License-Identifier: MIT
import { test, expect } from '@playwright/test';
import { submitAndWaitForResponse } from '../../../../../libs/e2e-harness/src';

test('da-planning: hello prompt produces assistant turn', async ({ page }) => {
const bubble = await submitAndWaitForResponse(page, 'Hello');
await expect(bubble).toBeVisible();
});
18 changes: 18 additions & 0 deletions cockpit/deep-agents/planning/angular/e2e/fixtures/da-planning.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"fixtures": [
{
"match": {
"userMessage": "Hello"
},
"response": {
"content": "[{\"title\":\"Respond with a friendly greeting\",\"status\":\"pending\"},{\"title\":\"Ask how I can help\",\"status\":\"pending\"},{\"title\":\"Give examples of what I can do\",\"status\":\"pending\"},{\"title\":\"Suggest next steps/questions\",\"status\":\"pending\"}]\n\nStep 1 \u2014 Respond with a friendly greeting (completed):\nHello! Nice to meet you.\n\nStep 2 \u2014 Ask how I can help (completed):\nHow can I help you today?\n\nStep 3 \u2014 Give examples of what I can do (completed):\n- Answer questions or explain concepts\n- Help write or edit email, essays, or code\n- Brainstorm ideas or outline plans\n- Summarize articles or long text\n- Translate or proofread text\n- Solve math problems or debug code\n\nStep 4 \u2014 Suggest next steps/questions (completed):\nYou can tell me what you need right now (a question, a task, or a topic). If you prefer, pick one of the examples above and I\u2019ll get started."
}
},
{
"match": {},
"response": {
"content": "Plan (4 steps)\n1. Ask what you need.\n2. Clarify scope, format, and any constraints (deadline, length, tone, audience).\n3. Offer examples of how I can help and suggest a concrete first deliverable.\n4. Confirm and begin work.\n\nExecution\nStep 1 \u2014 Ask what you need:\nWhat would you like me to do right now?\n\nStep 2 \u2014 Clarify scope and constraints:\nIf you already have something specific, tell me: the goal, desired format (email, essay, code, plan, summary, slides, etc.), length, tone (formal/casual), audience, and any deadline. If you don\u2019t have constraints, say so.\n\nStep 3 \u2014 Examples and a suggested first deliverable:\nHere are quick examples of tasks I can do \u2014 pick one or describe your own:\n- Write or edit an email (provide recipient/context and key points).\n- Draft an essay or article (topic, thesis, word count).\n- Create a project plan or roadmap (objective, timeline).\n- Summarize an article or document (paste text or upload).\n- Debug or write code (language, repo/files, expected behavior).\n- Brainstorm ideas (product names, marketing angles, meeting agendas).\n\nSuggested first deliverable: I can produce a short sample (e.g., a 150\u2013300 word draft, a 5-item plan, or a 1-paragraph summary) so you can confirm style before I expand.\n\nStep 4 \u2014 Confirm and begin:\nTell me which task you want and any constraints, or choose one of the examples above. I\u2019ll start immediately."
}
}
]
}
11 changes: 11 additions & 0 deletions cockpit/deep-agents/planning/angular/e2e/global-setup-impl.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// SPDX-License-Identifier: MIT
import { resolve } from 'node:path';
import { createGlobalSetup } from '../../../../../libs/e2e-harness/src';

export default createGlobalSetup({
langgraphCwd: 'cockpit/deep-agents/planning/python',
langgraphPort: 5310,
angularProject: 'cockpit-deep-agents-planning-angular',
angularPort: 4310,
fixturesDir: resolve(__dirname, 'fixtures'),
});
18 changes: 18 additions & 0 deletions cockpit/deep-agents/planning/angular/e2e/playwright.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// SPDX-License-Identifier: MIT
import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
testDir: '.',
testMatch: '**/*.spec.ts',
fullyParallel: false,
workers: 1,
retries: process.env.CI ? 2 : 0,
reporter: process.env.CI ? [['list'], ['html', { open: 'never' }]] : 'list',
use: {
baseURL: 'http://localhost:4310',
trace: 'retain-on-failure',
},
projects: [{ name: 'chromium', use: { ...devices['Desktop Chrome'] } }],
globalSetup: './global-setup-impl.ts',
globalTeardown: require.resolve('../../../../../libs/e2e-harness/src/global-teardown'),
});
14 changes: 14 additions & 0 deletions cockpit/deep-agents/planning/angular/e2e/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "ES2022",
"moduleResolution": "Bundler",
"esModuleInterop": true,
"strict": true,
"skipLibCheck": true,
"noEmit": true,
"types": ["node"]
},
"include": ["**/*.ts"],
"exclude": ["node_modules", "test-results", "playwright-report"]
}
6 changes: 6 additions & 0 deletions cockpit/deep-agents/planning/angular/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,12 @@
"options": {
"command": "npx tsx -e \"import { deepAgentsPlanningAngularModule } from './cockpit/deep-agents/planning/angular/src/index.ts'; const mod = deepAgentsPlanningAngularModule; if (mod.id !== 'deep-agents-planning-angular') throw new Error('Unexpected id: ' + mod.id); if (mod.title !== 'Deep Agents Planning (Angular)') throw new Error('Unexpected title: ' + mod.title); console.log(JSON.stringify({ id: mod.id, title: mod.title }));\""
}
},
"e2e": {
"executor": "@nx/playwright:playwright",
"options": {
"config": "cockpit/deep-agents/planning/angular/e2e/playwright.config.ts"
}
}
}
}
6 changes: 4 additions & 2 deletions cockpit/deep-agents/planning/angular/proxy.conf.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
{
"/api": {
"target": "http://localhost:8123",
"target": "http://localhost:5310",
"secure": false,
"changeOrigin": true,
"pathRewrite": { "^/api": "" },
"pathRewrite": {
"^/api": ""
},
"ws": true
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// SPDX-License-Identifier: MIT
import { test, expect } from '@playwright/test';
import { submitAndWaitForResponse } from '../../../../../libs/e2e-harness/src';

test('da-sandboxes: hello prompt produces assistant turn', async ({ page }) => {
const bubble = await submitAndWaitForResponse(page, 'Hello');
await expect(bubble).toBeVisible();
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"fixtures": [
{
"match": {
"userMessage": "Hello"
},
"response": {
"content": "Hello! How can I help you today?"
}
}
]
}
11 changes: 11 additions & 0 deletions cockpit/deep-agents/sandboxes/angular/e2e/global-setup-impl.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// SPDX-License-Identifier: MIT
import { resolve } from 'node:path';
import { createGlobalSetup } from '../../../../../libs/e2e-harness/src';

export default createGlobalSetup({
langgraphCwd: 'cockpit/deep-agents/sandboxes/python',
langgraphPort: 5315,
angularProject: 'cockpit-deep-agents-sandboxes-angular',
angularPort: 4315,
fixturesDir: resolve(__dirname, 'fixtures'),
});
18 changes: 18 additions & 0 deletions cockpit/deep-agents/sandboxes/angular/e2e/playwright.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// SPDX-License-Identifier: MIT
import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
testDir: '.',
testMatch: '**/*.spec.ts',
fullyParallel: false,
workers: 1,
retries: process.env.CI ? 2 : 0,
reporter: process.env.CI ? [['list'], ['html', { open: 'never' }]] : 'list',
use: {
baseURL: 'http://localhost:4315',
trace: 'retain-on-failure',
},
projects: [{ name: 'chromium', use: { ...devices['Desktop Chrome'] } }],
globalSetup: './global-setup-impl.ts',
globalTeardown: require.resolve('../../../../../libs/e2e-harness/src/global-teardown'),
});
Loading
Loading