Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
05f05ed
Merge origin/develop into iOS Kokoro onboarding
Dexploarer May 20, 2026
20ed54b
Merge latest origin/develop into iOS Kokoro onboarding
Dexploarer May 20, 2026
f60d04f
fix(local-inference): skip iOS-only OmniVoice patch for desktop builds
Dexploarer May 20, 2026
7a197ef
fix(ci): align remote plugin and mobile build gates
Dexploarer May 20, 2026
a3c5859
Merge origin/develop into iOS Kokoro onboarding
Dexploarer May 20, 2026
bbff559
Merge branch 'develop' into codex/ios-kokoro-tts-onboarding
Dexploarer May 20, 2026
435307b
fix: address remote runner review feedback
Dexploarer May 20, 2026
c096648
Merge remote-tracking branch 'origin/codex/ios-kokoro-tts-onboarding'…
Dexploarer May 20, 2026
b3ed949
Merge remote-tracking branch 'origin/develop' into codex/ios-kokoro-t…
Dexploarer May 20, 2026
875ad59
fix: address codefactor review findings
Dexploarer May 20, 2026
9c8018d
fix: format homepage files
Dexploarer May 20, 2026
4c6966c
fix: update capability naming audit self-test
Dexploarer May 20, 2026
65739d6
fix: repair remaining ci smoke failures
Dexploarer May 20, 2026
877a7a6
fix: stabilize server and inference ci gates
Dexploarer May 20, 2026
1ff4a31
fix: align dflash ios fused target tests
Dexploarer May 20, 2026
0ccfd3c
fix: align capability router guardrail tests
Dexploarer May 20, 2026
ad466ae
fix: align hearwear view parity
Dexploarer May 21, 2026
76ba012
Merge remote-tracking branch 'origin/develop' into codex/ios-kokoro-t…
May 21, 2026
e75827d
refactor: complete satellite/carrot → remote-plugin vocabulary rename
May 21, 2026
e08421b
Merge remote-tracking branch 'origin/develop' into codex/ios-kokoro-t…
May 21, 2026
3957818
fix(ci): align voice prefix onboarding with blue/white brand and lock…
May 21, 2026
fb60a29
fix(tests): correct first-party remotes path + align xr view-id parity
May 21, 2026
27c1f0e
Merge remote-tracking branch 'origin/develop' into codex/ios-kokoro-t…
May 21, 2026
fc7d8c6
fix(test): drop duplicate remotePluginId key in remote-plugin-host ev…
May 21, 2026
39a9921
fix(lint): biome auto-sort imports in electrobun host after rename
May 21, 2026
e50c98c
fix: biome lint nits, remove duplicate pluginWorkerRuntimeSrc/remoteP…
May 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/local-inference-matrix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -167,14 +167,14 @@ jobs:
set -euo pipefail
APT_ARGS=(-o Acquire::ForceIPv4=true -o Acquire::Retries=5 -o Acquire::http::Timeout=30)
# Vulkan target additionally needs libvulkan-dev (loader headers
# path) and glslang-tools (provides glslc for the
# path), glslang-tools, and glslc for the
# Vulkan_GLSLC_EXECUTABLE flag the build script passes).
# The build script's prepareVulkanHeaders() fetches Khronos
# vulkan.hpp + spirv.hpp regardless, so the only "extra" packages
# CI needs from apt are libvulkan-dev + glslang-tools.
# CI needs from apt are libvulkan-dev + glslang-tools + glslc.
EXTRA_PKGS=""
if [[ "${{ matrix.backend }}" == "vulkan" ]]; then
EXTRA_PKGS="libvulkan-dev glslang-tools"
EXTRA_PKGS="libvulkan-dev glslang-tools glslc"
fi
for attempt in 1 2 3; do
if sudo apt-get "${APT_ARGS[@]}" update && \
Expand Down
4 changes: 0 additions & 4 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions packages/agent/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,18 @@
"@elizaos/plugin-registry": [
"../../plugins/plugin-registry/src/index.ts"
],
"@elizaos/plugin-remote-manifest": [
"../plugin-remote-manifest/src/index.ts"
],
"@elizaos/plugin-remote-manifest/*": [
"../plugin-remote-manifest/src/*"
],
"@elizaos/plugin-worker-runtime": [
"../plugin-worker-runtime/src/index.ts"
],
"@elizaos/plugin-worker-runtime/*": [
"../plugin-worker-runtime/src/*"
],
"@elizaos/plugin-wallet": ["../../plugins/plugin-wallet/src/index.ts"],
"@elizaos/plugin-wifi": ["../../plugins/plugin-wifi/src/index.ts"],
"@elizaos/app-core": ["../app-core/src/index.ts"],
Expand Down
4 changes: 2 additions & 2 deletions packages/app-core/platforms/electrobun/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,13 @@ Produces `src/libMacWindowEffects.dylib` (consumed via Bun FFI at runtime).

