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
Binary file added .codex/brand-review-screenshots/app-browser.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .codex/brand-review-screenshots/os-browser.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
21 changes: 20 additions & 1 deletion .github/workflows/android-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,16 @@ jobs:
sha256sum "$AAB_PATH" "$APK_PATH" > packages/app/android/app/build/outputs/release-SHA256SUMS.txt
cat packages/app/android/app/build/outputs/release-SHA256SUMS.txt

- name: Stage sideload APK with canonical name
run: |
VERSION="${{ steps.version.outputs.name }}"
APK_SRC="packages/app/android/app/build/outputs/apk/release/app-release.apk"
SIDELOAD_APK="elizaos-android-${VERSION}-release.apk"
cp "$APK_SRC" "$SIDELOAD_APK"
sha256sum "$SIDELOAD_APK" > "${SIDELOAD_APK}.sha256"
echo "Sideload APK: $SIDELOAD_APK"
echo "SHA256: $(cat "${SIDELOAD_APK}.sha256")"

- name: Upload Android release artifacts
uses: actions/upload-artifact@v7
with:
Expand All @@ -252,6 +262,8 @@ jobs:
packages/app/android/app/build/outputs/bundle/release/app-release.aab
packages/app/android/app/build/outputs/apk/release/app-release.apk
packages/app/android/app/build/outputs/release-SHA256SUMS.txt
elizaos-android-${{ steps.version.outputs.name }}-release.apk
elizaos-android-${{ steps.version.outputs.name }}-release.apk.sha256
retention-days: 90

- name: Attach Android artifacts to GitHub Release
Expand All @@ -260,6 +272,7 @@ jobs:
run: |
VERSION="${{ steps.version.outputs.name }}"
TAG="v${VERSION}"
SIDELOAD_APK="elizaos-android-${VERSION}-release.apk"
if ! gh release view "$TAG" >/dev/null 2>&1; then
echo "::error::No GitHub release found for $TAG; cannot attach AAB."
exit 1
Expand All @@ -270,7 +283,13 @@ jobs:
"Eliza-${VERSION}.apk"
cp packages/app/android/app/build/outputs/release-SHA256SUMS.txt \
"Eliza-${VERSION}.android.SHA256SUMS.txt"
gh release upload "$TAG" "Eliza-${VERSION}.aab" "Eliza-${VERSION}.apk" "Eliza-${VERSION}.android.SHA256SUMS.txt" --clobber
gh release upload "$TAG" \
"Eliza-${VERSION}.aab" \
"Eliza-${VERSION}.apk" \
"Eliza-${VERSION}.android.SHA256SUMS.txt" \
"${SIDELOAD_APK}" \
"${SIDELOAD_APK}.sha256" \
--clobber

- name: Clean up keystore
if: always()
Expand Down
104 changes: 104 additions & 0 deletions .github/workflows/build-debian-package.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
name: Build elizaOS Debian Package

on:
workflow_call:
workflow_dispatch:
release:
types: [created]

jobs:
build-deb:
runs-on: ubuntu-latest
timeout-minutes: 30

permissions:
contents: write

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Install Debian build tools
run: |
sudo apt-get update -qq
sudo apt-get install -y --no-install-recommends \
dpkg-dev \
devscripts \
debhelper \
dh-make \
fakeroot \
lintian

- name: Set up Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: "1.3.13"

- name: Install dependencies
run: bun install --frozen-lockfile

- name: Build
run: bun run build

- name: Build .deb package
id: deb
continue-on-error: true
run: |
if [ ! -d packages/app-core/packaging/debian ]; then
echo "WARN: packages/app-core/packaging/debian not found; skipping .deb build"
exit 0
fi
cd packages/app-core/packaging/debian
dpkg-buildpackage -us -uc -b 2>/dev/null || debuild -us -uc -b 2>/dev/null || true

- name: Find and checksum .deb
id: find_deb
run: |
DEB=$(find . -maxdepth 3 -name "*.deb" | head -1)
if [ -n "$DEB" ]; then
sha256sum "$DEB" > "${DEB}.sha256"
DEB_SHA256=$(cut -d' ' -f1 "${DEB}.sha256")
DEB_SIZE=$(stat --format="%s" "$DEB")
echo "deb_path=$DEB" >> "$GITHUB_OUTPUT"
echo "deb_sha256=$DEB_SHA256" >> "$GITHUB_OUTPUT"
echo "deb_size=$DEB_SIZE" >> "$GITHUB_OUTPUT"
echo "Found .deb: $DEB ($DEB_SIZE bytes)"
else
echo "WARN: no .deb file produced"
fi

- name: Upload .deb artifact
uses: actions/upload-artifact@v4
with:
name: elizaos-debian-package
path: |
**/*.deb
**/*.deb.sha256
if-no-files-found: warn
retention-days: 30

- name: Upload to GitHub Release
if: (github.event_name == 'release') && steps.find_deb.outputs.deb_path != ''
uses: softprops/action-gh-release@v2
with:
files: |
**/*.deb
**/*.deb.sha256
fail_on_unmatched_files: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Write .deb metadata to summary
run: |
{
echo "## elizaOS Debian Package"
echo "| Field | Value |"
echo "| ----- | ----- |"
if [ -n "${{ steps.find_deb.outputs.deb_path }}" ]; then
echo "| File | \`${{ steps.find_deb.outputs.deb_path }}\` |"
echo "| SHA-256 | \`${{ steps.find_deb.outputs.deb_sha256 }}\` |"
echo "| Size | ${{ steps.find_deb.outputs.deb_size }} bytes |"
else
echo "| Status | not produced (packaging/debian may not be present yet) |"
fi
} >> "$GITHUB_STEP_SUMMARY"
199 changes: 199 additions & 0 deletions .github/workflows/build-linux-iso.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,199 @@
name: Build elizaOS Linux ISO

