Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
92475d8
fix(desktop): stabilize Linux local-source startup
NubsCarson May 17, 2026
30e83d9
Harden local Eliza source aliases
NubsCarson May 17, 2026
4b3da03
Fix local-source desktop shell
NubsCarson May 17, 2026
d079748
Fix voice pill package-mode typing
NubsCarson May 17, 2026
2fd4707
Fix desktop orphan cleanup self-termination
NubsCarson May 17, 2026
41df947
Fix local app-core script source mode
NubsCarson May 17, 2026
9722bab
Merge latest Milady develop into local-source startup
NubsCarson May 19, 2026
7bb41a2
Fix package-mode desktop startup contracts
NubsCarson May 19, 2026
0e38740
fix(app): align local-source UI package imports
NubsCarson May 19, 2026
70b7032
Merge remote package-mode import branch
NubsCarson May 19, 2026
9ab10cd
Merge remote-tracking branch 'origin/develop' into codex/linux-local-…
NubsCarson May 19, 2026
b1bbab8
fix(app): resolve local cloud sdk aliases
NubsCarson May 19, 2026
8c8548e
Merge remote-tracking branch 'upstream/develop' into codex/pr-2155-wi…
NubsCarson May 19, 2026
7babeb8
fix(app): harden Windows local-source desktop build
NubsCarson May 19, 2026
12eefa6
fix(ci): guard local eliza package linking
NubsCarson May 19, 2026
73c4416
fix(app): keep packaged renderer on one ui app context
NubsCarson May 19, 2026
0b8f91f
fix(app): tolerate Windows Path casing in packaged agent
NubsCarson May 19, 2026
f966874
fix(ci): patch packaged agent path across eliza refs
NubsCarson May 19, 2026
e464611
fix(app): keep LifeOps off app-core root barrel
NubsCarson May 20, 2026
63448ea
fix(app): remove unused window shell import
NubsCarson May 20, 2026
ac9f525
fix(app): patch voice onboarding package mode
NubsCarson May 20, 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
8 changes: 6 additions & 2 deletions .github/workflows/agent-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -155,8 +155,12 @@ jobs:

- name: Build local eliza runtime plugins
run: |
if [ ! -f eliza/packages/core/dist/index.node.js ] || [ ! -f eliza/packages/core/dist/index.d.ts ]; then
(cd eliza/packages/core && bun run build)
if [ -d eliza/packages/core ]; then
if [ ! -f eliza/packages/core/dist/index.node.js ] || [ ! -f eliza/packages/core/dist/index.d.ts ]; then
(cd eliza/packages/core && bun run build)
fi
else
echo "Skipping local eliza core build; package-mode checkout has no eliza/ tree."
fi
if [ -f eliza/plugins/plugin-agent-skills/package.json ] && [ ! -f eliza/plugins/plugin-agent-skills/dist/index.js ]; then
(cd eliza/plugins/plugin-agent-skills && bun run build)
Expand Down
10 changes: 7 additions & 3 deletions .github/workflows/ci-fork.yml
Original file line number Diff line number Diff line change
Expand Up @@ -128,14 +128,18 @@ jobs:
# @elizaos/ui from npm and the build fails with
# `"createVoiceCapture" is not exported by "@elizaos/ui"`.
- name: Link local @elizaos workspace packages
run: node eliza/packages/app-core/scripts/link-docker-local-app-packages.mjs
run: |
if [ -f eliza/packages/app-core/scripts/link-docker-local-app-packages.mjs ]; then
node eliza/packages/app-core/scripts/link-docker-local-app-packages.mjs
echo "MILADY_FORCE_LOCAL_UPSTREAMS=1" >> "$GITHUB_ENV"
else
echo "eliza checkout absent; package-mode build will use installed @elizaos packages"
fi

# MILADY_FORCE_LOCAL_UPSTREAMS=1 forces apps/app/vite.config.ts to treat
# the freshly-linked eliza/ checkout as the source of truth for the
# @elizaos/* aliases.
- name: Build project
env:
MILADY_FORCE_LOCAL_UPSTREAMS: "1"
run: bun run build

- name: Build homepage
Expand Down
10 changes: 7 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -282,14 +282,18 @@ jobs:
# @elizaos/ui from npm and the build fails with
# `"createVoiceCapture" is not exported by "@elizaos/ui"`.
- name: Link local @elizaos workspace packages
run: node eliza/packages/app-core/scripts/link-docker-local-app-packages.mjs
run: |
if [ -f eliza/packages/app-core/scripts/link-docker-local-app-packages.mjs ]; then
node eliza/packages/app-core/scripts/link-docker-local-app-packages.mjs
echo "MILADY_FORCE_LOCAL_UPSTREAMS=1" >> "$GITHUB_ENV"
else
echo "eliza checkout absent; package-mode build will use installed @elizaos packages"
fi

# MILADY_FORCE_LOCAL_UPSTREAMS=1 forces apps/app/vite.config.ts to treat
# the freshly-linked eliza/ checkout as the source of truth for the
# @elizaos/* aliases.
- name: Build project
env:
MILADY_FORCE_LOCAL_UPSTREAMS: "1"
run: bun run build

- name: Build homepage
Expand Down
23 changes: 23 additions & 0 deletions .github/workflows/release-electrobun.yml
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,17 @@ jobs:
- name: Ensure avatar assets
run: node eliza/packages/app-core/scripts/ensure-avatars.mjs

