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
128 lines
5.4 KiB
Markdown
128 lines
5.4 KiB
Markdown
# @elizaos/capacitor-bun-runtime
|
|
|
|
Native host package for the local agent runtime. The iOS Swift implementation
|
|
can run in two modes:
|
|
|
|
- `engine: "auto"` / `engine: "bun"`: uses the directly linked
|
|
`ElizaBunEngine.framework` from `@elizaos/bun-ios-runtime` when the app was
|
|
built with `ELIZA_IOS_FULL_BUN_ENGINE=1`. Store-distributed iOS local mode
|
|
must use `engine: "bun"` and fail closed if the framework is missing.
|
|
- `engine: "compat"`: hosts a `JSContext` compatibility bridge on a dedicated
|
|
worker thread, installs the `__ELIZA_BRIDGE__` host functions, and loads the
|
|
staged iOS agent payload from `public/agent/agent-bundle.js`. This path is
|
|
development/sideload-only.
|
|
|
|
The full Bun engine artifact is produced outside this package by the
|
|
`packages/native/bun-runtime` build harness and an `elizaos/bun` fork.
|
|
|
|
The Android implementation delegates lifecycle and RPC calls to the host app's
|
|
`ElizaAgentService` over its loopback API.
|
|
|
|
## Install
|
|
|
|
```bash
|
|
bun add @elizaos/capacitor-bun-runtime
|
|
```
|
|
|
|
Capacitor 8 auto-discovers the plugin via the package metadata. Re-run
|
|
`pod install` after adding it so the `ElizaosCapacitorBunRuntime` pod links
|
|
into your iOS workspace. The pod depends on `Capacitor` and links system
|
|
frameworks including `JavaScriptCore` (compat builds only), `Network`,
|
|
`Accelerate`, `Metal`, `MetalKit`, `MetalPerformanceShaders`, `Foundation`,
|
|
`CoreML`, and `NaturalLanguage`. When `ELIZA_IOS_INCLUDE_LLAMA=1`, it also
|
|
depends on `LlamaCpp` and `LlamaCppCapacitor` for native llama.cpp symbols.
|
|
|
|
## Bundle layout
|
|
|
|
The local iOS build stages these resources under `App/public/agent/`, which is
|
|
copied into the app bundle by Capacitor's `public` folder resource:
|
|
|
|
- `agent-bundle.js` — the Bun-targeted agent bundle from
|
|
`packages/agent/dist-mobile-ios/`. Required for the full backend path.
|
|
- `pglite.wasm`, `initdb.wasm`, `pglite.data`, `vector.tar.gz`,
|
|
`fuzzystrmatch.tar.gz` — PGlite runtime assets used by the agent bundle.
|
|
- `eliza-polyfill-prefix.js` — the polyfill prefix that maps `Bun.*` /
|
|
`node:*` onto `__ELIZA_BRIDGE__` for the compatibility JSContext path.
|
|
Optional; the runtime ships a minimal embedded fallback that just
|
|
version-checks the bridge.
|
|
|
|
## Usage
|
|
|
|
```ts
|
|
import { ElizaBunRuntime } from "@elizaos/capacitor-bun-runtime";
|
|
|
|
// Development/sideload only: auto-selects the full Bun engine when embedded,
|
|
// otherwise falls back to the JSContext compatibility bridge in DEBUG builds.
|
|
await ElizaBunRuntime.start({ engine: "auto" });
|
|
|
|
// Store iOS local mode: require the full Bun engine. This returns { ok: false }
|
|
// if the framework is not embedded in the app bundle.
|
|
await ElizaBunRuntime.start({
|
|
engine: "bun",
|
|
argv: ["bun", "public/agent/agent-bundle.js", "ios-bridge", "--stdio"],
|
|
});
|
|
|
|
// Round-trips a chat message through the agent's send_message handler,
|
|
// which must have been registered via bridge.ui_register_handler.
|
|
const { reply } = await ElizaBunRuntime.sendMessage({ message: "hello" });
|
|
|
|
// Generic dispatch into any handler the agent registered.
|
|
const { result } = await ElizaBunRuntime.call({
|
|
method: "http_request",
|
|
args: { method: "GET", path: "/api/health" },
|
|
});
|
|
|
|
// Check ready state, current model, throughput.
|
|
const status = await ElizaBunRuntime.getStatus();
|
|
|
|
// Tear down the runtime. Releases the JSContext or full Bun engine host.
|
|
await ElizaBunRuntime.stop();
|
|
```
|
|
|
|
## Bridge contract
|
|
|
|
The full-engine ABI lives in
|
|
`packages/native/bun-runtime/BRIDGE_CONTRACT.md`. The compatibility host still
|
|
implements the Swift `__ELIZA_BRIDGE__` v1 surface; breaking changes bump the
|
|
version string emitted in `globalThis.__ELIZA_BRIDGE_VERSION__`.
|
|
|
|
In production full Bun mode, the Swift host calls the directly linked
|
|
`ElizaBunEngine` ABI, starts `agent-bundle.js ios-bridge --stdio`, and forwards
|
|
React requests through `ElizaBunRuntime.call({ method: "http_request", args })`.
|
|
`packages/ui/src/api/ios-local-agent-transport.ts` uses that path first when
|
|
the native plugin is available. The JSContext compatibility host is retained
|
|
only for development/sideload builds; iOS store builds fail closed instead of
|
|
falling back to it.
|
|
|
|
## Llama backend
|
|
|
|
`llama_*` host functions delegate to `LlamaBridgeImpl`, which links against the
|
|
same `LlamaCpp.xcframework` built by the iOS local-inference pipeline. The
|
|
xcframework build also emits the small `eliza_llama_*` C helpers needed by the
|
|
Swift direct bridge.
|
|
|
|
## Events
|
|
|
|
The plugin emits two Capacitor events:
|
|
|
|
- `eliza:ui` — every `bridge.ui_post_message(channel, payload)` call.
|
|
Subscribe with `ElizaBunRuntime.addListener("eliza:ui", handler)`.
|
|
- `eliza:runtime-exit` — fired when the agent calls
|
|
`bridge.exit(code)`. Useful for surfacing crashes to the React shell.
|
|
|
|
## Limitations (v1)
|
|
|
|
- Android requires the host app's `ElizaAgentService` loopback API.
|
|
- Full Bun is only used when `ElizaBunEngine.framework` is embedded. Outside
|
|
iOS store local mode, `engine: "auto"` can fall back to the compatibility
|
|
JSContext host for development/sideload builds.
|
|
- The full Bun bridge currently buffers HTTP response bodies over stdio. It is
|
|
correct for API calls, but token-by-token streaming needs a follow-up stream
|
|
envelope.
|
|
- No `worker_threads.Worker` support in the compatibility host.
|
|
- No `child_process` — sandboxed out.
|
|
- `http_serve_*` is disabled on iOS. Foreground and route traffic uses
|
|
Capacitor/engine IPC instead of a WebView-visible localhost listener.
|
|
- `bun:ffi.dlopen` is forbidden. The only FFI surface is the llama
|
|
bridge.
|