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

5.0 KiB

@elizaos/plugin-capacitor-bridge

Agent-side bridge that enables stock iOS and Android Eliza builds to run local GGUF inference through the device's native Capacitor llama.cpp plugin.

What it does

AOSP builds run llama.cpp directly inside the agent process via bun:ffi. Stock Capacitor builds (App Store iOS, standard Android APK) cannot do that — llama.cpp is exposed to the WebView through a native Capacitor plugin instead. This package is the agent-side half of that path:

  • Android: accepts a loopback WebSocket from the Capacitor WebView, delegates TEXT_SMALL, TEXT_LARGE, and TEXT_EMBEDDING model requests to the connected device, and lets the normal elizaOS model-handler system work unchanged.
  • iOS: runs the elizaOS runtime inside the Bun binary bundled into the iOS app and dispatches API calls in-process over native Bun host IPC (no HTTP loopback).

Both paths install a sandboxed virtual filesystem (installMobileFsShim) that confines all node:fs operations to the app's writable workspace directory, enforcing App Store and Play Store code-execution policies.

Capabilities added

  • TEXT_SMALL model handler — routes to the connected Capacitor device.
  • TEXT_LARGE model handler — routes to the connected Capacitor device.
  • TEXT_EMBEDDING model handler — routes to the connected Capacitor device.
  • Automatic GGUF model download from elizaos/eliza-1 on HuggingFace when no local model is found (unless ELIZA_DISABLE_MODEL_AUTO_DOWNLOAD=1).
  • WebSocket endpoint /api/local-inference/device-bridge for Capacitor WebView registration and inference RPC.

Installation

This package is used by the elizaOS agent bundle. It is not a standard elizaOS plugin and cannot be added to character.plugins. The agent bundle entry point imports and calls its bootstrap functions directly.

@elizaos/plugin-capacitor-bridge

Configuration

Android (WebSocket device bridge)

Env var Required Description
ELIZA_DEVICE_BRIDGE_ENABLED=1 Yes Enables the WebSocket bridge.
ELIZA_DEVICE_PAIRING_TOKEN Yes Shared secret — must match the token sent by the Capacitor WebView.
ELIZA_DEVICE_BRIDGE_TOKEN Alias Fallback for ELIZA_DEVICE_PAIRING_TOKEN.

Model path (both platforms)

Env var Description
ELIZA_LOCAL_CHAT_MODEL_PATH Absolute path to a GGUF for chat (TEXT_SMALL / TEXT_LARGE).
ELIZA_LOCAL_EMBEDDING_MODEL_PATH Absolute path to an embedding GGUF.
ELIZA_LOCAL_MODEL_PATH Fallback when neither slot-specific var is set.
ELIZA_DISABLE_MODEL_AUTO_DOWNLOAD=1 Disables auto-download from HuggingFace.

If no model path is set and auto-download is enabled, the bridge downloads recommended eliza-1 GGUFs from elizaos/eliza-1 on HuggingFace into $ELIZA_STATE_DIR/local-inference/models/.

Timeouts (all optional, default 600000 ms)

  • ELIZA_DEVICE_LOAD_TIMEOUT_MS
  • ELIZA_DEVICE_GENERATE_TIMEOUT_MS
  • ELIZA_DEVICE_EMBED_TIMEOUT_MS

Filesystem sandbox

Both platforms install a deny-by-default node:fs interceptor (installMobileFsShim) before booting the runtime:

  • All paths are resolved relative to the app's writable workspace root (MOBILE_WORKSPACE_ROOT on iOS, HOME on Android).
  • Path traversal outside the root throws EACCES.
  • System directories (/etc, /usr, /System, /proc, etc.) are blocked unconditionally.
  • Writes to native binary extensions (.so, .dylib, .node) are blocked.
  • require() of file paths is blocked — all code must be bundled.

WebSocket protocol (Android)

The Capacitor WebView connects to ws://127.0.0.1:<port>/api/local-inference/device-bridge?token=<ELIZA_DEVICE_PAIRING_TOKEN>.

Connection flow:

  1. WebView sends { type: "register", payload: { deviceId, pairingToken, capabilities, loadedPath } }.
  2. Agent sends { type: "load", correlationId, modelPath, ... } → device replies { type: "loadResult", correlationId, ok, loadedPath }.
  3. Agent sends { type: "generate", correlationId, prompt, ... } → device replies { type: "generateResult", correlationId, ok, text }.
  4. Agent sends { type: "embed", correlationId, input } → device replies { type: "embedResult", correlationId, ok, embedding }.
  5. Agent sends { type: "formatChat", correlationId, messages } → device replies { type: "formatChatResult", correlationId, ok, prompt } (invokes native Jinja chat template).
  6. Agent pings every 15 s; device replies { type: "pong" }.

Note: iOS connections are rejected with close code 4003. iOS uses native IPC, not this WebSocket path.

Slot Model ID HuggingFace path
TEXT_SMALL eliza-1-4b elizaos/eliza-1bundles/4b/text/eliza-1-4b-128k.gguf
TEXT_LARGE eliza-1-4b elizaos/eliza-1bundles/4b/text/eliza-1-4b-128k.gguf
TEXT_EMBEDDING eliza-1-embedding elizaos/eliza-1bundles/4b/embedding/eliza-1-embedding.gguf

The 4B tier is the shipped mobile default for both chat slots; eliza-1-2b is the smallest/entry tier (the small-phone floor) but is not a recommended default.