## First-party Satellites

Prototype ElizaLaunch Satellites are folded into this shell under `satellites/` and seeded on desktop startup by `src/first-party-satellites.ts`. They use the existing `@elizaos/electrobun-carrots` install/start/log runtime instead of a parallel module system.
Prototype ElizaLaunch Satellites are folded into this shell under `satellites/` and seeded on desktop startup by `src/first-party-satellites.ts`. They use the existing `@elizaos/plugin-remote-manifest` install/start/log runtime instead of a parallel module system.

- `eliza.runtime` is required and runs as a Runtime Satellite adapter over the existing Electrobun `AgentManager`; production mode must not start a second elizaOS runtime process.
- `eliza.fs`, `eliza.local-model`, `eliza.pty`, and `eliza.git` are first-party capability Satellites.
- `eliza.surface` is a dev/admin surface and is only included when `ELIZA_ENABLE_DEV_SATELLITES=1`.

The current worker-to-worker bridge supports the upstream `invoke-carrot` host request, and renderer/dev views can call workers through the typed `carrot:invokeWorker` RPC. Broad automatic event broadcast is still a host-level follow-up, so dev surfaces should use explicit invokes plus polling where needed.
The current worker-to-worker bridge supports the upstream `invoke-remote-plugin` host request, and renderer/dev views can call workers through the typed `remote-plugin:invokeWorker` RPC. Broad automatic event broadcast is still a host-level follow-up, so dev surfaces should use explicit invokes plus polling where needed.

`eliza.surface` is not the product dashboard. Keep it as an inspector harness while product work moves toward dynamic agent-created canvas/A2UI views, Eliza-1 routing, voice loop latency tracing, and OmniVoice/Kokoro validation.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,4 +72,4 @@ When the host forwards worker events, the Git Satellite can emit operation event

## Upstream Packaging Boundary

