Files
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

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.