From 1952b21dbf1cff94f16ccac84615cb15cdfee4e6 Mon Sep 17 00:00:00 2001 From: Khaliq Date: Wed, 4 Feb 2026 21:20:43 +0100 Subject: [PATCH 1/4] acp standalone --- .github/workflows/publish.yml | 185 +++++++++++++++++++++++++++++++++- install.sh | 97 ++++++++++++++++++ 2 files changed, 279 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 39b9ee987..e360d23c9 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -199,6 +199,87 @@ jobs: path: release-binaries/${{ matrix.binary_name }} retention-days: 1 + # Build relay-acp standalone binary for Zed editor integration + build-acp-standalone: + name: Build relay-acp (${{ matrix.target }}) + needs: build + runs-on: ${{ matrix.os }} + if: github.event.inputs.package == 'all' || github.event.inputs.package == 'main' + strategy: + fail-fast: false + matrix: + include: + - os: macos-latest + target: bun-darwin-arm64 + binary_name: relay-acp-darwin-arm64 + - os: macos-latest + target: bun-darwin-x64 + binary_name: relay-acp-darwin-x64 + - os: ubuntu-latest + target: bun-linux-x64 + binary_name: relay-acp-linux-x64 + - os: ubuntu-latest + target: bun-linux-arm64 + binary_name: relay-acp-linux-arm64 + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "22" + cache: "npm" + + - name: Install dependencies + run: npm ci + + - name: Build TypeScript + run: npm run build + + - name: Build relay-acp standalone binary + run: | + mkdir -p release-binaries + bun build \ + --compile \ + --minify \ + --target=${{ matrix.target }} \ + --define="process.env.AGENT_RELAY_VERSION=\"${{ needs.build.outputs.new_version }}\"" \ + ./packages/acp-bridge/dist/cli.js \ + --outfile release-binaries/${{ matrix.binary_name }} + + - name: Verify binary + if: matrix.target == 'bun-linux-x64' || (matrix.target == 'bun-darwin-arm64' && runner.arch == 'ARM64') + run: | + chmod +x release-binaries/${{ matrix.binary_name }} + ./release-binaries/${{ matrix.binary_name }} --version || echo "Binary created (cross-compiled)" + + - name: Compress binary with gzip + run: | + gzip -9 -k release-binaries/${{ matrix.binary_name }} + echo "Uncompressed: $(du -h release-binaries/${{ matrix.binary_name }} | cut -f1)" + echo "Compressed: $(du -h release-binaries/${{ matrix.binary_name }}.gz | cut -f1)" + + - name: Upload compressed binary + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.binary_name }}.gz + path: release-binaries/${{ matrix.binary_name }}.gz + retention-days: 1 + + - name: Upload uncompressed binary + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.binary_name }} + path: release-binaries/${{ matrix.binary_name }} + retention-days: 1 + # Build all packages once, version them, and upload build: name: Build & Version @@ -646,10 +727,80 @@ jobs: /tmp/agent-relay-test --version echo "✓ Compressed binary decompresses and works" + # Verify relay-acp binaries on Linux + verify-acp-linux: + name: Verify relay-acp (Linux) + needs: [build-acp-standalone] + runs-on: ubuntu-latest + if: github.event.inputs.package == 'all' || github.event.inputs.package == 'main' + + steps: + - name: Download Linux binary + uses: actions/download-artifact@v4 + with: + name: relay-acp-linux-x64 + path: bin/ + + - name: Download compressed binary + uses: actions/download-artifact@v4 + with: + name: relay-acp-linux-x64.gz + path: bin/ + + - name: Verify uncompressed binary + run: | + chmod +x bin/relay-acp-linux-x64 + echo "Testing uncompressed binary..." + ./bin/relay-acp-linux-x64 --help + echo "✓ Uncompressed relay-acp binary works" + + - name: Verify compressed binary + run: | + echo "Testing compressed binary decompression..." + gunzip -c bin/relay-acp-linux-x64.gz > /tmp/relay-acp-test + chmod +x /tmp/relay-acp-test + /tmp/relay-acp-test --help + echo "✓ Compressed relay-acp binary decompresses and works" + + # Verify relay-acp binaries on macOS + verify-acp-macos: + name: Verify relay-acp (macOS) + needs: [build-acp-standalone] + runs-on: macos-latest + if: github.event.inputs.package == 'all' || github.event.inputs.package == 'main' + + steps: + - name: Download macOS binary + uses: actions/download-artifact@v4 + with: + name: relay-acp-darwin-arm64 + path: bin/ + + - name: Download compressed binary + uses: actions/download-artifact@v4 + with: + name: relay-acp-darwin-arm64.gz + path: bin/ + + - name: Verify uncompressed binary + run: | + chmod +x bin/relay-acp-darwin-arm64 + echo "Testing uncompressed binary..." + ./bin/relay-acp-darwin-arm64 --help + echo "✓ Uncompressed relay-acp binary works" + + - name: Verify compressed binary + run: | + echo "Testing compressed binary decompression..." + gunzip -c bin/relay-acp-darwin-arm64.gz > /tmp/relay-acp-test + chmod +x /tmp/relay-acp-test + /tmp/relay-acp-test --help + echo "✓ Compressed relay-acp binary decompresses and works" + # Gate job that requires both Linux and macOS verification to pass verify-binaries: name: All Binaries Verified - needs: [verify-binaries-linux, verify-binaries-macos, verify-standalone-linux, verify-standalone-macos] + needs: [verify-binaries-linux, verify-binaries-macos, verify-standalone-linux, verify-standalone-macos, verify-acp-linux, verify-acp-macos] runs-on: ubuntu-latest if: github.event.inputs.package == 'all' || github.event.inputs.package == 'main' steps: @@ -663,6 +814,7 @@ jobs: echo "### Verified Binaries" >> $GITHUB_STEP_SUMMARY echo "- relay-pty: Linux x64, Linux ARM64, macOS x64, macOS ARM64" >> $GITHUB_STEP_SUMMARY echo "- agent-relay: Linux x64, macOS ARM64 (both compressed and uncompressed)" >> $GITHUB_STEP_SUMMARY + echo "- relay-acp: Linux x64, macOS ARM64 (both compressed and uncompressed)" >> $GITHUB_STEP_SUMMARY # Publish main package publish-main: @@ -718,7 +870,7 @@ jobs: # Create git tag and release create-release: name: Create Release - needs: [build, build-binaries, build-standalone, verify-binaries, publish-main] + needs: [build, build-binaries, build-standalone, build-acp-standalone, verify-binaries, publish-main] runs-on: ubuntu-latest if: | always() && @@ -752,6 +904,13 @@ jobs: path: release-binaries/ merge-multiple: true + - name: Download relay-acp binaries + uses: actions/download-artifact@v4 + with: + pattern: relay-acp-* + path: release-binaries/ + merge-multiple: true + - name: Make binaries executable run: | # Make uncompressed binaries executable (skip .gz files) @@ -797,6 +956,16 @@ jobs: fi done + # Check relay-acp binaries (for Zed editor) + for BINARY in relay-acp-darwin-arm64 relay-acp-darwin-x64 relay-acp-linux-x64 relay-acp-linux-arm64; do + if [ -f "release-binaries/$BINARY" ]; then + echo "✓ $BINARY" + else + echo "⚠ MISSING: $BINARY (Zed ACP bridge)" + # Don't fail on missing - acp-bridge is optional + fi + done + if [ $MISSING -eq 1 ]; then echo "" echo "ERROR: Some required binaries are missing!" @@ -858,6 +1027,13 @@ jobs: - `relay-pty-linux-arm64` - Linux ARM64 - `relay-pty-darwin-x64` - macOS Intel - `relay-pty-darwin-arm64` - macOS Apple Silicon + + ### relay-acp binaries (Zed editor integration) + ACP bridge for Zed editor: + - `relay-acp-linux-x64` - Linux x86_64 + - `relay-acp-linux-arm64` - Linux ARM64 + - `relay-acp-darwin-x64` - macOS Intel + - `relay-acp-darwin-arm64` - macOS Apple Silicon files: | release-binaries/* generate_release_notes: true @@ -878,7 +1054,7 @@ jobs: summary: name: Summary - needs: [build, build-binaries, build-standalone, verify-binaries, verify-standalone-linux, verify-standalone-macos, publish-packages, publish-main, verify-publish] + needs: [build, build-binaries, build-standalone, build-acp-standalone, verify-binaries, verify-standalone-linux, verify-standalone-macos, verify-acp-linux, verify-acp-macos, publish-packages, publish-main, verify-publish] runs-on: ubuntu-latest if: always() @@ -897,9 +1073,12 @@ jobs: echo "| Build | ${{ needs.build.result == 'success' && '✅' || '❌' }} ${{ needs.build.result }} |" >> $GITHUB_STEP_SUMMARY echo "| Build Binaries (Rust) | ${{ needs.build-binaries.result == 'success' && '✅' || (needs.build-binaries.result == 'skipped' && '⏭️' || '❌') }} ${{ needs.build-binaries.result }} |" >> $GITHUB_STEP_SUMMARY echo "| Build Standalone (Bun) | ${{ needs.build-standalone.result == 'success' && '✅' || (needs.build-standalone.result == 'skipped' && '⏭️' || '❌') }} ${{ needs.build-standalone.result }} |" >> $GITHUB_STEP_SUMMARY + echo "| Build relay-acp (Bun) | ${{ needs.build-acp-standalone.result == 'success' && '✅' || (needs.build-acp-standalone.result == 'skipped' && '⏭️' || '❌') }} ${{ needs.build-acp-standalone.result }} |" >> $GITHUB_STEP_SUMMARY echo "| Verify relay-pty | ${{ needs.verify-binaries.result == 'success' && '✅' || (needs.verify-binaries.result == 'skipped' && '⏭️' || '❌') }} ${{ needs.verify-binaries.result }} |" >> $GITHUB_STEP_SUMMARY echo "| Verify Standalone (Linux) | ${{ needs.verify-standalone-linux.result == 'success' && '✅' || (needs.verify-standalone-linux.result == 'skipped' && '⏭️' || '❌') }} ${{ needs.verify-standalone-linux.result }} |" >> $GITHUB_STEP_SUMMARY echo "| Verify Standalone (macOS) | ${{ needs.verify-standalone-macos.result == 'success' && '✅' || (needs.verify-standalone-macos.result == 'skipped' && '⏭️' || '❌') }} ${{ needs.verify-standalone-macos.result }} |" >> $GITHUB_STEP_SUMMARY + echo "| Verify relay-acp (Linux) | ${{ needs.verify-acp-linux.result == 'success' && '✅' || (needs.verify-acp-linux.result == 'skipped' && '⏭️' || '❌') }} ${{ needs.verify-acp-linux.result }} |" >> $GITHUB_STEP_SUMMARY + echo "| Verify relay-acp (macOS) | ${{ needs.verify-acp-macos.result == 'success' && '✅' || (needs.verify-acp-macos.result == 'skipped' && '⏭️' || '❌') }} ${{ needs.verify-acp-macos.result }} |" >> $GITHUB_STEP_SUMMARY echo "| Publish Packages | ${{ needs.publish-packages.result == 'success' && '✅' || (needs.publish-packages.result == 'skipped' && '⏭️' || '❌') }} ${{ needs.publish-packages.result }} |" >> $GITHUB_STEP_SUMMARY echo "| Publish Main | ${{ needs.publish-main.result == 'success' && '✅' || (needs.publish-main.result == 'skipped' && '⏭️' || '❌') }} ${{ needs.publish-main.result }} |" >> $GITHUB_STEP_SUMMARY echo "| Post-Publish Verify | ${{ needs.verify-publish.result == 'success' && '✅' || (needs.verify-publish.result == 'skipped' && '⏭️' || '❌') }} ${{ needs.verify-publish.result }} |" >> $GITHUB_STEP_SUMMARY diff --git a/install.sh b/install.sh index 0c3b9a675..0120ec82e 100755 --- a/install.sh +++ b/install.sh @@ -319,6 +319,98 @@ has_command() { command -v "$1" &> /dev/null } +# Download relay-acp binary for Zed editor integration +download_relay_acp() { + step "Downloading relay-acp binary (Zed editor integration)..." + + local binary_name="relay-acp-${PLATFORM}" + local compressed_url="https://github.com/$REPO_RELAY/releases/download/v${VERSION}/${binary_name}.gz" + local uncompressed_url="https://github.com/$REPO_RELAY/releases/download/v${VERSION}/${binary_name}" + local target_path="$BIN_DIR/relay-acp" + local temp_file="/tmp/relay-acp-download-$$" + + mkdir -p "$BIN_DIR" + + # Setup cleanup trap for temp files + trap 'rm -f "${temp_file}.gz" "${temp_file}"' EXIT + + # Try compressed binary first + if has_command gunzip; then + if curl -fsSL "$compressed_url" -o "${temp_file}.gz" 2>/dev/null; then + local is_gzip=false + if has_command file; then + file "${temp_file}.gz" 2>/dev/null | grep -q "gzip" && is_gzip=true + else + head -c 2 "${temp_file}.gz" 2>/dev/null | od -An -tx1 | grep -q "1f 8b" && is_gzip=true + fi + + if [ "$is_gzip" = true ]; then + if gunzip -c "${temp_file}.gz" > "$target_path" 2>/dev/null; then + rm -f "${temp_file}.gz" + chmod +x "$target_path" + + if "$target_path" --help &>/dev/null; then + success "Downloaded relay-acp binary (Zed ACP bridge)" + trap - EXIT + return 0 + else + warn "relay-acp binary failed verification, trying uncompressed..." + rm -f "$target_path" + fi + else + rm -f "${temp_file}.gz" "$target_path" + fi + else + rm -f "${temp_file}.gz" + fi + fi + fi + + # Fall back to uncompressed binary + if curl -fsSL "$uncompressed_url" -o "$target_path" 2>/dev/null; then + local file_size + file_size=$(stat -f%z "$target_path" 2>/dev/null || stat -c%s "$target_path" 2>/dev/null || echo "0") + + if [ "$file_size" -gt 1000000 ]; then + chmod +x "$target_path" + + if "$target_path" --help &>/dev/null; then + success "Downloaded relay-acp binary (Zed ACP bridge)" + trap - EXIT + return 0 + else + rm -f "$target_path" + fi + else + rm -f "$target_path" + fi + fi + + trap - EXIT + info "No relay-acp binary available for $PLATFORM" + return 1 +} + +# Install ACP bridge for Zed editor integration (fallback to npm if binary not available) +install_acp_bridge() { + # Try binary first + if download_relay_acp; then + return 0 + fi + + # Fall back to npm if Node.js is available + if check_node; then + info "Installing ACP bridge via npm..." + if npm install -g @agent-relay/acp-bridge@"$VERSION" 2>/dev/null || npm install -g @agent-relay/acp-bridge 2>/dev/null; then + success "Installed relay-acp via npm (Zed ACP bridge)" + return 0 + fi + fi + + warn "relay-acp not available (Zed editor integration won't work)" + return 1 +} + # Download with progress indicator download_with_progress() { local url="$1" @@ -501,6 +593,9 @@ Or use nvm: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/instal fi fi + # Install ACP bridge for Zed editor integration + install_acp_bridge || true + success "Installed via npm" } @@ -641,6 +736,8 @@ main() { download_dashboard_binary || true # Download dashboard UI files (required for standalone binary to serve the UI) download_dashboard_ui || true + # Install ACP bridge for Zed editor (requires Node.js) + install_acp_bridge || true verify_installation && print_usage && track_event "install_completed" && exit 0 fi From 9baf5473e0dca880f0c67b8c31b1e55f28240cca Mon Sep 17 00:00:00 2001 From: Khaliq Date: Wed, 4 Feb 2026 21:42:06 +0100 Subject: [PATCH 2/4] update lock --- package-lock.json | 286 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 285 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 949edd9b2..86848dc25 100644 --- a/package-lock.json +++ b/package-lock.json @@ -131,6 +131,10 @@ "resolved": "packages/continuity", "link": true }, + "node_modules/@agent-relay/daemon": { + "resolved": "packages/daemon", + "link": true + }, "node_modules/@agent-relay/hooks": { "resolved": "packages/hooks", "link": true @@ -350,6 +354,7 @@ }, "node_modules/@clack/prompts/node_modules/is-unicode-supported": { "version": "1.3.0", + "extraneous": true, "inBundle": true, "license": "MIT", "engines": { @@ -1955,7 +1960,7 @@ "version": "8.16.0", "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.16.0.tgz", "integrity": "sha512-RmhMd/wD+CF8Dfo+cVIy3RR5cl8CyfXQ0tGgW6XBL8L4LM/UTEbNXYRbLwU6w+CgrKBNbrQWt4FUtTfaU5jSYQ==", - "extraneous": true, + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", @@ -10995,6 +11000,285 @@ } } }, + "packages/daemon": { + "name": "@agent-relay/daemon", + "version": "2.1.15", + "dependencies": { + "@agent-relay/bridge": "2.1.15", + "@agent-relay/config": "2.1.15", + "@agent-relay/memory": "2.1.15", + "@agent-relay/policy": "2.1.15", + "@agent-relay/protocol": "2.1.15", + "@agent-relay/resiliency": "2.1.15", + "@agent-relay/storage": "2.1.15", + "@agent-relay/telemetry": "2.1.15", + "@agent-relay/user-directory": "2.1.15", + "@agent-relay/utils": "2.1.15", + "@agent-relay/wrapper": "2.1.15", + "pg": "^8.16.3", + "uuid": "^10.0.0", + "ws": "^8.18.3" + }, + "devDependencies": { + "@types/node": "^22.19.3", + "@types/pg": "^8.16.0", + "@types/uuid": "^10.0.0", + "@types/ws": "^8.18.1", + "typescript": "^5.9.3", + "vitest": "^3.2.4" + } + }, + "packages/daemon/node_modules/@vitest/expect": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/daemon/node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/daemon/node_modules/@vitest/runner": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.2.4", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/daemon/node_modules/@vitest/snapshot": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/daemon/node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/daemon/node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/daemon/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "packages/daemon/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "packages/daemon/node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "packages/daemon/node_modules/tinyspy": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", + "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "packages/daemon/node_modules/vite-node": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "packages/daemon/node_modules/vitest": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.2.4", + "@vitest/ui": "3.2.4", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "packages/daemon/node_modules/vitest/node_modules/@vitest/mocker": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.2.4", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, "packages/hooks": { "name": "@agent-relay/hooks", "version": "2.1.15", From 8809e160cc066295393de07bab7cc4cd685d523c Mon Sep 17 00:00:00 2001 From: Khaliq Date: Wed, 4 Feb 2026 22:03:18 +0100 Subject: [PATCH 3/4] updates --- .github/workflows/publish.yml | 18 ++++++++++++------ .github/workflows/test-install.yml | 16 +++++++++++++--- install.sh | 8 +++++++- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index e360d23c9..4bd389171 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -142,6 +142,12 @@ jobs: - name: Checkout code uses: actions/checkout@v4 + - name: Download build artifacts + uses: actions/download-artifact@v4 + with: + name: build-output + path: . + - name: Setup Bun uses: oven-sh/setup-bun@v2 with: @@ -156,9 +162,6 @@ jobs: - name: Install dependencies run: npm ci - - name: Build TypeScript - run: npm run build - - name: Build standalone binary run: | mkdir -p release-binaries @@ -226,6 +229,12 @@ jobs: - name: Checkout code uses: actions/checkout@v4 + - name: Download build artifacts + uses: actions/download-artifact@v4 + with: + name: build-output + path: . + - name: Setup Bun uses: oven-sh/setup-bun@v2 with: @@ -240,9 +249,6 @@ jobs: - name: Install dependencies run: npm ci - - name: Build TypeScript - run: npm run build - - name: Build relay-acp standalone binary run: | mkdir -p release-binaries diff --git a/.github/workflows/test-install.yml b/.github/workflows/test-install.yml index 9c8e01ac2..42e51c7af 100644 --- a/.github/workflows/test-install.yml +++ b/.github/workflows/test-install.yml @@ -101,6 +101,8 @@ jobs: - name: Test install script with Node.js if: matrix.node == 'with-node' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | # Run the actual install bash install.sh @@ -122,6 +124,8 @@ jobs: - name: Test install script without Node.js if: matrix.node == 'no-node' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | # This should either: # 1. Download standalone binary (if available) @@ -175,8 +179,10 @@ jobs: uses: actions/checkout@v4 - name: Test install without gunzip (Docker) + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - docker run --rm -v "$PWD:/workspace" -w /workspace debian:bookworm-slim bash -c ' + docker run --rm -e GITHUB_TOKEN="$GITHUB_TOKEN" -v "$PWD:/workspace" -w /workspace debian:bookworm-slim bash -c ' echo "=== Testing without gunzip ===" apt-get update && apt-get install -y curl @@ -217,8 +223,10 @@ jobs: uses: actions/checkout@v4 - name: Test install on Alpine (Docker) + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - docker run --rm -v "$PWD:/workspace" -w /workspace alpine:latest sh -c ' + docker run --rm -e GITHUB_TOKEN="$GITHUB_TOKEN" -v "$PWD:/workspace" -w /workspace alpine:latest sh -c ' echo "=== Testing on Alpine Linux ===" apk add --no-cache bash curl gzip @@ -254,8 +262,10 @@ jobs: uses: actions/checkout@v4 - name: Test install on Fedora (Docker) + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - docker run --rm -v "$PWD:/workspace" -w /workspace fedora:latest bash -c ' + docker run --rm -e GITHUB_TOKEN="$GITHUB_TOKEN" -v "$PWD:/workspace" -w /workspace fedora:latest bash -c ' echo "=== Testing on Fedora ===" dnf install -y curl diff --git a/install.sh b/install.sh index 0120ec82e..1642c605b 100755 --- a/install.sh +++ b/install.sh @@ -122,7 +122,13 @@ detect_platform() { # Get latest version from GitHub get_latest_version() { if [ "$VERSION" = "latest" ]; then - VERSION=$(curl -fsSL "https://api.github.com/repos/$REPO_RELAY/releases/latest" | sed -n 's/.*"tag_name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p') + # Use GitHub token if available (avoids rate limiting) + local auth_header="" + if [ -n "${GITHUB_TOKEN:-}" ]; then + auth_header="-H \"Authorization: token $GITHUB_TOKEN\"" + fi + + VERSION=$(eval curl -fsSL $auth_header "https://api.github.com/repos/$REPO_RELAY/releases/latest" | sed -n 's/.*"tag_name"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p') if [ -z "$VERSION" ]; then error "Failed to fetch latest version" fi From 6f1c380f04acdb6622836b42332578302620c366 Mon Sep 17 00:00:00 2001 From: Khaliq Date: Wed, 4 Feb 2026 22:19:54 +0100 Subject: [PATCH 4/4] quick start video --- docs/quickstart.mdx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/quickstart.mdx b/docs/quickstart.mdx index cd14ef647..8e69e34e2 100644 --- a/docs/quickstart.mdx +++ b/docs/quickstart.mdx @@ -5,7 +5,17 @@ description: "Get up and running with Agent Relay in 5 minutes" This guide will have you running your first multi-agent network in under 5 minutes. -Prefer to watch? Check out the [video demo](/videos/agent-relay-cli.mp4). +Prefer to watch? See the demo below. + + + + ## Prerequisites