- name: Prepare Whisper model artifact
run: |
bash eliza/packages/app-core/platforms/electrobun/scripts/ensure-whisper-model.sh base.en

- name: Upload Whisper model artifact
uses: actions/upload-artifact@v4
with:
name: whisper-model-base-en
path: ~/.cache/eliza/whisper/ggml-base.en.bin
if-no-files-found: error

- name: Build core dist (server bundle)
env:
MILADY_ELIZA_SOURCE: local
Expand Down Expand Up @@ -680,6 +691,18 @@ jobs:
- name: Align package-mode agent pins
run: node scripts/align-eliza-agent-package-pins.mjs

- name: Download Whisper model artifact
uses: actions/download-artifact@v4
with:
name: whisper-model-base-en
path: ${{ runner.temp }}/whisper-model

- name: Seed Whisper model cache
run: |
mkdir -p "$HOME/.cache/eliza/whisper"
cp "$RUNNER_TEMP/whisper-model/ggml-base.en.bin" "$HOME/.cache/eliza/whisper/ggml-base.en.bin"
test -s "$HOME/.cache/eliza/whisper/ggml-base.en.bin"

# Link local @elizaos workspace packages into node_modules. desktop-build.mjs
# stage invokes vite, which imports symbols from @elizaos/ui
# (createVoiceCapture, VoicePill, VoicePillMessage, VoiceCaptureHandle)
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ apps/app/electrobun/build/
*.bun-build
**/*.bun-build
*.tsbuildinfo
# Generated by the app web build when shared brand assets are synced.
apps/app/public/brand/
apps/app/public/clouds/
eliza/packages/elizaos/templates/
eliza/packages/elizaos/templates-manifest.json
apps/app/electron/tsc-out/
Expand Down
134 changes: 134 additions & 0 deletions apps/app/src/host-window-routing.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
export type DetachedSurfaceTab =
| "browser"
| "chat"
| "release"
| "triggers"
| "plugins"
| "connectors"
| "cloud";

export type WindowShellRoute =
| { mode: "main" }
| { mode: "pill" }
| { mode: "settings"; tab?: string }
| { mode: "surface"; tab: DetachedSurfaceTab };

export type DetachedWindowShellRoute = Exclude<
WindowShellRoute,
{ mode: "main" } | { mode: "pill" }
>;

export function resolveWindowShellRoute(

Check warning on line 21 in apps/app/src/host-window-routing.ts

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

apps/app/src/host-window-routing.ts#L21

Method resolveWindowShellRoute has a cyclomatic complexity of 15 (limit is 8)
search = typeof window !== "undefined" ? window.location.search : "",
): WindowShellRoute {
const params = new URLSearchParams(search);
const shell = params.get("shell");

if (shell === "pill") {
return { mode: "pill" };
}

if (shell === "settings") {
const tab = params.get("tab")?.trim() || undefined;
return tab ? { mode: "settings", tab } : { mode: "settings" };
}

if (shell === "surface") {
const tab = params.get("tab");
if (
tab === "browser" ||
tab === "chat" ||
tab === "release" ||
tab === "triggers" ||
tab === "plugins" ||
tab === "connectors" ||
tab === "cloud"
) {
return { mode: "surface", tab };
}
}

return { mode: "main" };
}

export function isPillWindowShell(
route: WindowShellRoute,
): route is { mode: "pill" } {
return route.mode === "pill";
}

export function isDetachedWindowShell(
route: WindowShellRoute,
): route is DetachedWindowShellRoute {
return route.mode !== "main" && route.mode !== "pill";
}

export function shouldInstallMainWindowOnboardingPatches(
route: WindowShellRoute,
): boolean {
return route.mode === "main";
}

export function isAppWindowRoute(
location: Pick<Location, "search"> | undefined = typeof window === "undefined"
? undefined
: window.location,
): boolean {
if (!location) return false;
try {
return new URLSearchParams(location.search).get("appWindow") === "1";
} catch {
return false;
}
}

function shouldUseHashNavigation(
location:
| Pick<Location, "hash" | "pathname" | "protocol" | "search">
| undefined = typeof window === "undefined" ? undefined : window.location,
): boolean {
if (!location) return false;
return location.protocol === "file:" || isAppWindowRoute(location);
}

export function getWindowNavigationPath(
location:
| Pick<Location, "hash" | "pathname" | "protocol" | "search">
| undefined = typeof window === "undefined" ? undefined : window.location,
): string {
if (!location) return "/";
return shouldUseHashNavigation(location)
? location.hash.replace(/^#/, "") || "/"
: location.pathname;
}

function pathForDetachedShell(route: DetachedWindowShellRoute): string {
if (route.mode === "settings") return "/settings";

switch (route.tab) {
case "browser":
return "/browser";
case "chat":
return "/chat";
case "release":
return "/settings";
case "triggers":
return "/automations";
case "plugins":
return "/apps/plugins";
case "connectors":
return "/connectors";
case "cloud":
return "/settings";
}
}

export function syncDetachedShellLocation(
route: DetachedWindowShellRoute,
): boolean {
if (typeof window === "undefined") return false;
const nextUrl = new URL(window.location.href);
nextUrl.pathname = pathForDetachedShell(route);
window.history.replaceState(null, "", nextUrl.toString());
return true;
}
Loading
Loading