on:
workflow_call:
inputs:
channel:
type: string
default: stable
publish:
type: boolean
default: false
workflow_dispatch:
inputs:
channel:
description: Release channel
type: choice
options: [nightly, beta, stable]
default: nightly
publish:
description: Upload to GitHub Release
type: boolean
default: false
schedule:
- cron: '0 3 * * *'
release:
types: [created]

jobs:
build-iso:
runs-on: ubuntu-latest
timeout-minutes: 120
env:
CHANNEL: ${{ inputs.channel || (github.event_name == 'release' && 'stable') || 'nightly' }}

steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Install live-build and dependencies
run: |
sudo apt-get update -qq
sudo apt-get install -y --no-install-recommends \
live-build \
just \
squashfs-tools \
xorriso \
isolinux \
syslinux-efi \
grub-efi-amd64-bin \
grub-pc-bin \
mtools \
dosfstools \
python3 \
curl \
rsync

- name: Set up Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: "1.3.13"

- name: Install dependencies
run: bun install --frozen-lockfile

- name: Restore model cache
uses: actions/cache@v4
with:
path: ~/.cache/usbeliza-build/models
key: elizaos-model-cache-${{ hashFiles('packages/os/linux/Justfile') }}
restore-keys: elizaos-model-cache-

- name: Restore CLI cache
uses: actions/cache@v4
with:
path: ~/.cache/usbeliza-build/cli
key: elizaos-cli-cache-${{ hashFiles('packages/os/linux/Justfile') }}
restore-keys: elizaos-cli-cache-

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
targets: x86_64-unknown-linux-gnu

- name: Cache Rust build
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
packages/os/linux/target
key: elizaos-iso-rust-${{ runner.os }}-${{ hashFiles('packages/os/linux/**/Cargo.lock', 'packages/os/linux/**/Cargo.toml') }}
restore-keys: elizaos-iso-rust-${{ runner.os }}-

- name: Stage ISO build
working-directory: packages/os/linux
run: just iso-stage

- name: Cache pre-downloaded models
working-directory: packages/os/linux
run: just iso-cache-model

- name: Cache pre-downloaded CLIs
working-directory: packages/os/linux
run: just iso-cache-cli

- name: Configure live-build
working-directory: packages/os/linux
run: just iso-config

- name: Validate ISO config
working-directory: packages/os/linux
run: just iso-check

- name: Build ISO
working-directory: packages/os/linux
run: sudo just iso-build
timeout-minutes: 90

- name: Locate and rename ISO
id: iso
run: |
ISO=$(find packages/os/linux -name "*.iso" | head -1)
if [ -z "$ISO" ]; then
echo "ERROR: ISO not found after build"
exit 1
fi
DATE=$(date +%Y.%m.%d)
DEST="elizaos-linux-live-${CHANNEL}-${DATE}-amd64.iso"
cp "$ISO" "$DEST"
SHA256=$(sha256sum "$DEST" | cut -d' ' -f1)
SIZE=$(stat --format="%s" "$DEST")
echo "path=$DEST" >> "$GITHUB_OUTPUT"
echo "sha256=$SHA256" >> "$GITHUB_OUTPUT"
echo "size=$SIZE" >> "$GITHUB_OUTPUT"
echo "filename=$DEST" >> "$GITHUB_OUTPUT"

- name: Generate SHA256SUMS
run: |
sha256sum "${{ steps.iso.outputs.path }}" > "${{ steps.iso.outputs.filename }}.sha256"

- name: Smoke test ISO (headless QEMU)
if: runner.os == 'Linux'
continue-on-error: true
run: |
sudo apt-get install -y --no-install-recommends qemu-system-x86 ovmf
# Boot headless for 60 seconds and check for boot completion via serial
QEMU_TIMEOUT=120
ISO_PATH="${{ steps.iso.outputs.path }}"
SERIAL_LOG=$(mktemp)
timeout "$QEMU_TIMEOUT" qemu-system-x86_64 \
-cdrom "$ISO_PATH" \
-boot d \
-m 2G \
-smp 2 \
-display none \
-vga none \
-serial "file:$SERIAL_LOG" \
-no-reboot \
-nographic 2>/dev/null || true
if grep -qi "elizaOS\|eliza\|login:" "$SERIAL_LOG" 2>/dev/null; then
echo "ISO smoke test: boot strings found in serial log"
else
echo "WARN: boot strings not detected in serial log (QEMU may not support KVM in CI)"
fi
rm -f "$SERIAL_LOG"

- name: Upload ISO artifact
uses: actions/upload-artifact@v4
with:
name: elizaos-linux-iso-${{ env.CHANNEL }}
path: |
${{ steps.iso.outputs.path }}
${{ steps.iso.outputs.filename }}.sha256
retention-days: 7

- name: Upload to GitHub Release
if: github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && inputs.publish == 'true') || (github.event_name == 'workflow_call' && inputs.publish == true)
uses: softprops/action-gh-release@v2
with:
files: |
${{ steps.iso.outputs.path }}
${{ steps.iso.outputs.filename }}.sha256
tag_name: ${{ github.event.release.tag_name || github.ref_name }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Write ISO metadata to summary
run: |
{
echo "## elizaOS Linux ISO"
echo "| Field | Value |"
echo "| ----- | ----- |"
echo "| File | \`${{ steps.iso.outputs.filename }}\` |"
echo "| SHA-256 | \`${{ steps.iso.outputs.sha256 }}\` |"
echo "| Size | ${{ steps.iso.outputs.size }} bytes |"
echo "| Channel | ${CHANNEL} |"
} >> "$GITHUB_STEP_SUMMARY"
Loading
Loading