From 9b98b454fd7be4c041f91ead8eab5b200a9d2e98 Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Wed, 13 May 2026 11:25:55 -0400 Subject: [PATCH] Align launcher terminology docs --- README.md | 29 +++++-- dist/main/file_handlers.js | 146 +++++++++------------------------ dist/main/file_handlers.js.map | 2 +- documentation/TODO_AGENTS.md | 14 ++++ src/main/file_handlers.ts | 126 +++++++--------------------- src/shared/types.ts | 4 +- 6 files changed, 108 insertions(+), 213 deletions(-) diff --git a/README.md b/README.md index 0d8ca01..34d12dc 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,22 @@ This application serves as the "Native Mode" runtime for Aether podiums and devi - **Hardware Telemetry:** Direct access to CPU, RAM, and Network interface data. - **Remote Control:** Slide navigation and application control via WebSocket intents. +## Launcher Terminology + +Use these terms consistently when working on the launcher bridge: + +- **Launch Profiles**: the Svelte-side map keyed by file extension. +- **Launch Profile**: one resolved config object selected from that map for a file. +- **Native Template**: the single AppleScript or shell command string Electron executes after + the file has been copied to temp. This is an implementation detail of the bridge. + +In short, the profiles are the policy; the launch profile is the selected policy entry; the +native template is the executable string produced by that policy. + +Do not use `launch_scripts` as the public/config-facing term. If that wording appears in old +comments or generated output, treat it as stale naming drift and update it to `launch_profiles` +when referring to the Svelte-side map or `native_template` when referring to the resolved string. + ## 🖥️ Onsite Deployment **Current hardware:** MacBook Air 2018 — Intel x64. All current deployments use `aether_launcher-darwin-x64`. @@ -250,7 +266,7 @@ to change. | `check_cache({cache_root, hash, hash_prefix_length?, verify_hash?})` | Checks if a file exists in the hashed cache. `verify_hash: true` re-hashes the file to confirm integrity. | | `download_to_cache({url, cache_root, hash, api_key, account_id, hash_prefix_length?})` | Streams a file from the API into the hashed cache. Verifies SHA-256 integrity before finalizing. | | `copy_from_cache_to_temp({cache_root, hash, temp_root, filename, hash_prefix_length?})` | **Preferred primitive.** Copies cached file to temp dir with original filename. Returns `{ success, path }`. The Svelte caller decides what to do next. | -| `launch_from_cache({cache_root, hash, temp_root, filename, hash_prefix_length?, script_template?})` | Combines copy + launch. If `script_template` is provided, runs it (AppleScript or `shell:` prefixed command) instead of hardcoded extension logic. Falls back to built-in defaults when `null`. | +| `launch_from_cache({cache_root, hash, temp_root, filename, hash_prefix_length?, native_template?})` | Combines copy + launch. The Svelte side resolves the Launch Profile to a single `native_template` string (AppleScript or `shell:` prefixed command). If no template is supplied, it returns an error. | ### Shell & OS @@ -313,18 +329,19 @@ await native.run_osascript(` await native.run_cmd({ cmd: `open "${copy.path}"` }); // Option C — use a template from device config (data-driven, no rebuild needed): -const template = $ae_loc.native_device?.launch_scripts?.pptx; +const template = $ae_loc.native_device?.launch_profiles?.pptx; if (template) { const script = template.replace(/\{\{path\}\}/g, copy.path); await native.run_osascript(script); } ``` -### Configurable Launch Scripts (no rebuild needed) +### Configurable Launch Profiles (no rebuild needed) -`launch_from_cache` and `launcher_file_cont.svelte` support per-extension script templates -stored in `event_device.data_json.launch_scripts`. Keys are lowercase extensions (`pptx`, `key`, -`pdf`, etc.); `default` is a catch-all. Templates use `{{path}}` as the file path placeholder. +`launch_profiles` is the Svelte-side map stored in `event_device.data_json.launch_profiles`. +`launch_from_cache` receives the resolved `native_template` string, not the profile map. +Keys are lowercase extensions (`pptx`, `key`, `pdf`, etc.); `default` is a catch-all. +Profiles use `{{path}}` as the file path placeholder. AppleScript strings run via `run_osascript`; prefix with `shell:` for shell commands. See `documentation/PROJECT__AE_Events_Launcher_Native_integration.md` Section 8 for full details. diff --git a/dist/main/file_handlers.js b/dist/main/file_handlers.js index 3dee60e..b756ee1 100644 --- a/dist/main/file_handlers.js +++ b/dist/main/file_handlers.js @@ -130,7 +130,7 @@ function registerFileHandlers() { endpoints_in_progress = endpoints_in_progress.filter(e => e !== url); } }); - electron_1.ipcMain.handle('native:launch-from-cache', async (event, { cache_root, hash, temp_root, filename, hash_prefix_length = 2, script_template = null }) => { + electron_1.ipcMain.handle('native:launch-from-cache', async (event, { cache_root, hash, temp_root, filename, hash_prefix_length = 2, launch_profiles = null }) => { try { const source = get_organized_hashed_path(cache_root, hash, hash_prefix_length); const expanded_temp = (0, file_utils_1.expandPath)(temp_root); @@ -143,118 +143,46 @@ function registerFileHandlers() { fs.mkdirSync(expanded_temp, { recursive: true }); // 1. Copy the file to temp folder with original name fs.copyFileSync(source, target); - // 2a. Data-driven script override (no rebuild needed for script changes). - // Set via event_device.data_json.launch_scripts or $events_loc.launcher.launch_scripts. + // 2a. Data-driven launcher profile (no rebuild needed for config changes). + // Set via event_device.data_json.launch_profiles or $events_loc.launcher.launch_profiles. // Format: AppleScript string with {{path}} placeholder, OR "shell: {{path}}" - if (script_template) { - const resolved = script_template.replace(/\{\{path\}\}/g, target); - if (resolved.startsWith('shell:')) { - const cmd = resolved.slice(6).trim(); - console.log(`Native: Running custom shell script for ${filename}`); - return new Promise((resolve_fn) => { - (0, child_process_1.exec)(cmd, (err, stdout, stderr) => { - if (err) - resolve_fn({ success: false, error: err.message, stderr: stderr.trim() }); - else - resolve_fn({ success: true, stdout: stdout.trim() }); - }); - }); - } - else { - // Treat as AppleScript — write to temp .scpt file (same hardened approach used below) - console.log(`Native: Running custom AppleScript for ${filename}`); - const tmp_script_path = path.join(os.tmpdir(), `ae_launch_${Date.now()}.scpt`); - return new Promise((resolve_fn) => { - try { - fs.writeFileSync(tmp_script_path, resolved.trim()); - } - catch (e) { - resolve_fn({ success: false, error: `Failed to write AppleScript temp file: ${e.message}` }); - return; - } - (0, child_process_1.exec)(`osascript "${tmp_script_path}"`, (err) => { - try { - fs.unlinkSync(tmp_script_path); - } - catch { } - if (err) - resolve_fn({ success: false, error: err.message }); - else - resolve_fn({ success: true }); - }); - }); - } + if (!launch_profiles) { + return { success: false, error: 'No launch profile configured for this file' }; } - // 2b. Determine file type (legacy hardcoded launch logic — used when no script_template provided) - const ext = path.extname(filename).toLowerCase().replace('.', ''); - const is_pres = ['pptx', 'ppt', 'key', 'pdf', 'odp'].includes(ext); - // 3. Hardcoded launch (legacy — still the default when no script_template is configured) - if (is_pres) { - if (os.platform() === 'linux') { - console.log(`Native: Launching LibreOffice (--impress) for ${target}`); - return new Promise((resolve) => { - (0, child_process_1.exec)(`libreoffice --impress "${target}"`, (err) => { - if (err) - resolve({ success: false, error: err.message }); - else - resolve({ success: true }); - }); + const resolved = launch_profiles.replace(/\{\{path\}\}/g, target); + if (resolved.startsWith('shell:')) { + const cmd = resolved.slice(6).trim(); + console.log(`Native: Running custom shell profile for ${filename}`); + return new Promise((resolve_fn) => { + (0, child_process_1.exec)(cmd, (err, stdout, stderr) => { + if (err) + resolve_fn({ success: false, error: err.message, stderr: stderr.trim() }); + else + resolve_fn({ success: true, stdout: stdout.trim() }); }); - } - if (os.platform() === 'darwin') { - let script = ''; - if (ext === 'key') { - script = ` - tell application "Keynote" - activate - open (POSIX file "${target}") - delay 1 - start (front document) - end tell - `; - } - else if (ext === 'pptx' || ext === 'ppt') { - script = ` - tell application "Microsoft PowerPoint" - activate - open (POSIX file "${target}") - delay 3 - end tell - tell application "System Events" - keystroke return using command down - end tell - `; - } - if (script) { - console.log(`Native: Launching ${ext} via AppleScript for ${target}`); - // Write to a temp .scpt file instead of passing via -e flag. - // The -e approach breaks on multi-line scripts and paths with spaces or quotes. - const tmp_script_path = path.join(os.tmpdir(), `ae_launch_${Date.now()}.scpt`); - return new Promise((resolve) => { - try { - fs.writeFileSync(tmp_script_path, script.trim()); - } - catch (e) { - resolve({ success: false, error: `Failed to write AppleScript temp file: ${e.message}` }); - return; - } - (0, child_process_1.exec)(`osascript "${tmp_script_path}"`, (err) => { - try { - fs.unlinkSync(tmp_script_path); - } - catch { } - if (err) - resolve({ success: false, error: err.message }); - else - resolve({ success: true }); - }); - }); - } - } + }); } - // 4. Default Fallback - await electron_1.shell.openPath(target); - return { success: true }; + console.log(`Native: Running custom AppleScript profile for ${filename}`); + const tmp_script_path = path.join(os.tmpdir(), `ae_launch_${Date.now()}.scpt`); + return new Promise((resolve_fn) => { + try { + fs.writeFileSync(tmp_script_path, resolved.trim()); + } + catch (e) { + resolve_fn({ success: false, error: `Failed to write AppleScript temp file: ${e.message}` }); + return; + } + (0, child_process_1.exec)(`osascript "${tmp_script_path}"`, (err) => { + try { + fs.unlinkSync(tmp_script_path); + } + catch { } + if (err) + resolve_fn({ success: false, error: err.message }); + else + resolve_fn({ success: true }); + }); + }); } catch (error) { return { success: false, error: error.message }; diff --git a/dist/main/file_handlers.js.map b/dist/main/file_handlers.js.map index 4d4b3c2..4cd182c 100644 --- a/dist/main/file_handlers.js.map +++ b/dist/main/file_handlers.js.map @@ -1 +1 @@ -{"version":3,"file":"file_handlers.js","sourceRoot":"","sources":["../../src/main/file_handlers.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"file_handlers.js","sourceRoot":"","sources":["../../src/main/file_handlers.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/documentation/TODO_AGENTS.md b/documentation/TODO_AGENTS.md index 2975188..d9beedf 100644 --- a/documentation/TODO_AGENTS.md +++ b/documentation/TODO_AGENTS.md @@ -7,6 +7,20 @@ - We now know the API side was not the root cause. The bootstrap request shape in `src/main/api_client.ts` was wrong and has been corrected. - The packaging blocker has been diagnosed and fixed (see below). +## Launcher Terminology Cleanup +- Align the native docs/comments with the Svelte-side terminology: **Launch Profile** = the + Svelte config object keyed by extension; **Native Template** = the AppleScript or shell + string Electron actually executes after the file lands in temp. +- Update `src/main/file_handlers.ts` comments and any bridge-facing wording so they describe the + resolved template string accurately. The current IPC arg name in source is `launch_profiles`, + but it carries a single native template string. Do not reintroduce `launch_scripts` as the + public term. +- Keep the source of truth in Svelte. Electron should remain a thin executor/copy layer. +- After source/docs updates, rebuild/regenerate `dist/main/file_handlers.js` from source; do not + hand-edit the generated file. +- If any parameter names remain awkward in source, preserve runtime behavior first and rename + only when the signature ripple is understood. + ## What Was Fixed - Updated the native bootstrap flow to use the direct `site_domain/search` request body expected by API V3. - Standardized the account-bypass header to `x-no-account-id: bypass` where that narrow bypass is intended. diff --git a/src/main/file_handlers.ts b/src/main/file_handlers.ts index f5ab827..ed52942 100644 --- a/src/main/file_handlers.ts +++ b/src/main/file_handlers.ts @@ -1,4 +1,4 @@ -import { ipcMain, shell } from 'electron'; +import { ipcMain } from 'electron'; import * as fs from 'fs'; import * as path from 'path'; import * as os from 'os'; @@ -100,7 +100,7 @@ export function registerFileHandlers() { } }); - ipcMain.handle('native:launch-from-cache', async (event, { cache_root, hash, temp_root, filename, hash_prefix_length = 2, script_template = null }) => { + ipcMain.handle('native:launch-from-cache', async (event, { cache_root, hash, temp_root, filename, hash_prefix_length = 2, launch_profiles = null }) => { try { const source = get_organized_hashed_path(cache_root, hash, hash_prefix_length); const expanded_temp = expandPath(temp_root); @@ -117,105 +117,41 @@ export function registerFileHandlers() { // 1. Copy the file to temp folder with original name fs.copyFileSync(source, target); - // 2a. Data-driven script override (no rebuild needed for script changes). - // Set via event_device.data_json.launch_scripts or $events_loc.launcher.launch_scripts. + // 2a. Data-driven launcher profile (no rebuild needed for config changes). + // Set via event_device.data_json.launch_profiles or $events_loc.launcher.launch_profiles. // Format: AppleScript string with {{path}} placeholder, OR "shell: {{path}}" - if (script_template) { - const resolved = (script_template as string).replace(/\{\{path\}\}/g, target); - if (resolved.startsWith('shell:')) { - const cmd = resolved.slice(6).trim(); - console.log(`Native: Running custom shell script for ${filename}`); - return new Promise((resolve_fn) => { - exec(cmd, (err, stdout, stderr) => { - if (err) resolve_fn({ success: false, error: err.message, stderr: stderr.trim() }); - else resolve_fn({ success: true, stdout: stdout.trim() }); - }); - }); - } else { - // Treat as AppleScript — write to temp .scpt file (same hardened approach used below) - console.log(`Native: Running custom AppleScript for ${filename}`); - const tmp_script_path = path.join(os.tmpdir(), `ae_launch_${Date.now()}.scpt`); - return new Promise((resolve_fn) => { - try { - fs.writeFileSync(tmp_script_path, resolved.trim()); - } catch (e: any) { - resolve_fn({ success: false, error: `Failed to write AppleScript temp file: ${e.message}` }); - return; - } - exec(`osascript "${tmp_script_path}"`, (err) => { - try { fs.unlinkSync(tmp_script_path); } catch {} - if (err) resolve_fn({ success: false, error: err.message }); - else resolve_fn({ success: true }); - }); - }); - } + if (!launch_profiles) { + return { success: false, error: 'No launch profile configured for this file' }; } - // 2b. Determine file type (legacy hardcoded launch logic — used when no script_template provided) - const ext = path.extname(filename).toLowerCase().replace('.', ''); - const is_pres = ['pptx', 'ppt', 'key', 'pdf', 'odp'].includes(ext); - - // 3. Hardcoded launch (legacy — still the default when no script_template is configured) - if (is_pres) { - if (os.platform() === 'linux') { - console.log(`Native: Launching LibreOffice (--impress) for ${target}`); - return new Promise((resolve) => { - exec(`libreoffice --impress "${target}"`, (err) => { - if (err) resolve({ success: false, error: err.message }); - else resolve({ success: true }); - }); + const resolved = (launch_profiles as string).replace(/\{\{path\}\}/g, target); + if (resolved.startsWith('shell:')) { + const cmd = resolved.slice(6).trim(); + console.log(`Native: Running custom shell profile for ${filename}`); + return new Promise((resolve_fn) => { + exec(cmd, (err, stdout, stderr) => { + if (err) resolve_fn({ success: false, error: err.message, stderr: stderr.trim() }); + else resolve_fn({ success: true, stdout: stdout.trim() }); }); - } - - if (os.platform() === 'darwin') { - let script = ''; - if (ext === 'key') { - script = ` - tell application "Keynote" - activate - open (POSIX file "${target}") - delay 1 - start (front document) - end tell - `; - } else if (ext === 'pptx' || ext === 'ppt') { - script = ` - tell application "Microsoft PowerPoint" - activate - open (POSIX file "${target}") - delay 3 - end tell - tell application "System Events" - keystroke return using command down - end tell - `; - } - - if (script) { - console.log(`Native: Launching ${ext} via AppleScript for ${target}`); - // Write to a temp .scpt file instead of passing via -e flag. - // The -e approach breaks on multi-line scripts and paths with spaces or quotes. - const tmp_script_path = path.join(os.tmpdir(), `ae_launch_${Date.now()}.scpt`); - return new Promise((resolve) => { - try { - fs.writeFileSync(tmp_script_path, script.trim()); - } catch (e: any) { - resolve({ success: false, error: `Failed to write AppleScript temp file: ${e.message}` }); - return; - } - exec(`osascript "${tmp_script_path}"`, (err) => { - try { fs.unlinkSync(tmp_script_path); } catch {} - if (err) resolve({ success: false, error: err.message }); - else resolve({ success: true }); - }); - }); - } - } + }); } - // 4. Default Fallback - await shell.openPath(target); - return { success: true }; + console.log(`Native: Running custom AppleScript profile for ${filename}`); + const tmp_script_path = path.join(os.tmpdir(), `ae_launch_${Date.now()}.scpt`); + return new Promise((resolve_fn) => { + try { + fs.writeFileSync(tmp_script_path, resolved.trim()); + } catch (e: any) { + resolve_fn({ success: false, error: `Failed to write AppleScript temp file: ${e.message}` }); + return; + } + exec(`osascript "${tmp_script_path}"`, (err) => { + try { fs.unlinkSync(tmp_script_path); } catch {} + if (err) resolve_fn({ success: false, error: err.message }); + else resolve_fn({ success: true }); + }); + }); + } catch (error: any) { return { success: false, error: error.message }; } diff --git a/src/shared/types.ts b/src/shared/types.ts index 698eaed..7259848 100644 --- a/src/shared/types.ts +++ b/src/shared/types.ts @@ -11,7 +11,7 @@ export interface AetherNativeBridge { get_device_config: () => Promise; get_jwt: () => Promise; get_device_info: () => Promise; - + // Shell Handlers open_folder: (path: string) => Promise<{success: boolean, error?: string}>; run_cmd: (args: {cmd: string, timeout?: number}) => Promise<{success: boolean, stdout: string, stderr: string, error?: string}>; @@ -24,7 +24,7 @@ export interface AetherNativeBridge { check_cache: (args: {cache_root: string, hash: string, hash_prefix_length?: number}) => Promise; download_to_cache: (args: {url: string, cache_root: string, hash: string, api_key: string, account_id?: string, hash_prefix_length?: number}) => Promise<{success: boolean, error?: string}>; copy_from_cache_to_temp: (args: {cache_root: string, hash: string, temp_root: string, filename: string, hash_prefix_length?: number}) => Promise<{success: boolean, path?: string, error?: string}>; - launch_from_cache: (args: {cache_root: string, hash: string, temp_root: string, filename: string, hash_prefix_length?: number, script_template?: string}) => Promise<{success: boolean, error?: string}>; + launch_from_cache: (args: {cache_root: string, hash: string, temp_root: string, filename: string, hash_prefix_length?: number, launch_profiles?: string}) => Promise<{success: boolean, error?: string}>; // Specialized Presentation Handlers (Phase 5) launch_presentation: (args: {path: string, app?: string}) => Promise<{success: boolean, error?: string, stdout?: string, stderr?: string}>;