Skip to content

Commit 7a197ef

Browse files
committed
fix(ci): align remote plugin and mobile build gates
1 parent f60d04f commit 7a197ef

9 files changed

Lines changed: 114 additions & 83 deletions

File tree

.github/workflows/local-inference-matrix.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,14 +167,14 @@ jobs:
167167
set -euo pipefail
168168
APT_ARGS=(-o Acquire::ForceIPv4=true -o Acquire::Retries=5 -o Acquire::http::Timeout=30)
169169
# Vulkan target additionally needs libvulkan-dev (loader headers
170-
# path) and glslang-tools (provides glslc for the
170+
# path), glslang-tools, and glslc for the
171171
# Vulkan_GLSLC_EXECUTABLE flag the build script passes).
172172
# The build script's prepareVulkanHeaders() fetches Khronos
173173
# vulkan.hpp + spirv.hpp regardless, so the only "extra" packages
174-
# CI needs from apt are libvulkan-dev + glslang-tools.
174+
# CI needs from apt are libvulkan-dev + glslang-tools + glslc.
175175
EXTRA_PKGS=""
176176
if [[ "${{ matrix.backend }}" == "vulkan" ]]; then
177-
EXTRA_PKGS="libvulkan-dev glslang-tools"
177+
EXTRA_PKGS="libvulkan-dev glslang-tools glslc"
178178
fi
179179
for attempt in 1 2 3; do
180180
if sudo apt-get "${APT_ARGS[@]}" update && \

packages/app-core/scripts/kernel-patches/cpu-polar-kernels.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
// Idempotent: each mutation carries a `ELIZA-CPU-POLAR-PREHT-V1`
5151
// sentinel.
5252

53+
import fs from "node:fs";
5354
import path from "node:path";
5455
import { fileURLToPath } from "node:url";
5556

packages/app-core/scripts/kernel-patches/cpu-simd-kernels.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
// to the polarquant-cpu API first — a fork-source change, not a
3737
// patcher.
3838

39+
import fs from "node:fs";
3940
import path from "node:path";
4041
import { fileURLToPath } from "node:url";
4142

