Skip to content
Open
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
26 changes: 21 additions & 5 deletions .github/workflows/desktop-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,17 @@ permissions:

jobs:
build-macos:
runs-on: macos-latest
strategy:
fail-fast: false
matrix:
include:
- os: macos-13
arch: x64
build_script: build:mac:x64
- os: macos-latest
arch: arm64
build_script: build:mac:arm64
runs-on: ${{ matrix.os }}
defaults:
run:
working-directory: packages/launcher
Expand Down Expand Up @@ -62,7 +72,13 @@ jobs:
echo "${{ secrets.APPLE_API_KEY }}" | base64 --decode > "$API_KEY_PATH"
export APPLE_API_KEY="$API_KEY_PATH"

npm run build:mac
npm run ${{ matrix.build_script }}

- name: Verify macOS artifacts
run: |
ls -la dist
ls dist/*-mac-${{ matrix.arch }}.dmg >/dev/null
ls dist/*-mac-${{ matrix.arch }}.zip >/dev/null

- name: Clean up keychain
if: always()
Expand All @@ -72,10 +88,10 @@ jobs:
- name: Upload macOS artifacts
uses: actions/upload-artifact@v4
with:
name: launcher-macos
name: launcher-macos-${{ matrix.arch }}
path: |
packages/launcher/dist/*.dmg
packages/launcher/dist/*.zip
packages/launcher/dist/*-mac-${{ matrix.arch }}.dmg
packages/launcher/dist/*-mac-${{ matrix.arch }}.zip
if-no-files-found: warn

build-windows:
Expand Down
87 changes: 79 additions & 8 deletions .github/workflows/test-desktop.yml
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ jobs:
Stop-Process -Name "OpenAgents Launcher" -Force -ErrorAction SilentlyContinue
Stop-Process -Name "electron" -Force -ErrorAction SilentlyContinue

test-macos:
test-macos-arm64:
runs-on: [self-hosted, macos, desktop-test]
timeout-minutes: 45
steps:
Expand All @@ -107,12 +107,7 @@ jobs:
run: |
TAG="${{ github.event.inputs.tag }}"
echo "Downloading $TAG..."
ARCH=$(uname -m)
if [ "$ARCH" = "arm64" ]; then
PATTERN="mac-arm64.dmg"
else
PATTERN="mac-x64.dmg"
fi
PATTERN="mac-arm64.dmg"
API_URL="https://api.github.com/repos/openagents-org/openagents/releases/tags/$TAG"
DOWNLOAD_URL=$(curl -s "$API_URL" | python3 -c "import sys,json; assets=json.load(sys.stdin)['assets']; print([a['browser_download_url'] for a in assets if '$PATTERN' in a['name']][0])")
echo "Downloading: $DOWNLOAD_URL"
Expand Down Expand Up @@ -169,7 +164,83 @@ jobs:
if: always()
uses: actions/upload-artifact@v4
with:
name: test-screenshots-macos
name: test-screenshots-macos-arm64
path: infra/screenshot_*.png

- name: Cleanup
if: always()
run: |
pkill -f "OpenAgents Launcher" 2>/dev/null || true
pkill -f Electron 2>/dev/null || true

test-macos-x64:
runs-on: macos-13
timeout-minutes: 45
steps:
- name: Clean environment
run: |
pkill -f "OpenAgents Launcher" 2>/dev/null || true
pkill -f Electron 2>/dev/null || true
rm -rf ~/.openagents 2>/dev/null || true
echo "Environment cleaned"

- name: Download release
run: |
TAG="${{ github.event.inputs.tag }}"
echo "Downloading $TAG..."
PATTERN="mac-x64.dmg"
API_URL="https://api.github.com/repos/openagents-org/openagents/releases/tags/$TAG"
DOWNLOAD_URL=$(curl -s "$API_URL" | python3 -c "import sys,json; assets=json.load(sys.stdin)['assets']; print([a['browser_download_url'] for a in assets if '$PATTERN' in a['name']][0])")
echo "Downloading: $DOWNLOAD_URL"
curl -L -o /tmp/launcher-test.dmg "$DOWNLOAD_URL"
echo "Downloaded: /tmp/launcher-test.dmg"

- name: Install app
run: |
hdiutil detach /Volumes/OpenAgents* 2>/dev/null || true
hdiutil attach /tmp/launcher-test.dmg -nobrowse
rm -rf "/Applications/OpenAgents Launcher.app"
VOLUME=$(ls -d /Volumes/OpenAgents* | head -1)
cp -R "$VOLUME/OpenAgents Launcher.app" /Applications/
hdiutil detach "$VOLUME" 2>/dev/null || true
xattr -cr "/Applications/OpenAgents Launcher.app"
echo "Installed to /Applications"

- name: Launch app with CDP
run: |
open "/Applications/OpenAgents Launcher.app" --args --remote-debugging-port=9333 --remote-allow-origins=*
for i in $(seq 1 30); do
sleep 1
if curl -s http://127.0.0.1:9333/json > /dev/null 2>&1; then
echo "CDP ready after ${i}s"
break
fi
done

- name: Setup Node.js for Playwright
uses: actions/setup-node@v4
with:
node-version: '22'

- name: Checkout test script
uses: actions/checkout@v4
with:
sparse-checkout: infra/test_app.js
sparse-checkout-cone-mode: false

- name: Install Playwright and run tests
run: |
cd infra
npm init -y
npm install playwright
npx playwright install chromium
node test_app.js

- name: Upload screenshots
if: always()
uses: actions/upload-artifact@v4
with:
name: test-screenshots-macos-x64
path: infra/screenshot_*.png

- name: Cleanup
Expand Down
32 changes: 17 additions & 15 deletions packages/agent-connector/registry.json
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@
{
"name": "cursor",
"label": "Cursor",
"description": "AI-powered code editor with agent mode CLI",
"description": "Cursor official CLI agent",
"homepage": "https://cursor.com",
"tags": [
"coding",
Expand All @@ -196,9 +196,9 @@
],
"builtin": true,
"install": {
"binary": "cursor",
"verify": "cursor --version 2>/dev/null | grep -qi cursor",
"verify_win": "cursor --version 2>nul | findstr /i cursor",
"binary": "cursor-agent",
"verify": "cursor-agent --version >/dev/null 2>&1",
"verify_win": "cursor-agent --version >nul 2>nul",
"requires": [
null
],
Expand All @@ -217,28 +217,30 @@
},
"env_config": [
{
"name": "OPENAI_API_KEY",
"description": "API key for LLM inference",
"name": "CURSOR_API_KEY",
"description": "Cursor API key",
"required": true,
"password": true
},
{
"name": "CURSOR_MODEL",
"description": "Optional Cursor model override",
"required": false,
"placeholder": "claude-4-sonnet, gpt-5, auto, etc."
}
],
"check_ready": {
"env_vars": [
"OPENAI_API_KEY"
"CURSOR_API_KEY"
],
"saved_env_key": "OPENAI_API_KEY",
"not_ready_message": "No API key \u2014 press e to configure"
"saved_env_key": "CURSOR_API_KEY",
"not_ready_message": "Cursor API key not configured \u2014 press e to configure"
},
"resolve_env": {
"rules": [
{
"from": "LLM_API_KEY",
"to": "OPENAI_API_KEY"
},
{
"from": "LLM_BASE_URL",
"to": "OPENAI_BASE_URL"
"to": "CURSOR_API_KEY"
},
{
"from": "LLM_MODEL",
Expand Down Expand Up @@ -521,4 +523,4 @@
"windows": "pip install sweagent"
}
}
]
]
Loading