diff --git a/documentation/TODO__Agents.md b/documentation/TODO__Agents.md
index ee7691d8..06da39f8 100644
--- a/documentation/TODO__Agents.md
+++ b/documentation/TODO__Agents.md
@@ -9,8 +9,10 @@
`run_osascript` / `run_cmd` directly with per-step error handling. Complete.
- [x] **[Launcher] Slide control scripts in Svelte config** — AppleScript post_scripts live in
`ae_launcher__default_launch_profiles.ts`. VLC focus-stealing fix applied. Complete.
-- [ ] **[Launcher] `kill_processes` target list in config** — Implement UI for manual "Kill Apps"
- button and auto-cleanup on file open.
+- [x] **[Launcher] Kill Apps button** — "Kill Apps" button added to Native OS config (System
+ Actions, edit mode only). Kills PowerPoint, Keynote, Adobe Acrobat Reader DC, VLC, soffice.
+ List overridable via `event_device.other_json.launcher.kill_process_li`. Auto-cleanup on file
+ open (deferred — manual button sufficient for CMSC).
- [ ] **[Launcher] End-to-end test on macOS** — test pptx and key opens on a real podium Mac.
- [ ] **[Launcher/Electron] Wallpaper stops applying after several changes (post-CMSC)** —
Append timestamp/random suffix to temp filename so macOS always sees a new path.
diff --git a/src/routes/events/[event_id]/(launcher)/cfg_components/launcher_cfg_native_os.svelte b/src/routes/events/[event_id]/(launcher)/cfg_components/launcher_cfg_native_os.svelte
index 1d69a68b..1f032ac4 100644
--- a/src/routes/events/[event_id]/(launcher)/cfg_components/launcher_cfg_native_os.svelte
+++ b/src/routes/events/[event_id]/(launcher)/cfg_components/launcher_cfg_native_os.svelte
@@ -17,7 +17,8 @@ import {
RefreshCw,
SkipBack,
SkipForward,
- Square
+ Square,
+ XCircle
} from '@lucide/svelte';
interface Props {
on_expand?: () => void;
@@ -69,6 +70,27 @@ async function handle_display_mode(mode: 'extend' | 'mirror') {
setTimeout(() => (system_status = ''), 4000);
}
+// Process names sent to kill_processes() when the operator hits "Kill Apps".
+// Covers the standard conference presentation app set — PowerPoint, Keynote, Acrobat, VLC, LibreOffice.
+// Override per device via event_device.other_json.launcher.kill_process_li.
+const DEFAULT_KILL_LIST = [
+ 'Microsoft PowerPoint',
+ 'Keynote',
+ 'Adobe Acrobat Reader DC',
+ 'VLC',
+ 'soffice'
+];
+
+async function handle_kill_apps() {
+ const native_device = ($ae_loc as any).native_device ?? null;
+ const process_name_li: string[] =
+ native_device?.other_json?.launcher?.kill_process_li ?? DEFAULT_KILL_LIST;
+ system_status = `Killing: ${process_name_li.join(', ')}...`;
+ await native.kill_processes({ process_name_li });
+ system_status = 'Kill signal sent';
+ setTimeout(() => (system_status = ''), 4000);
+}
+
// Modal state for dangerous actions
let show_power_confirm = $state<{ action: string; label: string } | null>(null);
@@ -240,6 +262,16 @@ let show_power_confirm = $state<{ action: string; label: string } | null>(null);
disabled={!$ae_loc.site_header_image_path}>