packages/app-core/scripts/run-mobile-build.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5308,7 +5308,7 @@ function auditAndroidCloudSource(phase) {
53085308
const filePath = path.join(androidDir, relPath);
53095309
if (!fs.existsSync(filePath)) continue;
53105310
const source = fs.readFileSync(filePath, "utf8");
5311-
for (const [pkg, gradleProject] of ANDROID_SMS_GATEWAY_STRIPPED_NATIVE_PLUGINS) {
5311+
for (const [pkg, gradleProject] of ANDROID_CLOUD_STRIPPED_NATIVE_PLUGINS) {
53125312
if (source.includes(pkg) || source.includes(gradleProject)) {
53135313
failures.push(`${relPath} still references ${pkg}/${gradleProject}`);
53145314
}

packages/scripts/audit-capability-router-plugin-surface.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ const remoteSupported = new Map<string, string>([
3636
]);
3737

3838
const localOnly = new Set([
39+
"mode",
40+
"remote",
3941
"adapter",
4042
"tests",
4143
"dependencies",

packages/ui/src/components/onboarding/VoicePrefixGate.tsx

Lines changed: 52 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,11 @@ function downloadReadiness(
163163
function voiceBundleReadinessFromHub(
164164
hub: ModelHubSnapshot,
165165
): VoiceBundleReadiness {
166-
const voiceReadiness = (hub as ModelHubSnapshot & {
167-
voiceReadiness?: LocalVoiceReadinessSnapshot;
168-
}).voiceReadiness;
166+
const voiceReadiness = (
167+
hub as ModelHubSnapshot & {
168+
voiceReadiness?: LocalVoiceReadinessSnapshot;
169+
}
170+
).voiceReadiness;
169171
const model = selectRecommendedModelForSlot(
170172
"TEXT_SMALL",
171173
hub.hardware,
@@ -292,7 +294,9 @@ function voiceBundleStatusBadge(readiness: VoiceBundleReadiness): string {
292294
}
293295
}
294296

295-
function diagnosticsText(diagnostics: NativeLocalTtsDiagnostics | null): string {
297+
function diagnosticsText(
298+
diagnostics: NativeLocalTtsDiagnostics | null,
299+
): string {
296300
if (!diagnostics) return "";
297301
return JSON.stringify(diagnostics, null, 2).slice(0, 6_000);
298302
}
@@ -326,8 +330,12 @@ async function loadNativeIosLocalTtsStatus(): Promise<VoiceBundleReadiness | nul
326330
if (!nativeIosLocalTtsEnabled()) return null;
327331
const { ElizaBunRuntime } = await import("@elizaos/capacitor-bun-runtime");
328332
if (typeof ElizaBunRuntime.getLocalTtsStatus !== "function") return null;
329-
const status = (await ElizaBunRuntime.getLocalTtsStatus()) as NativeLocalTtsStatus;
330-
if (status.ready && (status.status === "engine-ready" || status.status === "ready")) {
333+
const status =
334+
(await ElizaBunRuntime.getLocalTtsStatus()) as NativeLocalTtsStatus;
335+
if (
336+
status.ready &&
337+
(status.status === "engine-ready" || status.status === "ready")
338+
) {
331339
return {
332340
modelId: status.modelId ?? "",
333341
status: "engine-ready",
@@ -377,7 +385,9 @@ async function synthesizeNativeIosLocalTts(
377385
): Promise<NativeLocalTtsResult> {
378386
const { ElizaBunRuntime } = await import("@elizaos/capacitor-bun-runtime");
379387
if (typeof ElizaBunRuntime.synthesizeLocalTts !== "function") {
380-
throw new Error("This build is missing the iOS local voice playback engine.");
388+
throw new Error(
389+
"This build is missing the iOS local voice playback engine.",
390+
);
381391
}
382392
return ElizaBunRuntime.synthesizeLocalTts({
383393
text,
@@ -565,32 +575,35 @@ export function VoicePrefixGate({
565575
}
566576
}, []);
567577

568-
const handleNativeTtsDiagnostics = React.useCallback(async (probe: boolean) => {
569-
setLocalTtsDiagnosticBusy(true);
570-
try {
571-
const diagnostics = await diagnoseNativeIosLocalTts(probe);
572-
setLocalTtsDiagnostics(diagnostics);
573-
if (diagnostics.probe?.ok === true) {
574-
setVoiceBundleReadiness((current) => ({
575-
...current,
576-
status: "engine-ready",
577-
message: "Voice engine is warmed and ready.",
578-
percent: 100,
579-
canStartDownload: false,
580-
}));
578+
const handleNativeTtsDiagnostics = React.useCallback(
579+
async (probe: boolean) => {
580+
setLocalTtsDiagnosticBusy(true);
581+
try {
582+
const diagnostics = await diagnoseNativeIosLocalTts(probe);
583+
setLocalTtsDiagnostics(diagnostics);
584+
if (diagnostics.probe?.ok === true) {
585+
setVoiceBundleReadiness((current) => ({
586+
...current,
587+
status: "engine-ready",
588+
message: "Voice engine is warmed and ready.",
589+
percent: 100,
590+
canStartDownload: false,
591+
}));
592+
}
593+
} catch (err) {
594+
setLocalTtsDiagnostics({
595+
available: false,
596+
message:
597+
err instanceof Error
598+
? err.message
599+
: "Failed to run local voice diagnostics.",
600+
});
601+
} finally {
602+
setLocalTtsDiagnosticBusy(false);
581603
}
582-
} catch (err) {
583-
setLocalTtsDiagnostics({
584-
available: false,
585-
message:
586-
err instanceof Error
587-
? err.message
588-
: "Failed to run local voice diagnostics.",
589-
});
590-
} finally {
591-
setLocalTtsDiagnosticBusy(false);
592-
}
593-
}, []);
604+
},
605+
[],
606+
);
594607

595608
React.useEffect(() => {
596609
if (!nativeIosLocalTtsEnabled() || autoDiagnosticStartedRef.current) return;
@@ -681,7 +694,7 @@ export function VoicePrefixGate({
681694
return (
682695
<div
683696
data-testid="voice-prefix-gate"
684-
className="relative flex h-full max-h-full min-h-0 w-full items-start justify-center overflow-hidden px-3 text-[var(--onboarding-text-primary)]"
697+
className="relative flex h-full max-h-full min-h-0 w-full items-start justify-center overflow-hidden bg-[#F7F9FF] px-3 text-[var(--onboarding-text-primary)]"
685698
style={{
686699
display: "flex",
687700
alignItems: "flex-start",
@@ -836,11 +849,11 @@ function VoiceBundleStatusStrip({
836849
? Math.max(0, Math.min(100, readiness.percent))
837850
: null;
838851
const showProgress =
839-
(readiness.status === "queued" ||
840-
readiness.status === "downloading" ||
841-
readiness.status === "assets-ready" ||
842-
readiness.status === "engine-ready" ||
843-
readiness.status === "ready");
852+
readiness.status === "queued" ||
853+
readiness.status === "downloading" ||
854+
readiness.status === "assets-ready" ||
855+
readiness.status === "engine-ready" ||
856+
readiness.status === "ready";
844857
const progressWidth =
845858
percent !== null
846859
? `${percent}%`
@@ -893,7 +906,7 @@ function VoiceBundleStatusStrip({
893906
data-testid="voice-prefix-persistent-bundle-progress"
894907
>
895908
<div
896-
className="h-full rounded-sm bg-[var(--brand-orange,#ff5800)] transition-[width] duration-500"
909+
className="h-full rounded-sm bg-[#0B35F1] transition-[width] duration-500"
897910
style={{
898911
width: progressWidth,
899912
opacity: percent === null ? 0.72 : 1,

packages/ui/src/components/onboarding/VoicePrefixSteps.tsx

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ function WelcomeStep(
289289
return (
290290
<div className="flex flex-col gap-3" data-testid="voice-prefix-welcome">
291291
<div className="flex items-center gap-3">
292-
<span className="inline-flex h-10 w-10 items-center justify-center rounded-sm bg-accent/15 text-accent">
292+
<span className="inline-flex h-10 w-10 items-center justify-center rounded-sm bg-[#0B35F1]/10 text-[#0B35F1]">
293293
<Sparkles className="h-5 w-5" />
294294
</span>
295295
<p className="text-sm">
@@ -305,7 +305,7 @@ function WelcomeStep(
305305
</Button>
306306
{permissionGranted === false ? (
307307
<p
308-
className="text-xs text-warn"
308+
className="text-xs text-[var(--onboarding-text-muted)]"
309309
data-testid="voice-prefix-welcome-mic-denied"
310310
>
311311
Microphone access was denied. You can grant it later in system
@@ -314,7 +314,7 @@ function WelcomeStep(
314314
) : null}
315315
{permissionGranted === true ? (
316316
<p
317-
className="text-xs text-ok"
317+
className="text-xs text-[#0B35F1]"
318318
data-testid="voice-prefix-welcome-mic-granted"
319319
>
320320
Microphone access granted.
@@ -356,7 +356,7 @@ function VoiceReadinessStep(
356356
</p>
357357
) : null}
358358
<div
359-
className="rounded-sm bg-bg/40 p-3"
359+
className="rounded-sm bg-white/30 p-3"
360360
data-testid="voice-prefix-bundle-readiness"
361361
>
362362
<div className="flex flex-col gap-2">
@@ -366,7 +366,7 @@ function VoiceReadinessStep(
366366
: readiness?.status === "assets-ready" ||
367367
readiness?.status === "ready"
368368
? "Voice assets added"
369-
: "Voice bundle"}
369+
: "Voice bundle"}
370370
</p>
371371
<p className="text-xs text-muted">
372372
{readiness?.message ??
@@ -381,7 +381,10 @@ function VoiceReadinessStep(
381381
aria-valuemax={100}
382382
data-testid="voice-prefix-bundle-progress"
383383
>
384-
<div className="h-full bg-accent" style={{ width: `${percent}%` }} />
384+
<div
385+
className="h-full bg-[#0B35F1]"
386+
style={{ width: `${percent}%` }}
387+
/>
385388
</div>
386389
) : null}
387390
<div className="flex flex-wrap items-center gap-2">
@@ -453,11 +456,14 @@ function AgentSpeaksStep(props: VoicePrefixStepsProps): React.ReactElement {
453456
{playing ? "Playing..." : played ? "Replay greeting" : "Play greeting"}
454457
</Button>
455458
{error ? (
456-
<p className="text-xs text-warn" data-testid="voice-prefix-agent-error">
459+
<p
460+
className="text-xs text-[var(--onboarding-text-muted)]"
461+
data-testid="voice-prefix-agent-error"
462+
>
457463
{error}
458464
</p>
459465
) : null}
460-
<p className="rounded-sm bg-bg/40 p-2 text-xs italic text-muted">
466+
<p className="rounded-sm bg-white/30 p-2 text-xs italic text-muted">
461467
{AGENT_GREETING_SCRIPT}
462468
</p>
463469
</div>
@@ -618,7 +624,7 @@ function UserSpeaksStep(props: VoicePrefixStepsProps): React.ReactElement {
618624
className="rounded-sm bg-warn/10 p-2 text-xs"
619625
data-testid="voice-prefix-user-speaks-error"
620626
>
621-
<p className="font-medium text-warn">
627+
<p className="font-medium text-[var(--onboarding-text-muted)]">
622628
We couldn't reach the voice service. Try again in a moment, or skip
623629
this step and come back to it from Settings.
624630
</p>
@@ -636,7 +642,7 @@ function UserSpeaksStep(props: VoicePrefixStepsProps): React.ReactElement {
636642
</p>
637643
) : done ? (
638644
<p
639-
className="text-sm text-ok"
645+
className="text-sm text-[#0B35F1]"
640646
data-testid="voice-prefix-user-speaks-done"
641647
>
642648
Captured {state.capturedPromptIds.length} of{" "}
@@ -649,7 +655,7 @@ function UserSpeaksStep(props: VoicePrefixStepsProps): React.ReactElement {
649655
{state.session.prompts.length} · ~{currentPrompt.targetSeconds}s
650656
</p>
651657
<p
652-
className="rounded-sm bg-bg/40 p-3 text-sm"
658+
className="rounded-sm bg-white/30 p-3 text-sm"
653659
data-testid="voice-prefix-user-speaks-prompt"
654660
>
655661
"{currentPrompt.text}"
@@ -717,7 +723,7 @@ function OwnerConfirmStep(props: VoicePrefixStepsProps): React.ReactElement {
717723
>
718724
<div className="flex items-center gap-3">
719725
<Crown
720-
className="h-5 w-5 text-accent"
726+
className="h-5 w-5 text-[#0B35F1]"
721727
data-testid="voice-prefix-owner-confirm-crown"
722728
/>
723729
<p className="text-sm">
@@ -732,7 +738,7 @@ function OwnerConfirmStep(props: VoicePrefixStepsProps): React.ReactElement {
732738
type="text"
733739
value={displayName}
734740
onChange={(e) => setDisplayName(e.target.value)}
735-
className="rounded-sm bg-bg/40 px-2 py-1 text-sm"
741+
className="rounded-sm bg-white/30 px-2 py-1 text-sm"
736742
data-testid="voice-prefix-owner-confirm-name"
737743
/>
738744
</label>
@@ -887,13 +893,13 @@ function FamilyStep(props: VoicePrefixStepsProps): React.ReactElement {
887893
{captured.map((m) => (
888894
<li
889895
key={m.profileId ?? m.displayName}
890-
className="flex items-center gap-2 rounded-sm bg-bg/25 p-1.5"
896+
className="flex items-center gap-2 rounded-sm bg-white/25 p-1.5"
891897
>
892898
<span className="font-medium">{m.displayName}</span>
893899
<span className="text-muted">· {m.relationship}</span>
894900
{m.entityId ? (
895901
<span
896-
className="ml-auto text-ok text-[10px]"
902+
className="ml-auto text-[#0B35F1] text-[10px]"
897903
data-testid="voice-prefix-family-captured"
898904
>
899905
captured
@@ -919,15 +925,15 @@ function FamilyStep(props: VoicePrefixStepsProps): React.ReactElement {
919925
)}
920926

921927
{phase === "idle" ? (
922-
<div className="flex flex-col gap-2 rounded-sm bg-bg/35 p-3">
928+
<div className="flex flex-col gap-2 rounded-sm bg-white/30 p-3">
923929
<label className="flex flex-col gap-1 text-xs text-muted">
924930
Name
925931
<input
926932
type="text"
927933
value={draftName}
928934
placeholder="e.g. Alex"
929935
onChange={(e) => setDraftName(e.target.value)}
930-
className="rounded-sm bg-bg/45 px-2 py-1 text-sm text-txt"
936+
className="rounded-sm bg-white/40 px-2 py-1 text-sm text-txt"
931937
data-testid="voice-prefix-family-name-input"
932938
/>
933939
</label>
@@ -938,19 +944,19 @@ function FamilyStep(props: VoicePrefixStepsProps): React.ReactElement {
938944
value={draftRelationship}
939945
placeholder="family, colleague, …"
940946
onChange={(e) => setDraftRelationship(e.target.value)}
941-
className="rounded-sm bg-bg/45 px-2 py-1 text-sm text-txt"
947+
className="rounded-sm bg-white/40 px-2 py-1 text-sm text-txt"
942948
data-testid="voice-prefix-family-relationship-input"
943949
/>
944950
</label>
945951
{captureError ? (
946952
<p
947-
className="text-xs text-danger"
953+
className="text-xs text-[var(--onboarding-text-muted)]"
948954
data-testid="voice-prefix-family-error"
949955
>
950956
{captureError}
951957
</p>
952958
) : null}
953-
<p className="rounded-sm bg-bg/40 p-2 text-xs italic text-muted">
959+
<p className="rounded-sm bg-white/30 p-2 text-xs italic text-muted">
954960
"{FAMILY_CAPTURE_PROMPT}"
955961
</p>
956962
<Button
@@ -965,10 +971,10 @@ function FamilyStep(props: VoicePrefixStepsProps): React.ReactElement {
965971
</div>
966972
) : phase === "recording" ? (
967973
<div
968-
className="flex items-center gap-2 rounded-sm bg-accent/8 p-3 text-sm"
974+
className="flex items-center gap-2 rounded-sm bg-[#0B35F1]/10 p-3 text-sm"
969975
data-testid="voice-prefix-family-recording"
970976
>
971-
<Mic className="h-4 w-4 animate-pulse text-accent" />
977+
<Mic className="h-4 w-4 animate-pulse text-[#0B35F1]" />
972978
Recording… {countdown}s — ask {draftName} to read the prompt aloud.
973979
</div>
974980
) : (

0 commit comments

Comments
 (0)