diff --git a/internal/backend-dev-plugin.mjs b/internal/backend-dev-plugin.mjs index 80f4e9a4c..0f15dfb76 100644 --- a/internal/backend-dev-plugin.mjs +++ b/internal/backend-dev-plugin.mjs @@ -33,6 +33,9 @@ export const DEV_BACKENDS = [ // This server is SUPPOSED to run the engine (a server deployment with the engine switched on): while it // is down, the plugin says "not running yet" instead of "runs on your own computer". expected: () => process.env.RUDDER_ENGINE === '1' || process.env.RUDDER_AUDIO === 'browser', + // RUDDER_ENGINE=0 (a server where Rudder is laptop-only, the Driver 2026-09-27): never start it, even if a + // binary built by an earlier engine-on deploy is still there — it would offer to record a server's mic. + disabled: () => process.env.RUDDER_ENGINE === '0', }, ] @@ -117,6 +120,10 @@ export function backendDevPlugin(root) { logger.info(`[${b.name}] still running → ${b.route} (kept across the dev-server restart)`) continue } + if (b.disabled && b.disabled()) { + logger.info(`[backend] ${b.name} switched off here (${b.name === 'rudder-engine' ? 'RUDDER_ENGINE=0' : 'disabled'})`) + continue + } if (!existsSync(resolve(root, b.bin))) { logger.warn(`[backend] ${b.name} not built — its plugin will show "engine offline". Build: ${b.build}`) continue diff --git a/plugin-designs/rudder-voice/rudder-voice.vue b/plugin-designs/rudder-voice/rudder-voice.vue index 1d477ab99..69cb5735c 100644 --- a/plugin-designs/rudder-voice/rudder-voice.vue +++ b/plugin-designs/rudder-voice/rudder-voice.vue @@ -382,6 +382,9 @@ const audioMode = ref('local') // The server is set up to run the engine (it reports expected=true while the engine is down): an absent // engine there means "starting or failed to set up", not "this only runs on your computer". const engineExpected = ref(false) +// An engine that records ITS OWN machine's microphone, reached from another machine: it would record the +// server, not this reader, so the page treats it as laptop-only. +const remoteLocalMic = computed(() => audioMode.value === 'local' && !onOwnComputer.value && engine.value === 'ready') let sock = null, media = null, actx = null async function startBrowser() { @@ -586,7 +589,7 @@ watch([draft, recording], queueActivity) const statusText = computed(() => ({ connecting: 'Connecting…', starting: 'Loading speech model… (about 20 s the first time)', - ready: recording.value ? 'Listening' : 'Ready', + ready: remoteLocalMic.value ? 'Runs on your computer' : recording.value ? 'Listening' : 'Ready', error: 'Engine error', offline: onOwnComputer.value ? 'Engine offline' : engineExpected.value ? 'Not running yet' : 'Runs on your computer', }[engine.value] || engine.value)) @@ -647,7 +650,7 @@ const statusText = computed(() => ({