项目文件夹

文件
wehub-resource-sync 426e9eeabd
Voice Workbench / headless workbench (mocked backends) (push) Has been cancelled
Voice Workbench / real acoustic lane (nightly, provisioned only) (push) Has been cancelled
ci / test (push) Has been cancelled
ci / lint-and-format (push) Has been cancelled
ci / build (push) Has been cancelled
ci / dev-startup (push) Has been cancelled
gitleaks / gitleaks (push) Has been cancelled
Markdown Links / Relative Markdown Links (push) Has been cancelled
Quality (Extended) / Homepage Build (PR smoke) (push) Has been cancelled
Quality (Extended) / Comment-only diff guard (push) Has been cancelled
Quality (Extended) / Format + Type Safety Ratchet (push) Has been cancelled
Quality (Extended) / Develop Gate (secret scan + UI determinism) (push) Has been cancelled
Quality (Extended) / Develop Gate (lint) (push) Has been cancelled
Chat shell gestures / Chat shell gesture + parity e2e (push) Has been cancelled
Cloud Gateway Discord / Test (push) Has been cancelled
Benchmark Bridge Tests / benchmark (bunx @biomejs/biome check packages/lifeops-bench/src, benchmark-lint) (push) Has been cancelled
Benchmark Bridge Tests / benchmark (bunx vitest run --config packages/lifeops-bench/vitest.config.ts --root packages/lifeops-bench --passWithNoTests, benchmark-tests) (push) Has been cancelled
Build Agent Image / build-and-push (push) Has been cancelled
Dev Smoke / bun run dev onboarding chat (push) Has been cancelled
Dev Smoke / Vite HMR dependency-level smoke (push) Has been cancelled
Electrobun Submodule Guard / electrobun gitlink is fetchable (push) Has been cancelled
Publish @elizaos/example-code / check_npm (push) Has been cancelled
Publish @elizaos/example-code / publish_npm (push) Has been cancelled
Publish @elizaos/plugin-elizacloud / verify_version (push) Has been cancelled
Publish @elizaos/plugin-elizacloud / publish_npm (push) Has been cancelled
Sandbox Live Smoke / Sandbox live smoke (push) Has been cancelled
Snap Build & Test / Build Snap (amd64) (push) Has been cancelled
Snap Build & Test / Build Snap (arm64) (push) Has been cancelled
Test Packaging / elizaos CLI global-install smoke (node + bun) (push) Has been cancelled
Cloud Gateway Webhook / Test (push) Has been cancelled
Cloud Tests / lint-and-types (push) Has been cancelled
Cloud Tests / unit-tests (push) Has been cancelled
Cloud Tests / integration-tests (push) Has been cancelled
Cloud Tests / e2e-tests (push) Has been cancelled
CodeQL Advanced / Analyze (javascript-typescript) (push) Has been cancelled
Deploy Apps Worker (Product 2) / Determine environment (push) Has been cancelled
Deploy Apps Worker (Product 2) / Deploy apps worker to apps-control host (${{ needs.determine-env.outputs.environment }}) (push) Has been cancelled
Deploy Eliza Provisioning Worker / Determine environment (push) Has been cancelled
Deploy Eliza Provisioning Worker / Deploy worker to Hetzner host (${{ needs.determine-env.outputs.environment }} @ ${{ needs.determine-env.outputs.deployment_sha }}) (push) Has been cancelled
Dev Smoke / Classify changed paths (push) Has been cancelled
supply-chain / sbom (push) Has been cancelled
supply-chain / vulnerability-scan (push) Has been cancelled
Build, Push & Deploy to Phala Cloud / build-and-push (push) Has been cancelled
Test Packaging / Validate Packaging Configs (push) Has been cancelled
Test Packaging / Build & Test PyPI Package (push) Has been cancelled
Test Packaging / PyPI on Python ${{ matrix.python }} (push) Has been cancelled
Test Packaging / Pack & Test JS Tarballs (push) Has been cancelled
UI Fixture E2E / ui-fixture-e2e (push) Has been cancelled
UI Fixture E2E / fixture-e2e (push) Has been cancelled
UI Story Gate / story-gate (push) Has been cancelled
vault-ci / test (macos-latest) (push) Has been cancelled
vault-ci / test (ubuntu-latest) (push) Has been cancelled
vault-ci / test (windows-latest) (push) Has been cancelled
vault-ci / app-core wiring tests (push) Has been cancelled
verify-patches / verify patches/CHECKSUMS.sha256 (push) Has been cancelled
Voice Benchmark Smoke / voice-emotion fixture smoke (push) Has been cancelled
Voice Benchmark Smoke / voiceagentbench fixture smoke (push) Has been cancelled
Voice Benchmark Smoke / voicebench-quality unit smoke (push) Has been cancelled
Voice Benchmark Smoke / voicebench TypeScript unit (no audio) (push) Has been cancelled
Voice Benchmark Smoke / voice bench smoke summary (push) Has been cancelled
Windows CI / windows ([bun run --cwd packages/app-core test bun run --cwd packages/elizaos test bun run --cwd packages/cloud/shared test], app-and-cli) (push) Has been cancelled
Windows CI / windows ([bun run --cwd packages/scenario-runner test bun run --cwd packages/vault test bun run --cwd packages/security test bun run --cwd plugins/plugin-coding-tools test], framework-packages) (push) Has been cancelled
Windows CI / windows ([bun run --cwd plugins/plugin-elizacloud test bun run --cwd plugins/plugin-discord test bun run --cwd plugins/plugin-anthropic test bun run --cwd plugins/plugin-openai test bun run --cwd plugins/plugin-app-control test bun run --cwd plugins/pl… (push) Has been cancelled
Windows CI / windows ([node packages/scripts/run-turbo.mjs run build --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/agent --concurrency=4 node packages/scripts/run-bash-linux-only.mjs scripts/verify-riscv64-buildpaths.sh node packages/scripts/run… (push) Has been cancelled
Windows CI / windows ([node packages/scripts/run-turbo.mjs run typecheck --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/cloud-shared --concurrency=4 bun run --cwd packages/core test bun run --cwd packages/shared test], core-runtime, 75) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:43:05 +08:00

1531 行
76 KiB
Bash
可执行文件

#!/usr/bin/env bash
# CPU-light static checks for the elizaOS Live overlay.
set -euo pipefail
# This gate is a long `set -e` assertion chain of silent test/grep commands, so
# an unannotated failure exits with no output at all — that silence hid a red
# nightly for over a week. Name the dying assertion on the way out.
trap 'echo "static-smoke: FAILED at ${BASH_SOURCE[0]}:${LINENO}: ${BASH_COMMAND}" >&2' ERR
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
REPO_ROOT="$(cd "${ROOT}/../../.." && pwd)"
SOURCE_ONLY="${ELIZAOS_STATIC_SOURCE_ONLY:-0}"
cd "${ROOT}"
if ! command -v rg >/dev/null 2>&1; then
echo "ripgrep (rg) is required for elizaOS Live static smoke checks." >&2
exit 1
fi
stat_mode() {
local path="$1"
local index_mode
index_mode="$(
git -C "${ROOT}" ls-files -s -- "${path}" 2>/dev/null | awk 'NR == 1 { print $1 }'
)"
case "${index_mode}" in
100755)
printf '755\n'
return 0
;;
100644)
printf '644\n'
return 0
;;
esac
stat -c %a "${path}" 2>/dev/null || stat -f %Mp%Lp "${path}" | sed 's/^0//'
}
echo "==> shell syntax"
test -f tails/data/debootstrap/scripts/debian-common.patch
test -f tails/data/splash.png
test -x tails/data/wrappers/apt-get
test -f docs/riscv64-gui-support.md
test -f tails/config/chroot_local-packageslists/elizaos-riscv64-gui.list
grep -Fq "virtio-gpu-pci" docs/riscv64-gui-support.md
grep -qx "linux-image-riscv64" tails/config/chroot_local-packageslists/elizaos-riscv64-gui.list
grep -qx "gnome-shell" tails/config/chroot_local-packageslists/elizaos-riscv64-gui.list
grep -qx "nodejs" tails/config/chroot_local-packageslists/elizaos-riscv64-gui.list
for tails_build_input in \
tails/config/chroot_local-includes/usr/share/tails/build/customize-ublock-assets \
tails/config/chroot_local-includes/usr/share/tails/build/group \
tails/config/chroot_local-includes/usr/share/tails/build/mksquashfs-excludes \
tails/config/chroot_local-includes/usr/share/tails/build/passwd \
tails/config/chroot_local-includes/usr/share/tails/build/plymouth-theme.diff
do
test -f "${tails_build_input}"
done
for custom_tails_package in \
apparmor \
apparmor-profiles \
evince \
evince-common \
flatpak \
haveged \
libapparmor1 \
libevdocument3-4t64 \
libevview3-3t64 \
libgcrypt20 \
libhavege2 \
libyelp0 \
yelp
do
grep -qx "${custom_tails_package}" tails/config/chroot_local-hooks/99-custom-packages-check
done
bash -n build.sh build-iso.sh tails/auto/build \
scripts/build-cache-contract.test.sh \
scripts/dev-sign-update-manifest.sh \
scripts/usb-write.sh \
scripts/generate-elizaos-brand-assets.sh \
scripts/run-cool-build.sh \
scripts/submodule-checkout.sh \
scripts/security-smoke.sh
grep -Fq 'if [ -f "${SRC}/binary.iso" ]' build-iso.sh
grep -Fq 'find "${SRC}" -maxdepth 1 -name' build-iso.sh
grep -Fq "sort -nr" build-iso.sh
bash scripts/build-cache-contract.test.sh
bash -n scripts/sync-runtime-to-chroot.sh
sh -n \
tails/auto/config \
tails/config/chroot_local-hooks/9100-install-elizaos \
tails/config/chroot_local-hooks/9150-brand-inherited-strings \
tails/config/chroot_local-hooks/99-zzzzzz_permissions \
tails/config/chroot_local-includes/usr/sbin/swapon.tails \
tails/config/chroot_local-includes/usr/local/bin/elizaos \
tails/config/chroot_local-includes/usr/lib/live/config/0001-elizaos-privacy-mode \
tails/config/chroot_local-includes/etc/NetworkManager/dispatcher.d/00-firewall.sh \
tails/config/chroot_local-includes/etc/NetworkManager/dispatcher.d/00-resolv-over-clearnet \
tails/config/chroot_local-includes/etc/NetworkManager/dispatcher.d/10-tor.sh \
tails/config/chroot_local-includes/usr/local/lib/elizaos/capability-runner \
tails/config/chroot_local-includes/usr/local/lib/elizaos/create-persistent-storage-session \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-keeper \
tails/config/chroot_local-includes/usr/local/lib/elizaos/persistence-maintenance \
tails/config/chroot_local-includes/usr/local/lib/elizaos/runtime-env \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-agent-user \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-browser-user \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-pill-user \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-renderer-user \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-user \
tails/config/chroot_local-includes/usr/local/lib/elizaos/update-health-check \
tails/config/chroot_local-includes/usr/local/lib/elizaos/update-manager \
tails/config/chroot_local-includes/usr/local/bin/tails-backup \
tails/config/chroot_local-includes/usr/local/lib/tails-report-disk-ioerrors \
tails/config/chroot_local-includes/usr/local/lib/thunderbird \
tails/config/chroot_local-includes/usr/local/lib/persistent-storage/on-activated-hooks/ElizaOSData/10-clean-runtime-state \
tails/config/chroot_local-includes/usr/local/lib/persistent-storage/on-activated-hooks/ElizaOSData/20-restart-elizaos \
tails/config/chroot_local-includes/usr/local/lib/persistent-storage/on-deactivated-hooks/ElizaOSData/20-restart-elizaos
node --check scripts/prepare-elizaos-app-overlay.mjs
node --check scripts/generate-release-evidence.mjs
node --check scripts/validate-model-catalog.mjs
node --check scripts/validate-runtime-overlay.mjs
node --check tails/config/chroot_local-includes/usr/local/lib/elizaos/renderer-server.mjs
grep -q 'ELIZAOS_APP_ARTIFACT' Justfile
grep -q 'ensure_plugin_runtime_dist "plugins/plugin-health" package-js' Justfile
grep -q 'ensure_plugin_runtime_dist "plugins/plugin-calendly" tsup-index' Justfile
python3 -m json.tool schemas/update-manifest.schema.json >/dev/null
python3 -m json.tool schemas/model-catalog.schema.json >/dev/null
python3 - \
tails/config/chroot_local-includes/usr/local/bin/tails-documentation \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-webkit-shell \
tails/config/chroot_local-includes/usr/local/bin/electrum \
tails/config/chroot_local-includes/usr/local/bin/tails-about \
tails/config/chroot_local-includes/usr/local/bin/tails-upgrade-frontend-wrapper \
tails/config/chroot_local-includes/usr/lib/python3/dist-packages/tailsgreeter/ui/main_window.py \
tails/config/chroot_local-includes/usr/lib/python3/dist-packages/tca/ui/main_window.py \
tails/config/chroot_local-includes/usr/lib/python3/dist-packages/tails_installer/gui.py \
tails/config/chroot_local-includes/usr/lib/python3/dist-packages/tps/device.py \
tails/config/chroot_local-includes/usr/local/lib/tails-low-ram-notify-user \
tails/config/chroot_local-includes/usr/local/lib/tails-uefi-ca-notify-user \
tails/config/chroot_local-includes/usr/local/lib/tails-virt-notify-user \
tails/config/chroot_local-includes/usr/local/lib/additional-software/asp-handle-package-changes \
tails/config/chroot_local-includes/usr/local/lib/additional-software/asp-install \
tails/config/chroot_local-includes/usr/local/lib/additional-software/asp-update-config <<'PY'
import py_compile
import sys
import tempfile
from pathlib import Path
with tempfile.TemporaryDirectory(prefix="elizaos-pycompile-") as tmp:
for index, path in enumerate(sys.argv[1:]):
py_compile.compile(
path,
cfile=str(Path(tmp) / f"{index}.pyc"),
doraise=True,
)
PY
for unit in \
tails/config/chroot_local-includes/etc/systemd/user/elizaos-agent.service \
tails/config/chroot_local-includes/etc/systemd/user/elizaos-renderer.service \
tails/config/chroot_local-includes/etc/systemd/user/elizaos-pill.service \
tails/config/chroot_local-includes/etc/systemd/user/elizaos.service
do
grep -q '^ConditionUser=1000$' "${unit}"
done
for executable in \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-webkit-shell \
tails/config/chroot_local-includes/usr/local/lib/elizaos/runtime-env \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-browser-user \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-agent-user \
tails/config/chroot_local-includes/usr/local/lib/elizaos/create-persistent-storage-session \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-pill-user \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-renderer-user \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-user \
tails/config/chroot_local-includes/usr/local/lib/elizaos/update-health-check \
tails/config/chroot_local-includes/usr/local/lib/elizaos/update-manager \
scripts/dev-sign-update-manifest.sh \
scripts/run-cool-build.sh \
scripts/usb-write.sh \
scripts/security-smoke.sh \
scripts/sync-runtime-to-chroot.sh
do
mode="$(stat_mode "${executable}")"
if [ "${mode}" != "755" ]; then
echo "${executable} must be mode 755, got ${mode}" >&2
exit 1
fi
done
echo "==> elizaOS branding"
for font in Poppins-Regular.ttf Poppins-Medium.ttf OFL.txt; do
test -f "tails/config/chroot_local-includes/usr/share/fonts/truetype/elizaos/${font}"
font_mode="$(stat_mode "tails/config/chroot_local-includes/usr/share/fonts/truetype/elizaos/${font}")"
if [ "${font_mode}" != "644" ]; then
echo "${font} must be mode 644, got ${font_mode}" >&2
exit 1
fi
done
grep -q "Poppins 10" \
tails/config/chroot_local-includes/etc/dconf/db/local.d/00_Tails_defaults
grep -q "Poppins Medium 10" \
tails/config/chroot_local-includes/etc/dconf/db/local.d/00_Tails_defaults
grep -q "color-scheme='prefer-light'" \
tails/config/chroot_local-includes/etc/dconf/db/local.d/00_Tails_defaults
grep -q '#0b35f1' \
tails/config/chroot_local-includes/usr/share/gnome-shell/extensions/window-list@gnome-shell-extensions.gcampax.github.com/stylesheet-dark.css
grep -q '^gir1.2-udisks-2.0$' \
tails/config/chroot_local-packageslists/tails-common.list
grep -q '#0B35F1' scripts/generate-elizaos-brand-assets.sh
grep -q 'logo_white_bluebg.svg' scripts/generate-elizaos-brand-assets.sh
if rg -n '#FF5800|#FF0000|#ff5800|#ff0000|ORANGE|RED|#ffe600|#f0b90b|#08080a|#0a0a0a|#03061f' \
scripts/generate-elizaos-brand-assets.sh \
tails/config/chroot_local-includes/usr/share/tails/greeter/greeter.css \
tails/config/chroot_local-includes/usr/share/tails/persistent-storage/style.css \
tails/config/chroot_local-includes/usr/share/doc/elizaos/website/doc.en.html \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-webkit-shell
then
echo "Core visible elizaOS surfaces must use the blue/white/soft-grey brand palette." >&2
exit 1
fi
grep -q 'font-family: "Poppins"' \
tails/config/chroot_local-includes/usr/share/tails/greeter/greeter.css
if [ "${SOURCE_ONLY}" != "1" ]; then
grep -q 'id="elizaos-live-theme"' \
tails/config/chroot_local-includes/usr/share/elizaos/elizaos-app/Resources/app/renderer/index.html
grep -q '#F7F9FF' \
tails/config/chroot_local-includes/usr/share/elizaos/elizaos-app/Resources/app/renderer/index.html
grep -q '"theme_color": "#F7F9FF"' \
tails/config/chroot_local-includes/usr/share/elizaos/elizaos-app/Resources/app/renderer/site.webmanifest
if rg -n '#08080a|#0a0a0a|black-translucent' \
tails/config/chroot_local-includes/usr/share/elizaos/elizaos-app/Resources/app/renderer/index.html \
tails/config/chroot_local-includes/usr/share/elizaos/elizaos-app/Resources/app/renderer/site.webmanifest
then
echo "Packaged app renderer must not expose the old dark shell metadata." >&2
exit 1
fi
if rg -n '#FF5800|#ff5800|#FF0000|#ff0000' \
tails/config/chroot_local-includes/usr/share/elizaos/elizaos-app/Resources/app/renderer/index.html \
tails/config/chroot_local-includes/usr/share/elizaos/elizaos-app/Resources/app/renderer/site.webmanifest
then
echo "Packaged app renderer metadata must use the blue/white elizaOS palette." >&2
exit 1
fi
fi
# StartupShell is a SHARED app-shell component (@elizaos/ui), and the elizaOS OS
# ISO bundles it verbatim — there is no downstream OS theme override for the
# boot splash. Per the per-surface accent system, the *app* surface owns the
# splash and it uses the launch token whose current intentional fallback is
# #000000 — the home shader's black base field, so boot flows seamlessly into
# the home ember glow (#9565). OS chrome such as the greeter/dashboard
# metadata/failure shell stays on the blue/white palette; first-run stays
# inside the launch surface. So this gate asserts the splash's current
# intentional launch token and the neutral bootstrap-gate surface, and only
# rejects the genuinely-stale hardcoded dark/gradient/glow styling from the
# pre-redesign shell (the token fallback is a host-overridable seam, not a
# hardcoded surface).
if rg -n 'bg-\[#08080a\]|bg-\[#0a0a0a\]|radial-gradient|blur-\[' \
"${REPO_ROOT}/packages/ui/src/components/shell/StartupShell.tsx"
then
echo "Startup shell must not reintroduce the old dark/gradient splash." >&2
exit 1
fi
grep -Fq 'bg-[var(--launch-bg,#000000)]' \
"${REPO_ROOT}/packages/ui/src/components/shell/StartupShell.tsx"
grep -q 'bg-\[#F7F6F4\]' \
"${REPO_ROOT}/packages/ui/src/components/shell/StartupShell.tsx"
if rg -n 'bg-danger|text-danger|variant="danger"|radial-gradient' \
"${REPO_ROOT}/packages/ui/src/components/shell/StartupFailureView.tsx"
then
echo "Startup failure shell must stay on the clean elizaOS white/blue surface." >&2
exit 1
fi
grep -q 'bg-bg' \
"${REPO_ROOT}/packages/ui/src/components/shell/StartupFailureView.tsx"
grep -q 'text-txt' \
"${REPO_ROOT}/packages/ui/src/components/shell/StartupFailureView.tsx"
grep -q 'text-destructive' \
"${REPO_ROOT}/packages/ui/src/components/shell/StartupFailureView.tsx"
# First-run onboarding now renders inline in the real floating chat overlay:
# #10302 deleted the dedicated FirstRunChat.tsx surface and seeds the onboarding
# greeting/choices as the same inline widgets the live chat uses. The overlay's
# text runs on the `text-txt` THEME token (hardcoded `text-white` literals were
# retokenized so the surface follows the active theme). Gate that overlay
# against the stale dark/gradient/glow styling from the pre-redesign first-run
# shell (mirrors the #10167 repoint when CompactOnboarding was removed).
first_run_shell="${REPO_ROOT}/packages/ui/src/components/shell/ContinuousChatOverlay.tsx"
grep -q 'text-txt' "${first_run_shell}"
if rg -n 'bg-\[#08080a\]|bg-\[#0a0a0a\]|radial-gradient|blur-\[' \
"${first_run_shell}"
then
echo "First-run onboarding (in-chat overlay) must not reintroduce the old dark/gradient shell." >&2
exit 1
fi
onboarding_states_css="${REPO_ROOT}/packages/ui/src/components/onboarding/states/onboarding.css"
if [ -f "${onboarding_states_css}" ]; then
if rg -n '#ff8a24|#FF5800|#ff5800|#ffe600|#f0b90b' "${onboarding_states_css}"
then
echo "Legacy onboarding states must stay on the blue/white elizaOS palette." >&2
exit 1
fi
fi
if [ "${SOURCE_ONLY}" != "1" ]; then
if rg -n '#FF5800|#ff5800|#ff8a24|#ffe600|#f0b90b' \
tails/config/chroot_local-includes/usr/share/elizaos/elizaos-app/Resources/app/renderer/brand \
--glob '*.svg'
then
echo "Packaged renderer SVG brand assets must not expose the old warm palette." >&2
exit 1
fi
if rg -n '#FF5800|#ff5800|#ff8a24|#e54f00|#c94400|#ff6d1f|255, ?88, ?0' \
tails/config/chroot_local-includes/usr/share/elizaos/elizaos-app/Resources/app/renderer/assets \
--glob '*.css'
then
echo "Packaged renderer CSS assets must not expose the old orange palette." >&2
exit 1
fi
fi
grep -q 'export const handleWalletRoutes' \
"${REPO_ROOT}/packages/agent/src/api/index.ts"
# Wallet routes must load via a lazy dynamic import (not a top-level static
# import) at startup. Tolerate an inline /* @vite-ignore */ comment in the call.
rg -q 'await import\((/\* @vite-ignore \*/ )?"@elizaos/plugin-wallet"\)' \
"${REPO_ROOT}/packages/agent/src/api/index.ts"
if rg -n 'handleWalletRoutes,\\n type WalletAddressesSnapshot' \
"${REPO_ROOT}/packages/agent/src/api/index.ts"
then
echo "Agent API barrel must not hard-import plugin-wallet during startup." >&2
exit 1
fi
python3 - <<'PY'
try:
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
except (ImportError, ValueError):
print("skip: python gi/gtk unavailable for GTK 3 greeter CSS parser check")
else:
Gtk.CssProvider().load_from_path(
"tails/config/chroot_local-includes/usr/share/tails/greeter/greeter.css"
)
PY
grep -q -- '--iso-application="elizaOS"' tails/auto/config
grep -q -- '--iso-publisher="https://elizaos.ai/"' tails/auto/config
grep -q -- '--iso-volume="ELIZAOS ' tails/auto/config
grep -q 'PRETTY_NAME="elizaOS"' tails/auto/config
grep -q 'SUPPORT_URL="https://elizaos.ai/"' tails/auto/config
grep -q 'BUG_REPORT_URL="https://elizaos.ai/"' tails/auto/config
grep -qx 'elizaOS' tails/config/chroot_local-includes/etc/issue.net
grep -q '^elizaOS \\n \\l$' tails/config/chroot_local-includes/etc/issue
grep -q 'WEBSITE_URL = "https://elizaos.ai"' \
tails/config/chroot_local-includes/usr/lib/python3/dist-packages/tailslib/website.py
grep -q 'WEBSITE_LOCAL_PATH = "/usr/share/doc/elizaos/website"' \
tails/config/chroot_local-includes/usr/lib/python3/dist-packages/tailslib/website.py
grep -q 'file:///usr/share/doc/elizaos/website/doc.en.html' \
tails/config/chroot_local-includes/usr/local/bin/tails-documentation
grep -q 'file:///usr/share/doc/elizaos/website/' \
tails/config/chroot_local-includes/usr/lib/python3/dist-packages/tailsgreeter/ui/main_window.py
if rg -n 'Documentation=https://tails\.net' \
tails/config/chroot_local-includes/usr/lib/systemd/user/*.service
then
echo "User systemd unit documentation must route to elizaOS help." >&2
exit 1
fi
grep -q '<property name="uri">doc.en.html#storage</property>' \
tails/config/chroot_local-includes/usr/share/tails/greeter/main.ui.in
grep -q 'font-family: "Poppins"' \
tails/config/chroot_local-includes/usr/share/doc/elizaos/website/doc.en.html
grep -q '#0B35F1' \
tails/config/chroot_local-includes/usr/share/doc/elizaos/website/doc.en.html
grep -q '"distribution": "elizaOS"' \
tails/config/chroot_local-includes/usr/lib/python3/dist-packages/tails_installer/config.py
grep -q '"partition_label": "elizaOS"' \
tails/config/chroot_local-includes/usr/lib/python3/dist-packages/tails_installer/config.py
grep -q 'ConditionPathExists=/etc/elizaos/base-updates-enabled' \
tails/config/chroot_local-includes/usr/lib/systemd/user/tails-upgrade-frontend.service
grep -q 'ELIZAOS_SECURITY_FEED_BASE_URL' \
tails/config/chroot_local-includes/usr/local/bin/tails-security-check
grep -q 'support@elizaos.ai' \
tails/config/chroot_local-includes/etc/whisperback/config.py
grep -q 'elizaOS Feedback' \
tails/config/chroot_local-includes/usr/share/whisperback/whisperback.ui.in
if rg -n 'support@tails|whisperback\.tails|tails\.boum\.org|Tails-Version' \
tails/config/chroot_local-includes/etc/whisperback/config.py
then
echo "WhisperBack config must not route elizaOS reports to inherited Tails endpoints." >&2
exit 1
fi
if command -v identify >/dev/null 2>&1; then
image_paths=(
tails/config/chroot_local-includes/usr/share/tails/desktop_wallpaper.png \
tails/config/chroot_local-includes/usr/share/tails/screensaver_background.png \
tails/config/binary_local-includes/EFI/debian/grub/splash.png \
tails/config/chroot_local-includes/usr/share/tails/greeter/icons/elizaos-logo.png \
tails/config/chroot_local-includes/usr/share/tails/elizaos-about-logo.png \
tails/config/chroot_local-includes/usr/share/plymouth/themes/elizaos/elizaos-wordmark.png \
tails/config/chroot_local-includes/usr/share/tails-installer/tails-liveusb-header.png \
tails/config/chroot_local-includes/usr/share/tails/bootx64.png \
tails/config/chroot_local-includes/usr/share/icons/hicolor/scalable/apps/elizaos.svg \
tails/config/chroot_local-includes/usr/share/pixmaps/elizaos.svg \
tails/config/chroot_local-includes/usr/share/pixmaps/elizaos.png \
)
if [ "${SOURCE_ONLY}" != "1" ]; then
renderer_icon="tails/config/chroot_local-includes/usr/share/elizaos/elizaos-app/Resources/app/renderer/brand/favicons/android-chrome-512x512.png"
if [ ! -f "${renderer_icon}" ]; then
renderer_icon="tails/config/chroot_local-includes/usr/share/elizaos/elizaos-app/Resources/app/renderer/favicon-256x256.png"
fi
image_paths+=(
tails/config/chroot_local-includes/usr/share/elizaos/elizaos-app/Resources/app/assets/appIcon.png
"${renderer_icon}"
)
fi
identify "${image_paths[@]}" >/dev/null
fi
if rg -n \
'Tails-based|Tails Cloner|Tails Documentation|Connect Tails|Tails USB stick|elizaOS \(Tails-based\)' \
README.md RELEASE_PATH.md docs/user-experience.md docs/mode-parity.md \
PLAN.md docs/build-infrastructure.md \
tails/auto/build tails/auto/config \
tails/config/chroot_local-includes/etc \
tails/config/chroot_local-includes/usr/share/tails \
tails/config/chroot_local-includes/usr/share/applications \
tails/config/chroot_local-includes/usr/share/doc/elizaos \
tails/config/chroot_local-includes/usr/share/tails-installer \
tails/config/chroot_local-includes/usr/lib/python3/dist-packages/tailsgreeter \
tails/config/chroot_local-includes/usr/lib/python3/dist-packages/tps_frontend \
tails/config/chroot_local-includes/usr/lib/python3/dist-packages/tails_installer \
tails/config/chroot_local-includes/usr/lib/python3/dist-packages/tca \
tails/config/chroot_local-includes/usr/local \
tails/config/binary_local-includes
then
echo "Visible elizaOS branding still contains stale Tails/elizaOS strings." >&2
exit 1
fi
if rg -n \
'Tails is up to date|This version of Tails|Restart Tails|Your Tails|Tails device|your Tails|restart Tails|when starting Tails|from Tails goes through|coming from a Tails user|Tails will|Tails failed|Tails couldn'\''t|improve Tails|Error Reading Data from Tails|reinstall Tails|tails\.net/doc|tails\.net/install|tails\.net/latest|tails\.net/gdm|tails\.net/ioerror|/usr/share/doc/tails/website' \
tails/config/chroot_local-includes/usr/src/iuk/lib/Tails/IUK/Frontend.pm \
tails/config/chroot_local-includes/usr/local/bin/tails-backup \
tails/config/chroot_local-includes/usr/local/bin/tails-security-check \
tails/config/chroot_local-includes/usr/local/bin/tails-upgrade-frontend-wrapper \
tails/config/chroot_local-includes/usr/local/lib/additional-software \
tails/config/chroot_local-includes/usr/local/lib/tails-gdm-error-message \
tails/config/chroot_local-includes/usr/local/lib/tails-low-ram-notify-user \
tails/config/chroot_local-includes/usr/local/lib/tails-uefi-ca-notify-user \
tails/config/chroot_local-includes/usr/local/lib/tails-report-disk-ioerrors \
tails/config/chroot_local-includes/usr/local/lib/tails-virt-notify-user \
tails/config/chroot_local-includes/usr/local/lib/polkit-policy-change-message \
tails/config/chroot_local-includes/usr/lib/python3/dist-packages/tailsgreeter/ui/main_window.py \
tails/config/chroot_local-includes/usr/lib/python3/dist-packages/tca/ui/main_window.py \
tails/config/chroot_local-includes/usr/share/tails/tca/main.ui.in \
tails/config/chroot_local-includes/usr/lib/python3/dist-packages/tails_installer/gui.py \
tails/config/chroot_local-includes/usr/share/tails-installer/tails-installer.ui.in \
tails/config/chroot_local-includes/usr/share/whisperback/whisperback.ui.in \
tails/config/binary_local-includes/isolinux/sorry32.txt
then
echo "High-visibility inherited Tails strings still need elizaOS branding." >&2
exit 1
fi
if rg -n \
'Preparing Tails for first use|Checking the Tails system partition|Configuring Tails|Tails specific tools|Tails live user' \
tails/config/chroot_local-includes/usr/share/initramfs-tools/scripts/init-premount/partitioning \
tails/config/chroot_local-includes/usr/share/initramfs-tools/scripts/init-top/read-and-update-random-seed-sector \
tails/config/chroot_local-includes/usr/lib/live/config/2000-aesthetics \
tails/config/chroot_local-includes/usr/local/bin/elizaos \
tails/config/chroot_local-includes/usr/share/desktop-directories/Tails.directory.in
then
echo "First-boot and launcher polish still exposes inherited Tails wording." >&2
exit 1
fi
launcher_paths=(
tails/config/chroot_local-includes/usr/share/applications/tails-documentation.desktop
tails/config/chroot_local-includes/usr/share/applications/tails-backup.desktop
tails/config/chroot_local-includes/usr/share/applications/tails-installer.desktop
tails/config/chroot_local-includes/usr/share/applications/tca.desktop
tails/config/chroot_local-includes/usr/share/applications/org.boum.tails.AdditionalSoftware.desktop
tails/config/chroot_local-includes/usr/share/applications/whisperback.desktop
)
existing_launcher_paths=()
for launcher_path in "${launcher_paths[@]}"; do
if [ -e "${launcher_path}" ]; then
existing_launcher_paths+=("${launcher_path}")
fi
done
if [ "${#existing_launcher_paths[@]}" -gt 0 ]; then
if rg -n '^(Name|Comment|Keywords)\[' "${existing_launcher_paths[@]}"; then
echo "Brand-sensitive desktop launchers must fall back to curated elizaOS labels." >&2
exit 1
fi
fi
if command -v desktop-file-validate >/dev/null 2>&1; then
echo "==> desktop entries"
desktop-file-validate \
tails/config/chroot_local-includes/usr/share/applications/elizaos.desktop
else
echo "skip: desktop-file-validate not installed"
fi
if [ -e tails/config/chroot_local-includes/etc/xdg/autostart/elizaos.desktop ]; then
echo "elizaOS must be supervised by systemd, not XDG autostart." >&2
exit 1
fi
grep -q '^Name=elizaOS$' \
tails/config/chroot_local-includes/usr/share/applications/elizaos.desktop
grep -q '^Icon=elizaos$' \
tails/config/chroot_local-includes/usr/share/applications/elizaos.desktop
grep -q '^StartupWMClass=elizaOS$' \
tails/config/chroot_local-includes/usr/share/applications/elizaos.desktop
grep -q 'IMG_FOOTPRINTS = "/usr/share/pixmaps/elizaos.svg"' \
tails/config/chroot_local-includes/usr/lib/python3/dist-packages/tca/ui/main_window.py
grep -q '^Icon=elizaos$' \
tails/config/chroot_local-includes/usr/share/applications/org.boum.tails.PersistentStorage.desktop.in
grep -q '<property name="icon-name">elizaos</property>' \
tails/config/chroot_local-includes/usr/share/tails/greeter/main.ui.in
grep -q '<property name="pixel-size">72</property>' \
tails/config/chroot_local-includes/usr/share/tails/greeter/main.ui.in
grep -Fq 'Save documents, browser bookmarks, Wi-Fi passwords, and elizaOS settings in encrypted Persistent Storage.' \
tails/config/chroot_local-includes/usr/share/tails/greeter/main.ui.in
grep -Fq 'Defaults are safe. Use "+" to add settings.' \
tails/config/chroot_local-includes/usr/share/tails/greeter/main.ui.in
grep -q '<property name="icon-name">elizaos</property>' \
tails/config/chroot_local-includes/usr/share/tails/persistent-storage/window.ui.in
for persistent_storage_view in \
tails/config/chroot_local-includes/usr/share/tails/persistent-storage/locked_view.ui.in \
tails/config/chroot_local-includes/usr/share/tails/persistent-storage/welcome_view.ui.in \
tails/config/chroot_local-includes/usr/share/tails/persistent-storage/passphrase_view.ui.in
do
grep -q '/usr/share/pixmaps/elizaos-persistent-storage.svg' "${persistent_storage_view}"
done
grep -q '<svg width="128" height="149"' \
tails/config/chroot_local-includes/usr/share/pixmaps/elizaos-persistent-storage.svg
grep -q '<property name="spacing">24</property>' \
tails/config/chroot_local-includes/usr/share/tails/persistent-storage/passphrase_view.ui.in
grep -q '<property name="row-spacing">24</property>' \
tails/config/chroot_local-includes/usr/share/tails/persistent-storage/welcome_view.ui.in
grep -q '^Exec=/usr/local/bin/elizaos$' \
tails/config/chroot_local-includes/usr/share/applications/elizaos.desktop
echo "==> elizaOS launch policy"
if grep -q 'ELECTROBUN_CONSOLE.*:-1' \
tails/config/chroot_local-includes/usr/local/bin/elizaos; then
echo "elizaOS must not force Electrobun console mode in elizaOS Live." >&2
exit 1
fi
grep -q 'ELIZA_DESKTOP_FORCE_CEF.*:-0' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
grep -q 'ELIZA_STARTUP_STATE_FILE' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
grep -q 'ELIZA_STARTUP_EVENTS_FILE' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
grep -q '/usr/local/lib/elizaos/runtime-env' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
grep -q 'ELIZAOS_RUNTIME_DIR:-/opt/elizaos' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
grep -q 'ELIZA_APP_ID.*org.elizaos.app' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
grep -q 'ELIZAOS_LIVE_EMBEDDING_FALLBACK.*:-1' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
grep -q 'ELIZA_DISABLE_PROACTIVE_AGENT.*:-1' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
grep -q 'ELIZAOS_CLOSE_MINIMIZES_TO_TRAY.*:-1' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
grep -q 'ELIZAOS_CEF_PROFILE_COMPAT.*:-1' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
grep -q 'ELIZAOS_BUNDLED_SKILLS_DIR' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
grep -q '@elizaos/skills/skills' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
grep -q 'normalize_tcp_port' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
grep -q 'normalize_loopback_bind' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
grep -q 'ELIZA_API_PORT.*:-31337' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
grep -q 'ELIZA_DESKTOP_API_BASE.*127.0.0.1' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
grep -q 'ELIZA_API_BASE.*ELIZA_DESKTOP_API_BASE' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
grep -q 'ELIZA_API_STRICT_PORT.*:-1' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
grep -q 'ELIZA_API_STRICT_PORT.*:-1' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-agent-user
grep -q '/usr/local/lib/elizaos/runtime-env' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-agent-user
grep -q '/usr/local/lib/elizaos/runtime-env' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-renderer-user
grep -q 'strictPortBindingEnabled' \
"${REPO_ROOT}/packages/agent/src/api/server.ts"
grep -q 'Strict port binding is enabled' \
"${REPO_ROOT}/packages/agent/src/api/server.ts"
grep -q '"Feather"' scripts/prepare-elizaos-app-overlay.mjs
grep -q '"Maximize2"' scripts/prepare-elizaos-app-overlay.mjs
grep -q 'Resources/app' scripts/prepare-elizaos-app-overlay.mjs
grep -q 'matchAll(namedImportRe)' scripts/prepare-elizaos-app-overlay.mjs
grep -q 'matchAll(destructuredImportRe)' scripts/prepare-elizaos-app-overlay.mjs
grep -q 'shouldWriteLiveFallbackPackage' scripts/prepare-elizaos-app-overlay.mjs
grep -q 'elizaos-live-overlay-manifest.json' scripts/prepare-elizaos-app-overlay.mjs
grep -q 'expectedPorts' scripts/prepare-elizaos-app-overlay.mjs
grep -q 'validate-runtime-overlay.mjs' docs/runtime-packaging.md
grep -q 'closeMinimizesToTray: true' scripts/prepare-elizaos-app-overlay.mjs
grep -q 'usr/lib/python3/dist-packages/tailsgreeter/ui/main_window.py' \
scripts/sync-runtime-to-chroot.sh
grep -Fq 'runtime["closeMinimizesToTray"] = True' \
tails/config/chroot_local-hooks/9100-install-elizaos
grep -q 'prepare_cef_profile' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
grep -q 'safe_cache_component' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
grep -q 'archive_cef_path' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
grep -q 'ln -sfn . "${cef_root}/partitions"' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
grep -q 'mkdir -p "${cef_root}/default"' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
grep -Fq 'printf '"'"'2\n'"'"' > "${cef_root}/.electrobun_cef_cache_version"' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
if grep -q 'mkdir -p.*partitions/default' \
tails/config/chroot_local-includes/usr/local/bin/elizaos; then
echo "elizaOS launcher must not create nested CEF partitions/default directories." >&2
exit 1
fi
if grep -q 'rm -rf.*partitions/default' \
tails/config/chroot_local-includes/usr/local/bin/elizaos; then
echo "elizaOS launcher must not wipe the persistent CEF profile on every start." >&2
exit 1
fi
if grep -q 'rm -rf.*Partitions/default' \
tails/config/chroot_local-includes/usr/local/bin/elizaos; then
echo "elizaOS launcher must not wipe the persistent CEF profile on every start." >&2
exit 1
fi
grep -q '.electrobun_cef_cache_version' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
if grep -q "printf '3\\\\n'" \
tails/config/chroot_local-includes/usr/local/bin/elizaos; then
echo "elizaOS launcher must write the CEF cache marker expected by the app." >&2
exit 1
fi
grep -q 'org.elizaos.app/dev/CEF' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
echo "==> elizaOS privacy fail-closed"
grep -q 'elizaos_privacy=0' \
tails/config/binary_local-includes/EFI/debian/grub.cfg
grep -q 'elizaos_privacy=1' \
tails/config/binary_local-includes/EFI/debian/grub.cfg
grep -q 'elizaos_privacy=0' \
tails/config/binary_local-hooks/10-syslinux_customize
grep -q 'elizaos_privacy=1' \
tails/config/binary_local-hooks/10-syslinux_customize
grep -q 'printf.*on.*> /etc/elizaos/privacy-mode' \
tails/config/chroot_local-includes/usr/lib/live/config/0001-elizaos-privacy-mode
grep -q 'printf on' \
tails/config/chroot_local-includes/etc/NetworkManager/dispatcher.d/00-firewall.sh
grep -q 'printf on' \
tails/config/chroot_local-includes/etc/NetworkManager/dispatcher.d/10-tor.sh
grep -q 'printf on' \
tails/config/chroot_local-includes/etc/NetworkManager/dispatcher.d/00-resolv-over-clearnet
grep -q 'printf on' \
tails/config/chroot_local-includes/usr/local/bin/elizaos
grep -q 'printf on' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/capability-runner
echo "==> elizaOS persistence contract"
python3 - <<'PY'
from pathlib import Path
path = Path("tails/config/chroot_local-includes/usr/lib/python3/dist-packages/tps/configuration/features.py")
text = path.read_text()
required = [
'Binding("elizaos/eliza", "/home/amnesia/.eliza")',
'Binding("elizaos/elizaos", "/home/amnesia/.elizaos")',
'Binding("elizaos/config", "/home/amnesia/.config/elizaOS")',
'Binding("elizaos/config-legacy", "/home/amnesia/.config/elizaos")',
'Binding("elizaos/config-legacy-caps", "/home/amnesia/.config/elizaOS")',
'Binding("elizaos/cef-cache", "/home/amnesia/.cache/org.elizaos.app")',
'Binding("elizaos/cef-cache-legacy", "/home/amnesia/.cache/org.elizaos.app")',
'translatable_name = "elizaOS Data"',
'name="elizaOS"',
'desktop_id="elizaos.desktop"',
'process_names=["launcher", "bun"]',
'self._run_persistence_maintenance("enter")',
'self._run_persistence_maintenance("leave")',
]
missing = [item for item in required if item not in text]
if missing:
raise SystemExit(f"{path}: missing ElizaOSData entries: {missing}")
PY
for launcher in \
tails/config/chroot_local-includes/usr/local/bin/elizaos \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-agent-user \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-browser-user \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-renderer-user \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-user
do
grep -q 'persistence-maintenance wait' "${launcher}"
done
grep -q '^ExecStart=/usr/local/lib/elizaos/create-persistent-storage-session$' \
tails/config/chroot_local-includes/usr/lib/systemd/user/tails-create-persistent-storage.service
grep -q 'session_flag="${runtime_dir}/elizaos-persistence-setup"' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/create-persistent-storage-session
grep -q 'ELIZAOS_PERSISTENCE_SESSION_ACTIVE=1 /usr/local/bin/tails-persistent-storage' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/create-persistent-storage-session
grep -q 'create-persistent-storage-session' \
tails/config/chroot_local-includes/usr/local/bin/tails-persistent-storage
grep -q 'ELIZAOS_PERSISTENCE_SESSION_ACTIVE' \
tails/config/chroot_local-includes/usr/local/bin/tails-persistent-storage
grep -q 'maintenance_helper=/usr/local/lib/elizaos/persistence-maintenance' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/create-persistent-storage-session
grep -q 'sudo "${maintenance_helper}" enter' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/create-persistent-storage-session
grep -q 'sudo "${maintenance_helper}" leave' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/create-persistent-storage-session
python3 - <<'PY'
from pathlib import Path
path = Path("tails/config/chroot_local-includes/usr/local/lib/elizaos/create-persistent-storage-session")
text = path.read_text()
if text.index("trap cleanup EXIT") > text.index('sudo "${maintenance_helper}" enter'):
raise SystemExit(f"{path}: cleanup trap must be registered before sudo enter can fail")
if "ELIZAOS_PERSISTENCE_SESSION_ACTIVE=1 /usr/local/bin/tails-persistent-storage \"$@\" &" not in text:
raise SystemExit(f"{path}: persistence wrapper must set recursion guard before spawning wizard")
PY
grep -q 'systemctl --user start --no-block elizaos.service' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/create-persistent-storage-session
grep -Fq 'args = ["enter"]' \
tails/config/chroot_local-includes/etc/generate-sudoers.d/elizaos-persistence-maintenance.toml
grep -Fq 'args = ["leave"]' \
tails/config/chroot_local-includes/etc/generate-sudoers.d/elizaos-persistence-maintenance.toml
grep -q '/etc/generate-sudoers.d/elizaos-persistence-maintenance.toml' \
tails/config/chroot_local-hooks/99-zzzzzz_permissions
grep -q '/usr/local/lib/elizaos/persistence-maintenance enter' \
tails/config/chroot_local-includes/etc/gdm3/PostLogin/Default
grep -q 'rm -f /run/elizaos/persistence-maintenance' \
tails/config/chroot_local-includes/etc/gdm3/PostLogin/Default
session_helper_mode="$(stat_mode tails/config/chroot_local-includes/usr/local/lib/elizaos/create-persistent-storage-session)"
if [ "${session_helper_mode}" != "755" ]; then
echo "create-persistent-storage-session must be mode 755, got ${session_helper_mode}" >&2
exit 1
fi
grep -q 'run_dir=/run/elizaos' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/persistence-maintenance
grep -Fq 'flag="${run_dir}/persistence-maintenance"' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/persistence-maintenance
grep -q 'user_persistence_flag="${runtime_dir}/elizaos-persistence-setup"' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/persistence-maintenance
grep -q 'systemctl --user "$@"' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/persistence-maintenance
grep -q 'kill --kill-whom=all --signal=TERM' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/persistence-maintenance
grep -q 'kill --kill-whom=all --signal=KILL' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/persistence-maintenance
if grep -q 'pkill .* -u amnesia' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/persistence-maintenance; then
echo "persistence-maintenance must not use broad pkill patterns against the live user." >&2
exit 1
fi
helper_mode="$(stat_mode tails/config/chroot_local-includes/usr/local/lib/elizaos/persistence-maintenance)"
if [ "${helper_mode}" != "755" ]; then
echo "persistence-maintenance must be mode 755, got ${helper_mode}" >&2
exit 1
fi
echo "==> filesystem modes"
if [ -d tails/config/chroot_local-includes/sbin ]; then
echo "top-level chroot_local-includes/sbin would replace Tails' /sbin -> /usr/sbin symlink" >&2
exit 1
fi
if [ -d tails/config/chroot_local-includes/lib ]; then
echo "top-level chroot_local-includes/lib would replace Tails' /lib -> /usr/lib symlink" >&2
exit 1
fi
if [ -e tails/config/chroot_local-includes/tmp ]; then
tmp_mode="$(stat_mode tails/config/chroot_local-includes/tmp)"
if [ "${tmp_mode}" != "1777" ]; then
echo "tails/config/chroot_local-includes/tmp must be mode 1777, got ${tmp_mode}" >&2
exit 1
fi
elif [ "${SOURCE_ONLY}" != "1" ]; then
echo "tails/config/chroot_local-includes/tmp is missing from the full build tree" >&2
exit 1
fi
swapon_mode="$(stat_mode tails/config/chroot_local-includes/usr/sbin/swapon.tails)"
if [ "${swapon_mode}" != "755" ]; then
echo "tails/config/chroot_local-includes/usr/sbin/swapon.tails must be mode 755, got ${swapon_mode}" >&2
exit 1
fi
if [ -e tails/chroot ] && [ ! -L tails/chroot/sbin ]; then
echo "tails/chroot/sbin must remain the usrmerge symlink to usr/sbin" >&2
exit 1
fi
if [ -e tails/chroot ] && [ ! -L tails/chroot/lib ]; then
echo "tails/chroot/lib must remain the usrmerge symlink to usr/lib" >&2
exit 1
fi
if [ -e tails/chroot/etc/systemd/system/display-manager.service ]; then
display_manager_target="$(
readlink tails/chroot/etc/systemd/system/display-manager.service
)"
case "${display_manager_target}" in
/usr/lib/systemd/system/gdm.service|/usr/lib/systemd/system/gdm3.service) ;;
*)
echo "display-manager.service must point at the real /usr/lib GDM unit, got ${display_manager_target}" >&2
exit 1
;;
esac
fi
grep -q 'clear_user_unit_override' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-keeper
grep -q 'user_persistence_flag="${runtime_dir}/elizaos-persistence-setup"' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-keeper
grep -q 'runuser -u amnesia -- env HOME=/home/amnesia sh -eu' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-keeper
grep -Fq 'rm -rf -- "${path}"' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-keeper
if grep -q 'ensure_plain_dir\|install -d -o amnesia\|chown .*amnesia' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-keeper; then
echo "elizaos-keeper must not mutate /home/amnesia paths as root." >&2
exit 1
fi
grep -q 'systemctl --user start --no-block elizaos.service' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-keeper
grep -q 'systemctl --user start --no-block elizaos-agent.service' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-keeper
grep -q 'systemctl --user start --no-block elizaos-renderer.service' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-keeper
if grep -q 'systemctl --user start --no-block elizaos-pill.service' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-keeper; then
echo "Voice pill must stay installed but opt-in until the pill renderer is production-ready." >&2
exit 1
fi
grep -q 'ELIZA_API_PORT.*:-31337' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-agent-user
grep -q 'ELIZAOS_LIVE_EMBEDDING_FALLBACK.*:-1' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-agent-user
grep -q 'ELIZA_DISABLE_PROACTIVE_AGENT.*:-1' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-agent-user
grep -q 'ELIZA_DISABLE_DIRECT_RUN.*:-1' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-agent-user
grep -q 'window.iconify()' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-webkit-shell
grep -q 'ELIZA_WORKSPACE_DIR.*ELIZA_STATE_DIR.*/workspace' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-agent-user
grep -Fq 'cd "${ELIZA_WORKSPACE_DIR}"' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-agent-user
grep -q 'unset LD_PRELOAD' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-agent-user
grep -q 'has_display_env' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-user
grep -q 'exit 75' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-user
grep -q 'ELIZAOS_RENDERER_PORT.*:-5174' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-renderer-user
grep -q 'renderer-server.mjs' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-renderer-user
grep -q 'ELIZA_DESKTOP_API_BASE.*127.0.0.1' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-renderer-user
grep -q '__ELIZAOS_APP_BOOT_CONFIG__' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/renderer-server.mjs
grep -q 'branding: {' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/renderer-server.mjs
grep -q 'appName: "elizaOS"' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/renderer-server.mjs
grep -q 'getAppInfo: () => nativeInfo' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/renderer-server.mjs
grep -q 'curl --noproxy' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-browser-user
grep -q 'elizaos-webkit-shell' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-browser-user
grep -q 'ELIZAOS_SHELL_URL' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-browser-user
grep -q 'WEBKIT_DISABLE_DMABUF_RENDERER' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-browser-user
grep -q 'gi.require_version("Gdk", "3.0")' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-webkit-shell
grep -q 'gi.require_version("WebKit2", "4.1")' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-webkit-shell
grep -q 'ELIZAOS_SHELL_MODE' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-webkit-shell
grep -q 'configure_pill_window' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-webkit-shell
grep -q 'set_keep_above(True)' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-webkit-shell
grep -q 'def pick_pill_monitor' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-webkit-shell
grep -q 'monitors-changed' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-webkit-shell
grep -Eq 'XDG_SESSION_TYPE|GtkLayerShell' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-webkit-shell
grep -q 'ELIZAOS_PILL_MONITOR' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-webkit-shell
grep -q 'Gdk.Device.get_position\|device.get_position' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-webkit-shell
grep -q 'ELIZAOS_SHELL_MODE=pill' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-pill-user
grep -q 'shell=pill' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-pill-user
grep -q 'elizaos-webkit-shell' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-pill-user
grep -q 'ELIZAOS_RENDERER_PORT.*:-5174' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-pill-user
grep -q '^ExecStart=/usr/local/lib/elizaos/start-elizaos-pill-user$' \
tails/config/chroot_local-includes/etc/systemd/user/elizaos-pill.service
for unit in \
tails/config/chroot_local-includes/etc/systemd/user/elizaos-agent.service \
tails/config/chroot_local-includes/etc/systemd/user/elizaos-renderer.service \
tails/config/chroot_local-includes/etc/systemd/user/elizaos-pill.service \
tails/config/chroot_local-includes/etc/systemd/user/elizaos.service
do
grep -q '^ConditionPathExists=!/run/elizaos/persistence-maintenance$' "${unit}"
done
if [ "${SOURCE_ONLY}" != "1" ]; then
verify_materialized_file() {
local rel="$1"
local src="tails/config/chroot_local-includes/${rel}"
local chroot_path="tails/chroot/${rel}"
local squashfs="tails/binary/live/filesystem.squashfs"
local tmp
if [ -e "${chroot_path}" ] && ! cmp -s "${src}" "${chroot_path}"; then
echo "${chroot_path} is stale; run scripts/sync-runtime-to-chroot.sh before binary rebuilds." >&2
exit 1
fi
if [ -f "${squashfs}" ] && command -v unsquashfs >/dev/null 2>&1; then
tmp="$(mktemp)"
if ! unsquashfs -cat "${squashfs}" "${rel}" >"${tmp}" 2>/dev/null; then
rm -f "${tmp}"
echo "${squashfs} is missing ${rel}" >&2
exit 1
fi
if ! cmp -s "${src}" "${tmp}"; then
rm -f "${tmp}"
echo "${squashfs}:${rel} is stale; rebuild the binary image after syncing the chroot." >&2
exit 1
fi
rm -f "${tmp}"
fi
}
for rel in \
etc/systemd/user/elizaos-agent.service \
etc/systemd/user/elizaos-renderer.service \
etc/systemd/user/elizaos.service \
usr/lib/systemd/user/tails-create-persistent-storage.service \
usr/local/lib/elizaos/create-persistent-storage-session \
usr/local/lib/elizaos/persistence-maintenance \
usr/local/lib/persistent-storage/on-activated-hooks/ElizaOSData/20-restart-elizaos \
usr/local/lib/persistent-storage/on-deactivated-hooks/ElizaOSData/20-restart-elizaos
do
verify_materialized_file "${rel}"
done
fi
if grep -q 'systemctl --global enable elizaos-pill.service' \
tails/config/chroot_local-hooks/52-update-systemd-units; then
echo "Voice pill must stay installed but opt-in until the pill renderer is production-ready." >&2
exit 1
fi
grep -q 'set_network_proxy_settings(WebKit2.NetworkProxyMode.NO_PROXY' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-webkit-shell
grep -q 'base_data_directory=data_dir' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-webkit-shell
grep -q 'delete-event' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/elizaos-webkit-shell
if grep -Eq 'tor-browser|firefox|MOZ_NO_REMOTE|-no-remote|-new-instance' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/start-elizaos-browser-user; then
echo "elizaOS app shell must use WebKitGTK, not Tor Browser/Firefox profile launch." >&2
exit 1
fi
if grep -q 'After=.*desktop.target' \
tails/config/chroot_local-includes/etc/systemd/user/elizaos.service; then
echo "elizaOS user service must not wait for Tails desktop.target/Tor bootstrap." >&2
exit 1
fi
if grep -q 'After=.*desktop.target' \
tails/config/chroot_local-includes/etc/systemd/user/elizaos-agent.service; then
echo "elizaOS agent service must not wait for Tails desktop.target/Tor bootstrap." >&2
exit 1
fi
if grep -q 'After=.*desktop.target' \
tails/config/chroot_local-includes/etc/systemd/user/elizaos-renderer.service; then
echo "elizaOS renderer service must not wait for Tails desktop.target/Tor bootstrap." >&2
exit 1
fi
grep -q '^WantedBy=default.target$' \
tails/config/chroot_local-includes/etc/systemd/user/elizaos-agent.service
grep -q '^WantedBy=default.target$' \
tails/config/chroot_local-includes/etc/systemd/user/elizaos-renderer.service
grep -q 'Wants=elizaos-renderer.service' \
tails/config/chroot_local-includes/etc/systemd/user/elizaos.service
grep -q 'ExecStart=/usr/local/lib/elizaos/start-elizaos-browser-user' \
tails/config/chroot_local-includes/etc/systemd/user/elizaos.service
grep -q '^WantedBy=default.target$' \
tails/config/chroot_local-includes/etc/systemd/user/elizaos.service
grep -q 'chown root:root' \
tails/config/chroot_local-hooks/99-zzzzzz_permissions
grep -q '/usr/local/lib/elizaos/capability-runner' \
tails/config/chroot_local-hooks/99-zzzzzz_permissions
grep -q '/etc/systemd/user/elizaos.service' \
tails/config/chroot_local-hooks/99-zzzzzz_permissions
grep -q '/etc/systemd/user/elizaos-agent.service' \
tails/config/chroot_local-hooks/99-zzzzzz_permissions
grep -q '/etc/systemd/user/elizaos-renderer.service' \
tails/config/chroot_local-hooks/99-zzzzzz_permissions
grep -q 'systemctl --global enable elizaos-agent.service' \
tails/config/chroot_local-hooks/52-update-systemd-units
grep -q 'systemctl --global enable elizaos-renderer.service' \
tails/config/chroot_local-hooks/52-update-systemd-units
grep -q 'systemctl enable elizaos-update-verify.service' \
tails/config/chroot_local-hooks/52-update-systemd-units
grep -q 'systemctl enable elizaos-root-mode.service' \
tails/config/chroot_local-hooks/52-update-systemd-units
grep -q 'Wants=.*elizaos-update-verify.service' \
tails/config/chroot_local-includes/etc/systemd/system/elizaos.service
grep -q 'Wants=.*elizaos-update-health-check.service' \
tails/config/chroot_local-includes/etc/systemd/system/elizaos.service
grep -q 'After=display-manager.service elizaos-update-verify.service' \
tails/config/chroot_local-includes/etc/systemd/system/elizaos.service
grep -q 'DirectoryMode=0755' \
tails/config/chroot_local-includes/usr/lib/systemd/system/run-nosymfollow.mount.d/elizaos-root-mode.conf
grep -q 'After=run-nosymfollow.mount systemd-tmpfiles-setup.service' \
tails/config/chroot_local-includes/etc/systemd/system/elizaos-root-mode.service
grep -q 'Before=sysinit.target basic.target dbus.service polkit.service gdm.service tails-persistent-storage.service' \
tails/config/chroot_local-includes/etc/systemd/system/elizaos-root-mode.service
grep -q 'ExecStart=/bin/chmod 0755 / /run/nosymfollow' \
tails/config/chroot_local-includes/etc/systemd/system/elizaos-root-mode.service
grep -q 'ExecStart=/usr/local/lib/elizaos/update-health-check' \
tails/config/chroot_local-includes/etc/systemd/system/elizaos-update-health-check.service
grep -q 'ELIZAOS_UPDATE_HEALTH_MARK_BAD_ON_TIMEOUT' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/update-health-check
grep -q 'ExecStart=/usr/local/lib/elizaos/update-manager verify' \
tails/config/chroot_local-includes/etc/systemd/system/elizaos-update-verify.service
grep -q 'ReadWritePaths=/run/elizaos' \
tails/config/chroot_local-includes/etc/systemd/system/elizaos-update-verify.service
grep -q -- '-/live/persistence/TailsData_unlocked/elizaos-system' \
tails/config/chroot_local-includes/etc/systemd/system/elizaos-update-verify.service
grep -q -- '-/live/persistence/TailsData_unlocked/elizaos-system' \
tails/config/chroot_local-includes/etc/systemd/system/elizaos-update-health-check.service
grep -q '/live/persistence/TailsData_unlocked/elizaos-system' \
tails/config/chroot_local-includes/etc/systemd/system/elizaos-update-verify.service
grep -q 'ProtectHome=read-only' \
tails/config/chroot_local-includes/etc/systemd/system/elizaos-update-verify.service
if [ -e tails/config/chroot_local-includes/etc/systemd/system/dbus.service.d/elizaos-working-directory.conf ] ||
[ -e tails/config/chroot_local-includes/etc/systemd/system/polkit.service.d/elizaos-working-directory.conf ]; then
echo "D-Bus and polkit should not carry elizaOS working-directory workarounds; fix root filesystem mode instead." >&2
exit 1
fi
grep -q 'ELIZAOS_RUNTIME_ROOT' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/runtime-env
if grep -q 'ELIZAOS_ALLOW_RUNTIME_ENV_OVERRIDES' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/runtime-env; then
echo "runtime-env must not expose caller-controlled runtime override escape hatches." >&2
exit 1
fi
grep -q 'gpgv --keyring' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/update-manager
grep -q 'write_fallback_selector "missing-keyring"' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/update-manager
grep -q 'filesComplete.*true' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/update-manager
grep -q 'runtime_store' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/update-manager
grep -q 'contains unlisted file' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/update-manager
grep -q 'materialized runtime hash mismatch' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/update-manager
grep -q 'modelCatalog' \
schemas/update-manifest.schema.json
grep -q 'filesComplete' \
schemas/update-manifest.schema.json
grep -q 'elizaos.modelCatalog' \
schemas/model-catalog.schema.json
grep -q 'ELIZAOS_RELEASE_KEYRING' scripts/usb-write.sh
grep -q 'gpgv --keyring' scripts/usb-write.sh
grep -q 'ELIZAOS_CREATE_USB_IMAGE_FROM_ISO' scripts/usb-write.sh
grep -q 'Refusing to write ISO directly to USB' scripts/usb-write.sh
grep -q 'sgdisk --move-second-header' scripts/usb-write.sh
grep -q 'prepare a cloned USB image for Persistent Storage' scripts/usb-write.sh
if [ "$(grep -c 'WARNING: writing an ISO directly is for explicit override/testing only' scripts/usb-write.sh)" != "1" ]; then
echo "scripts/usb-write.sh must emit the direct-ISO warning exactly once" >&2
exit 1
fi
grep -q 'PARTITION_LABEL = "Tails"' tails/auto/scripts/create-usb-image-from-iso
grep -q 'FILESYSTEM_LABEL = "ELIZAOS"' tails/auto/scripts/create-usb-image-from-iso
grep -q 'FILESYSTEM_LABEL.ljust(11)' tails/auto/scripts/create-usb-image-from-iso
grep -q 'chroot_image = CHROOT_DIR / "tmp" / Path(self.image).name' tails/auto/scripts/create-usb-image-from-iso
grep -q 'yield chroot_image_arg' tails/auto/scripts/create-usb-image-from-iso
grep -q 'for mountpoint in reversed(mounted)' tails/auto/scripts/create-usb-image-from-iso
grep -q '::ELIZAOS' tails/config/chroot_local-includes/usr/share/initramfs-tools/scripts/lib/first_boot_repartition
if grep -q '::Tails' tails/config/chroot_local-includes/usr/share/initramfs-tools/scripts/lib/first_boot_repartition; then
echo "first boot repartition must keep ELIZAOS filesystem label" >&2
exit 1
fi
grep -q 'TAILS_ROOT = Path(__file__).resolve().parents\[2\]' \
tails/auto/scripts/create-usb-image-from-iso
grep -q 'CHROOT_DIR = TAILS_ROOT / "chroot"' \
tails/auto/scripts/create-usb-image-from-iso
grep -qx 'sudo' tails/config/chroot_local-packageslists/tails-common.list
grep -Eq '^syslinux( \[amd64\])?$' tails/config/chroot_local-packageslists/tails-common.list
grep -q 'elizaos.sbomLite' scripts/generate-release-evidence.mjs
grep -q 'elizaos.releaseProvenance' scripts/generate-release-evidence.mjs
grep -q 'elizaos.modelCatalog' scripts/validate-model-catalog.mjs
if grep -Eq 'apt-(update|install)|restart-network' \
tails/config/chroot_local-includes/usr/local/lib/elizaos/capability-runner; then
echo "capability-runner must not expose broad package/network mutation commands" >&2
exit 1
fi
grep -q 'args = \["root-status"\]' \
tails/config/chroot_local-includes/etc/generate-sudoers.d/elizaos-capability-runner.toml
if [ "${SOURCE_ONLY}" != "1" ] && [ -e tails/config/chroot_local-includes/usr/share/elizaos/elizaos-app/Resources/build.json ]; then
echo "==> elizaOS live overlay"
node scripts/prepare-elizaos-app-overlay.mjs --check
node scripts/validate-runtime-overlay.mjs
fi
echo "==> elizaOS package exports"
node - <<'NODE'
const fs = require("fs");
for (const root of [
"tails/config/chroot_local-includes/usr/share/elizaos/elizaos-app",
"tails/chroot/opt/elizaos",
]) {
if (!fs.existsSync(root)) continue;
const versionPath = `${root}/Resources/version.json`;
const version = JSON.parse(fs.readFileSync(versionPath, "utf8"));
if (version.name !== "elizaOS") {
throw new Error(`${versionPath}: name must be elizaOS`);
}
if (version.identifier !== "org.elizaos.app") {
throw new Error(`${versionPath}: identifier must be org.elizaos.app`);
}
const brandPath = `${root}/Resources/app/brand-config.json`;
const brand = JSON.parse(fs.readFileSync(brandPath, "utf8"));
for (const [key, expected] of Object.entries({
appName: "elizaOS",
appId: "org.elizaos.app",
namespace: "eliza",
urlScheme: "elizaos",
configDirName: "elizaOS",
})) {
if (brand[key] !== expected) {
throw new Error(`${brandPath}: ${key} must be ${expected}`);
}
}
const entryPath = `${root}/Resources/app/eliza-dist/entry.js`;
const appCoreEntryPath = `${root}/Resources/app/eliza-dist/node_modules/@elizaos/app-core/dist/entry.js`;
if (!fs.existsSync(entryPath)) {
throw new Error(`${entryPath}: missing agent runtime entry`);
}
if (!fs.existsSync(appCoreEntryPath)) {
throw new Error(`${appCoreEntryPath}: missing bundled app-core runtime entry`);
}
const entry = fs.readFileSync(entryPath, "utf8");
if (entry.includes("../packages/") || entry.includes("src/entry.ts")) {
throw new Error(
`${entryPath}: live runtime entry must not point back to source checkout paths`,
);
}
if (!entry.includes("./node_modules/@elizaos/app-core/dist/entry.js")) {
throw new Error(`${entryPath}: live runtime entry must import bundled app-core dist`);
}
}
for (const path of [
"tails/config/chroot_local-includes/usr/share/elizaos/elizaos-app/Resources/app/eliza-dist/node_modules/@elizaos/agent/package.json",
"tails/chroot/opt/elizaos/Resources/app/eliza-dist/node_modules/@elizaos/agent/package.json",
]) {
if (!fs.existsSync(path)) continue;
const pkg = JSON.parse(fs.readFileSync(path, "utf8"));
const target = pkg.exports?.["./services/permissions/probers/index"];
if (
target?.import !==
"./dist/packages/agent/src/services/permissions/probers/index.js"
) {
throw new Error(
`${path}: missing packaged permissions prober export required by Electrobun`,
);
}
}
for (const [path, target] of [
[
"tails/config/chroot_local-includes/usr/share/elizaos/elizaos-app/node_modules",
"Resources/app/eliza-dist/node_modules",
],
[
"tails/config/chroot_local-includes/usr/share/elizaos/elizaos-app/bin/node_modules",
"../Resources/app/eliza-dist/node_modules",
],
["tails/chroot/opt/elizaos/node_modules", "Resources/app/eliza-dist/node_modules"],
[
"tails/chroot/opt/elizaos/bin/node_modules",
"../Resources/app/eliza-dist/node_modules",
],
]) {
if (!fs.existsSync(path)) continue;
const actual = fs.readlinkSync(path);
if (actual !== target) {
throw new Error(`${path}: expected symlink to ${target}, got ${actual}`);
}
}
for (const packageName of [
"@elizaos/plugin-whatsapp",
"@elizaos/plugin-streaming",
"@elizaos/plugin-x402",
"@elizaos/plugin-mcp",
"@elizaos/plugin-imessage",
"@elizaos/plugin-capacitor-bridge",
"@elizaos/plugin-aosp-local-inference",
"@elizaos/plugin-background-runner",
"@elizaos/plugin-mlx",
]) {
for (const root of [
"tails/config/chroot_local-includes/usr/share/elizaos/elizaos-app",
"tails/chroot/opt/elizaos",
]) {
if (!fs.existsSync(root)) continue;
const packagePath = `${root}/Resources/app/eliza-dist/node_modules/${packageName}/package.json`;
const indexPath = `${root}/Resources/app/eliza-dist/node_modules/${packageName}/index.js`;
const pkg = JSON.parse(fs.readFileSync(packagePath, "utf8"));
if (pkg.version === "0.0.0-elizaos-live-stub") {
if (pkg.type !== "module") {
throw new Error(`${packagePath}: optional desktop connector stub must be ESM`);
}
const index = fs.readFileSync(indexPath, "utf8");
if (!index.includes("export default undefined")) {
throw new Error(`${indexPath}: optional desktop connector stub is malformed`);
}
}
}
}
for (const root of [
"tails/config/chroot_local-includes/usr/share/elizaos/elizaos-app",
"tails/chroot/opt/elizaos",
]) {
if (!fs.existsSync(root)) continue;
const nodeModules = `${root}/Resources/app/eliza-dist/node_modules`;
const orchestratorIndex = `${nodeModules}/agent-orchestrator/index.js`;
const orchestrator = fs.readFileSync(orchestratorIndex, "utf8");
if (!orchestrator.includes("ELIZAOS") || !orchestrator.includes("capability-runner")) {
throw new Error(`${orchestratorIndex}: missing live OS broker action`);
}
const appControlPackagePath = `${nodeModules}/@elizaos/plugin-app-control/package.json`;
const appControlPackage = JSON.parse(fs.readFileSync(appControlPackagePath, "utf8"));
if (appControlPackage.main !== "./src/index.ts") {
throw new Error(`${appControlPackagePath}: app-control must be source-staged`);
}
for (const packageName of [
"@elizaos/plugin-app-manager",
"@elizaos/plugin-calendly",
"@elizaos/plugin-health",
"@elizaos/plugin-registry",
]) {
const distIndex = `${nodeModules}/${packageName}/dist/index.js`;
if (!fs.existsSync(distIndex)) {
throw new Error(`${distIndex}: required runtime plugin dist is missing`);
}
}
const forcedLiveStubs = new Map([
["@elizaos/app-model-tester", "model-tester"],
["@elizaos/plugin-documents", "documents"],
["@elizaos/plugin-google", "google"],
["@elizaos/plugin-hyperliquid", "hyperliquid"],
["@elizaos/plugin-personal-assistant", "lifeops"],
["@elizaos/plugin-polymarket", "polymarket"],
["@elizaos/plugin-shopify", "shopify"],
["@elizaos/plugin-training", "training"],
]);
for (const [packageName, marker] of forcedLiveStubs) {
const stubPath = `${nodeModules}/${packageName}/index.js`;
const packagePath = `${nodeModules}/${packageName}/package.json`;
const packageJson = JSON.parse(fs.readFileSync(packagePath, "utf8"));
if (packageJson.version !== "0.0.0-elizaos-live-stub") {
throw new Error(`${packagePath}: ${packageName} must be a live-safe stub in the base USB runtime`);
}
const stub = fs.readFileSync(stubPath, "utf8");
if (!stub.includes(marker)) {
throw new Error(`${stubPath}: ${packageName} live-safe stub is malformed`);
}
for (const subpath of ["plugin.js", "routes/plugin.js", "setup-routes.js"]) {
const subpathFile = `${nodeModules}/${packageName}/${subpath}`;
if (!fs.existsSync(subpathFile)) {
throw new Error(`${subpathFile}: live-safe route subpath stub is missing`);
}
}
}
const sourceRuntimePackages = new Map([
["@elizaos/cloud-sdk", "./src/index.ts"],
["@elizaos/plugin-agent-skills", "./src/index.ts"],
["@elizaos/plugin-browser", "./src/index.ts"],
["@elizaos/plugin-coding-tools", "./src/index.ts"],
["@elizaos/plugin-commands", "./src/index.ts"],
["@elizaos/plugin-elizacloud", "./src/index.node.ts"],
["@elizaos/plugin-video", "./src/index.ts"],
]);
for (const [packageName, expectedExport] of sourceRuntimePackages) {
const packagePath = `${nodeModules}/${packageName}/package.json`;
const packageJson = JSON.parse(fs.readFileSync(packagePath, "utf8"));
const rootExport = packageJson.exports?.["."] ?? packageJson.exports;
const importTarget =
typeof rootExport === "string" ? rootExport : rootExport?.import ?? rootExport?.default;
if (importTarget !== expectedExport) {
throw new Error(`${packagePath}: ${packageName} must export ${expectedExport} in the live runtime`);
}
const expectedSourcePath = `${nodeModules}/${packageName}/${expectedExport.replace(/^\.\//, "")}`;
if (!fs.existsSync(expectedSourcePath)) {
throw new Error(`${expectedSourcePath}: source-staged runtime package is missing`);
}
}
const rendererRoot = `${root}/Resources/app/renderer`;
const indexPath = `${rendererRoot}/index.html`;
const manifestPath = `${rendererRoot}/site.webmanifest`;
const wallpaperPath = "tails/config/chroot_local-includes/usr/share/tails/desktop_wallpaper.png";
if (fs.existsSync(indexPath)) {
const index = fs.readFileSync(indexPath, "utf8");
if (!index.includes("<title>elizaOS</title>")) {
throw new Error(`${indexPath}: browser shell title must be elizaOS`);
}
if (index.includes("<title>elizaOS</title>") || index.includes("app.elizaos.ai")) {
throw new Error(`${indexPath}: browser shell metadata still contains elizaOS branding`);
}
}
if (fs.existsSync(manifestPath)) {
const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf8"));
if (manifest.name !== "elizaOS" || manifest.short_name !== "elizaOS") {
throw new Error(`${manifestPath}: web manifest must be branded elizaOS`);
}
}
for (const name of ["splash-bg.png", "splash-bg-dark.png", "og-image.png"]) {
const imagePath = `${rendererRoot}/${name}`;
if (
fs.existsSync(imagePath) &&
fs.existsSync(wallpaperPath) &&
Buffer.compare(fs.readFileSync(imagePath), fs.readFileSync(wallpaperPath)) !== 0
) {
throw new Error(`${imagePath}: renderer splash image must use the elizaOS wallpaper`);
}
}
for (const file of fs.readdirSync(`${rendererRoot}/assets`).filter((name) => name.endsWith(".js"))) {
const text = fs.readFileSync(`${rendererRoot}/assets/${file}`, "utf8");
const forbidden = [
"WELCOME TO ELIZAOS",
"Welcome to elizaOS",
"elizaOS's HTTP API",
'appName:"elizaOS"',
'orgName:"elizaos"',
'repoName:"eliza"',
'cliName:"elizaos"',
'envPrefix:"ELIZAOS"',
'namespace:"elizaos"',
'urlScheme:"elizaos"',
'docsUrl:"https://docs.elizaos.ai"',
'appUrl:"https://app.elizaos.ai"',
'hashtag:"#elizaOSAgent"',
'fileExtension:".elizaos-agent"',
'packageScope:"elizaos"',
"elizaos.ai",
];
for (const needle of forbidden) {
if (text.includes(needle)) {
throw new Error(`${rendererRoot}/assets/${file}: visible elizaOS launch branding remains: ${needle}`);
}
}
}
}
for (const root of [
"tails/config/chroot_local-includes/usr/share/elizaos/elizaos-app",
"tails/chroot/opt/elizaos",
]) {
if (!fs.existsSync(root)) continue;
const lucidePackagePath = `${root}/Resources/app/eliza-dist/node_modules/lucide-react/package.json`;
const lucideIndexPath = `${root}/Resources/app/eliza-dist/node_modules/lucide-react/index.js`;
const lucidePackage = JSON.parse(fs.readFileSync(lucidePackagePath, "utf8"));
if (lucidePackage.version === "0.0.0-elizaos-live-stub") {
const lucideIndex = fs.readFileSync(lucideIndexPath, "utf8");
for (const expected of [
"export function Icon()",
"export const createLucideIcon",
"export const Feather",
"export const Loader2",
"export const Maximize2",
"export const Settings",
]) {
if (!lucideIndex.includes(expected)) {
throw new Error(`${lucideIndexPath}: missing ${expected}`);
}
}
}
const coreIndexPath = `${root}/Resources/app/eliza-dist/node_modules/@elizaos/core/src/index.node.ts`;
if (fs.existsSync(coreIndexPath)) {
const coreIndex = fs.readFileSync(coreIndexPath, "utf8");
if (coreIndex.includes('export * from "./testing";')) {
throw new Error(`${coreIndexPath}: production runtime must not export @elizaos/core testing helpers`);
}
}
const localInferenceIndexPath = `${root}/Resources/app/eliza-dist/node_modules/@elizaos/plugin-local-inference/dist/index.js`;
const localInferenceRuntimePath = `${root}/Resources/app/eliza-dist/node_modules/@elizaos/plugin-local-inference/dist/runtime/index.js`;
for (const path of [localInferenceIndexPath, localInferenceRuntimePath]) {
if (!fs.existsSync(path)) continue;
const text = fs.readFileSync(path, "utf8");
if (!text.includes("ELIZAOS_LIVE_EMBEDDING_FALLBACK")) {
throw new Error(`${path}: missing elizaOS Live embedding fallback gate`);
}
}
const localInferencePackageJsonPath = `${root}/Resources/app/eliza-dist/node_modules/@elizaos/plugin-local-inference/package.json`;
const localInferencePackageJson = JSON.parse(fs.readFileSync(localInferencePackageJsonPath, "utf8"));
const embeddingPresetsExport = localInferencePackageJson.exports?.["./runtime/embedding-presets"];
if (embeddingPresetsExport?.import !== "./src/runtime/embedding-presets.ts") {
throw new Error(`${localInferencePackageJsonPath}: packaged embedding presets export must resolve to source`);
}
const embeddingPresetsPath = `${root}/Resources/app/eliza-dist/node_modules/@elizaos/plugin-local-inference/src/runtime/embedding-presets.ts`;
if (!fs.existsSync(embeddingPresetsPath)) {
throw new Error(`${embeddingPresetsPath}: missing packaged embedding presets source`);
}
const workerRuntimePackageJsonPath = `${root}/Resources/app/eliza-dist/node_modules/@elizaos/plugin-worker-runtime/package.json`;
const workerRuntimePackageJson = JSON.parse(fs.readFileSync(workerRuntimePackageJsonPath, "utf8"));
if (workerRuntimePackageJson.exports?.["."]?.import !== "./src/index.ts") {
throw new Error(`${workerRuntimePackageJsonPath}: packaged worker runtime must resolve to source`);
}
const workerRuntimeErrorPath = `${root}/Resources/app/eliza-dist/node_modules/@elizaos/plugin-worker-runtime/src/error.ts`;
if (!fs.existsSync(workerRuntimeErrorPath)) {
throw new Error(`${workerRuntimeErrorPath}: missing packaged worker runtime source`);
}
const remoteManifestPackageJsonPath = `${root}/Resources/app/eliza-dist/node_modules/@elizaos/plugin-remote-manifest/package.json`;
const remoteManifestPackageJson = JSON.parse(fs.readFileSync(remoteManifestPackageJsonPath, "utf8"));
if (remoteManifestPackageJson.exports?.["."]?.import !== "./src/index.ts") {
throw new Error(`${remoteManifestPackageJsonPath}: packaged remote manifest must resolve to source`);
}
const sqlPackageJsonPath = `${root}/Resources/app/eliza-dist/node_modules/@elizaos/plugin-sql/package.json`;
const sqlPackageJson = JSON.parse(fs.readFileSync(sqlPackageJsonPath, "utf8"));
if (sqlPackageJson.exports?.["."]?.import !== "./src/index.node.ts") {
throw new Error(`${sqlPackageJsonPath}: packaged SQL plugin must resolve to node source`);
}
const sqlIndexPath = `${root}/Resources/app/eliza-dist/node_modules/@elizaos/plugin-sql/src/index.node.ts`;
if (!fs.existsSync(sqlIndexPath)) {
throw new Error(`${sqlIndexPath}: missing packaged SQL plugin node source`);
}
const bunIndexPath = `${root}/Resources/app/bun/index.js`;
const bunIndex = fs.readFileSync(bunIndexPath, "utf8");
for (const expected of [
"ELIZAOS_CLOSE_MINIMIZES_TO_TRAY",
"Window close requested - minimized to tray",
"await this.hideWindow()",
"win.minimize()",
]) {
if (!bunIndex.includes(expected)) {
throw new Error(`${bunIndexPath}: missing close-to-tray behavior: ${expected}`);
}
}
}
NODE
if [ -e tails/chroot/opt/elizaos/Resources/build.json ]; then
echo "==> elizaOS installed app config"
node -e '
const fs = require("fs");
const path = "tails/chroot/opt/elizaos/Resources/build.json";
const build = JSON.parse(fs.readFileSync(path, "utf8"));
if (build.defaultRenderer !== "native") {
throw new Error(`${path}: defaultRenderer must be native for elizaOS Live`);
}
if (JSON.stringify(build.availableRenderers) !== JSON.stringify(["native"])) {
throw new Error(`${path}: availableRenderers must be [\"native\"] for elizaOS Live`);
}
if (build.runtime?.exitOnLastWindowClosed !== false) {
throw new Error(`${path}: runtime.exitOnLastWindowClosed must be false`);
}
if (build.runtime?.closeMinimizesToTray !== true) {
throw new Error(`${path}: runtime.closeMinimizesToTray must be true`);
}
if (
build.chromiumFlags?.["user-data-dir"] !==
"/home/amnesia/.cache/org.elizaos.app/dev/CEF/partitions"
) {
throw new Error(`${path}: Chromium user-data-dir must target the CEF partitions symlink`);
}
'
fi
if [ -e tails/chroot/opt/elizaos/bin/chrome-sandbox ]; then
sandbox_mode="$(stat_mode tails/chroot/opt/elizaos/bin/chrome-sandbox)"
if [ "${sandbox_mode}" != "755" ]; then
echo "chrome-sandbox must not be setuid in native-renderer elizaOS Live, got ${sandbox_mode}" >&2
exit 1
fi
fi
if command -v xmllint >/dev/null 2>&1; then
echo "==> XML"
xmllint --noout \
tails/config/chroot_local-includes/usr/share/tails/persistent-storage/features_view.ui.in \
tails/config/chroot_local-includes/usr/share/tails/greeter/main.ui.in
else
echo "skip: xmllint not installed"
fi
echo "==> Python compile"
python3 -m py_compile \
tails/config/chroot_local-includes/usr/lib/python3/dist-packages/tps/configuration/features.py \
tails/config/chroot_local-includes/usr/lib/python3/dist-packages/tps_frontend/views/features_view.py
find tails/config/chroot_local-includes/usr/lib/python3/dist-packages \
-type d -name __pycache__ -prune -exec rm -rf {} +
if [ "${ELIZAOS_STATIC_TSC:-0}" = "1" ] && [ -x "${REPO_ROOT}/node_modules/.bin/tsc" ]; then
echo "==> orchestrator TypeScript"
(cd "${REPO_ROOT}" && nice -n 19 node_modules/.bin/tsc --noEmit \
-p plugins/plugin-agent-orchestrator/tsconfig.json --pretty false)
fi
echo "==> diff whitespace"
git -C "${REPO_ROOT}" diff --check -- \
packages/os/linux \
plugins/plugin-agent-orchestrator/src/actions/elizaos-capability.ts \
plugins/plugin-agent-orchestrator/src/index.ts \
plugins/plugin-agent-orchestrator/src/services/acp-service.ts \
plugins/plugin-agent-orchestrator/src/services/pty-spawn.ts
echo "static smoke passed"