The current local module system still requires upstream packaging names like `carrot.json`, `build.carrot`, and `carrotOnly`. They are used only at the packaging boundary.
The current local module system still requires upstream packaging names like `plugin.json`, `build.carrot`, and `carrotOnly`. They are used only at the packaging boundary.
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ const gitSatellite = {
permissions: {
host: {
storage: true,
"manage-carrots": true,
"manage-remote-plugins": true,
},
bun: {
read: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"permissions": {
"host": {
"storage": true,
"manage-carrots": true
"manage-remote-plugins": true
},
"bun": {
"read": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ ELIZA_PHASE8_LIVE_API=1 bun run --cwd elizalaunch/satellites/local-model smoke:p

## Packaging Boundary

The upstream Electrobun module system still names its package manifest `carrot.json` and config fields `build.carrot` / `carrotOnly`. Those names are kept only at the packaging boundary.
The upstream Electrobun module system still names its package manifest `plugin.json` and config fields `build.carrot` / `carrotOnly`. Those names are kept only at the packaging boundary.

## Limitations

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ const localModelSatellite = {
permissions: {
host: {
storage: true,
"manage-carrots": true,
"manage-remote-plugins": true,
},
bun: {
read: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"permissions": {
"host": {
"storage": true,
"manage-carrots": true
"manage-remote-plugins": true
},
"bun": {
"read": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,4 +62,4 @@ bun run --cwd elizalaunch/satellites/pty smoke:phase6

## Upstream Packaging Boundary

The current local module system still requires upstream packaging names like `carrot.json`, `build.carrot`, and `carrotOnly`. They are used only at the packaging boundary.
The current local module system still requires upstream packaging names like `plugin.json`, `build.carrot`, and `carrotOnly`. They are used only at the packaging boundary.
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ const terminalSatellite = {
host: {
storage: true,
notifications: true,
"manage-carrots": true,
"manage-remote-plugins": true,
},
bun: {
read: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
"host": {
"storage": true,
"notifications": true,
"manage-carrots": true
"manage-remote-plugins": true
},
"bun": {
"read": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,7 @@ packages/app-core/platforms/electrobun/satellites/runtime

The required package-side fields are present:

- `carrot.json`
- `plugin.json`
- `id: "eliza.runtime"`
- `mode: "background"`
- `worker.relativePath: "src/bun/worker.ts"`
Expand All @@ -318,9 +318,9 @@ After install, start `eliza.runtime` from the existing module manager. If the cu

## Current Upstream Packaging Notes

The existing Electrobun module system in this repo still uses upstream packaging names such as `carrot.json`, `build.carrot`, and `carrotOnly`. Those names are kept only where the upstream API requires them.
The existing Electrobun module system in this repo still uses upstream packaging names such as `plugin.json`, `build.carrot`, and `carrotOnly`. Those names are kept only where the upstream API requires them.

The current host manifest shape supports `host.storage`, `bun.read`, `bun.write`, `bun.env`, `bun.run`, and `bun.worker` through nested `host` and `bun` permission maps. The requested flat permission keys are not the shape used by the local `@elizaos/electrobun-carrots` types, so the Runtime Satellite uses the existing nested format.
The current host manifest shape supports `host.storage`, `bun.read`, `bun.write`, `bun.env`, `bun.run`, and `bun.worker` through nested `host` and `bun` permission maps. The requested flat permission keys are not the shape used by the current `@elizaos/plugin-remote-manifest` types, so the Runtime Satellite uses the existing nested format.

The current host can downgrade `isolation: "isolated-process"` to a shared worker. The bundled first-party Runtime Satellite delegates production process ownership to the existing Electrobun `AgentManager`; only standalone smoke tests use the subprocess manager directly.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"permissions": {
"host": {
"storage": true,
"manage-carrots": true
"manage-remote-plugins": true
},
"bun": {
"read": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ type HostRequestMessage = {
type: "host-request";
requestId: number;
method:
| "invoke-carrot"
| "invoke-remote-plugin"
| "agent-manager-start"
| "agent-manager-stop"
| "agent-manager-restart"
Expand Down Expand Up @@ -636,9 +636,9 @@ function invokeSatellite(
params?: JsonValue,
): Promise<JsonValue | undefined> {
return requestHost(
"invoke-carrot",
"invoke-remote-plugin",
{
carrotId: satelliteId,
remotePluginId: satelliteId,
method,
...(params === undefined ? {} : { params }),
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,16 +126,16 @@ It also mocks model calls through `eliza.runtime` and verifies Eliza-1 catalog,

## Module Manager Compatibility

The current upstream module system still uses packaging names such as `carrot.json`, `build.carrot`, and `carrotOnly`. Those names remain only at the packaging boundary.
The current upstream module system still uses packaging names such as `plugin.json`, `build.carrot`, and `carrotOnly`. Those names remain only at the packaging boundary.

The Surface manifest uses:

- ID: `eliza.surface`
- Dependency: `eliza.runtime`
- Mode: `window`
- Permission: `host:manage-carrots`
- Permission: `host:manage-remote-plugins`

`host:manage-carrots` is required by the existing module host for cross-Satellite calls through the upstream `invoke-carrot` host request. No filesystem, shell, Git, model-download, or child-process permission is requested by Surface.
`host:manage-remote-plugins` is required by the existing module host for cross-Satellite calls through the upstream `invoke-remote-plugin` host request. No filesystem, shell, Git, model-download, or child-process permission is requested by Surface.

The Surface worker implements that module call path. The current host does not expose a completed public view-to-Satellite-worker RPC for window-mode Satellites, so the browser UI uses `RuntimeSatelliteClient` and can run against a host-provided bridge when available or the smoke-test mock bridge in Phase 4.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ const surfaceSatellite = {
mode: "window",
permissions: {
host: {
"manage-carrots": true,
"manage-remote-plugins": true,
},
bun: {},
isolation: "shared-worker",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
},
"permissions": {
"host": {
"manage-carrots": true
"manage-remote-plugins": true
},
"bun": {},
"isolation": "shared-worker"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,9 @@ function invokeRuntime(
post({
type: "host-request",
requestId,
method: "invoke-carrot",
method: "invoke-remote-plugin",
params: {
carrotId: RUNTIME_SATELLITE_ID,
remotePluginId: RUNTIME_SATELLITE_ID,
method,
params,
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,7 @@ class TailRuntimeBridge extends MockRuntimeBridge {
id: targetId,
events: [
{
carrotId: targetId,
remotePluginId: targetId,
satelliteId: targetId,
sequence: 1,
name: "agent.message.stream.delta",
Expand All @@ -355,7 +355,7 @@ const root = process.cwd();
for (const relativePath of [
"package.json",
"electrobun.config.ts",
"carrot.json",
"plugin.json",
"src/protocol/runtime-client.ts",
"src/web/index.html",
]) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ export type JsonValue =
export type RuntimeEventHandler = (payload: unknown) => void;

export type RuntimeEventRecord = {
carrotId?: string;
remotePluginId?: string;
satelliteId?: string;
sequence: number;
name: string;
Expand Down Expand Up @@ -103,12 +103,12 @@ type RuntimeGlobal = typeof globalThis & {
__ELIZA_SURFACE_RUNTIME_BRIDGE__?: RuntimeSatelliteBridge;
__ELIZA_ELECTROBUN_RPC__?: {
request?: {
carrotInvokeWorker?: (params: {
remotePluginInvokeWorker?: (params: {
id: string;
method: string;
params?: JsonValue;
}) => Promise<JsonValue | null>;
carrotTailWorkerEvents?: (params: {
remotePluginTailWorkerEvents?: (params: {
id: string;
afterSequence?: number;
limit?: number;
Expand All @@ -117,14 +117,6 @@ type RuntimeGlobal = typeof globalThis & {
onMessage?: (eventName: string, handler: RuntimeEventHandler) => void;
offMessage?: (eventName: string, handler: RuntimeEventHandler) => void;
};
Carrots?: {
invoke?: (
targetId: string,
method: string,
params?: unknown,
) => Promise<unknown>;
on?: (eventName: string, handler: RuntimeEventHandler) => () => void;
};
};

export type SurfaceBridgeError = {
Expand Down Expand Up @@ -597,9 +589,9 @@ function createDefaultBridge(): RuntimeSatelliteBridge | null {
}

const electrobunRpc = runtimeGlobal.__ELIZA_ELECTROBUN_RPC__;
const invokeWorker = electrobunRpc?.request?.carrotInvokeWorker;
const invokeWorker = electrobunRpc?.request?.remotePluginInvokeWorker;
if (invokeWorker) {
const tailEvents = electrobunRpc.request?.carrotTailWorkerEvents;
const tailEvents = electrobunRpc.request?.remotePluginTailWorkerEvents;
return {
invoke: (targetId, method, params) => {
const jsonParams = toJsonValue(params);
Expand Down Expand Up @@ -627,16 +619,6 @@ function createDefaultBridge(): RuntimeSatelliteBridge | null {
};
}

const upstream = runtimeGlobal.Carrots;
if (upstream?.invoke) {
return {
invoke: (targetId, method, params) =>
upstream.invoke?.(targetId, method, params) ??
Promise.reject(new Error("Module invoke bridge is unavailable.")),
on: upstream.on,
};
}

return null;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ The platform contract is:
agent/plugin/runtime event
-> register or open a DynamicViewManifest
-> canvas/A2UI hosts the view session
-> the view calls Satellites through eliza.runtime with carrotInvokeWorker
-> the view tails worker events with carrotTailWorkerEvents
-> the view calls Satellites through eliza.runtime with remotePluginInvokeWorker
-> the view tails worker events with remotePluginTailWorkerEvents
-> the view is closed when the task no longer needs it
```

Expand Down Expand Up @@ -37,8 +37,8 @@ Trusted workers can use host requests:
- `dynamic-view-push`
- `dynamic-view-sessions`

Worker host requests currently require `host:manage-carrots`. A narrower view-management permission should replace that once the manifest permission model adds it.
Worker host requests currently require `host:manage-remote-plugins`. A narrower view-management permission should replace that once the manifest permission model adds it.

## Demo

`agent.run.trace.demo` is a developer-only proof of the dynamic view path. It opens a floating canvas view, receives A2UI pushed events, calls `eliza.runtime` through `carrotInvokeWorker`, and tails `eliza.runtime` events through `carrotTailWorkerEvents`.
`agent.run.trace.demo` is a developer-only proof of the dynamic view path. It opens a floating canvas view, receives A2UI pushed events, calls `eliza.runtime` through `remotePluginInvokeWorker`, and tails `eliza.runtime` events through `remotePluginTailWorkerEvents`.
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ <h1>Agent Run Trace Demo</h1>
try {
append(
"runtime.status",
await request("carrotInvokeWorker", {
await request("remotePluginInvokeWorker", {
id: "eliza.runtime",
method: "runtime.status",
}),
Expand All @@ -115,7 +115,7 @@ <h1>Agent Run Trace Demo</h1>

document.getElementById("tail").addEventListener("click", async () => {
try {
const result = await request("carrotTailWorkerEvents", {
const result = await request("remotePluginTailWorkerEvents", {
id: "eliza.runtime",
afterSequence: lastRuntimeSequence,
limit: 100,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { JsonValue } from "@elizaos/electrobun-carrots";
import type { JsonValue } from "@elizaos/plugin-remote-manifest";

export type DynamicViewErrorCode =
| "DYNAMIC_VIEW_DUPLICATE"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { JsonValue } from "@elizaos/electrobun-carrots";
import type { JsonValue } from "@elizaos/plugin-remote-manifest";
import { DynamicViewError } from "./errors";
import type { DynamicViewRegistry } from "./registry";
import type { DynamicViewSessionManager } from "./session-manager";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import type { JsonValue } from "@elizaos/electrobun-carrots";
import type { JsonValue } from "@elizaos/plugin-remote-manifest";
import { describe, expect, it } from "vitest";
import { DynamicViewError } from "./errors";
import { DynamicViewRegistry } from "./registry";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import * as fs from "node:fs";
import * as path from "node:path";
import { randomUUID } from "node:crypto";
import { fileURLToPath, pathToFileURL } from "node:url";
import type { JsonValue } from "@elizaos/electrobun-carrots";
import type { JsonValue } from "@elizaos/plugin-remote-manifest";
import { DynamicViewError } from "./errors";
import type { DynamicViewRegistry } from "./registry";
import type {
Expand Down
Loading
Loading