← Commit history

Fix the taskbar tasks I broke in 1.9.115. Root cause, measured on the actual binary: the jump-list tasks and the relaunch/pin command invoke the BUNDLED local adom-desktop-cli.exe, which is an OLDER build than the container CLI and rejects the global flag outright ('error: unexpected argument --ai-thread found'). So adding that flag to satisfy AD's caller-identity requirement made every task command INVALID, and John's 'Close ALL Adom Pup windows' and 'Switch to public view' clicks stopped doing anything at all. Identity now rides inside the verb's own JSON args as a caller block, which AD's documented precedence ranks ABOVE the flag and which every CLI version accepts as just another argument; it is also space-free by construction, dodging the Explorer / ad-taskrun argv re-parsing hazard I introduced on the way. Verified by running the args form against the bundled CLI directly. Lesson recorded: the taskbar path does not use the same CLI binary I test with, so a command that works from the container can be invalid there.

John Lauer ·52d8800612 ·3mo ago ·parent 61ba34a
4 files changed +16−9
adom-bridge-puppeteer-manifest.json+4−4
@@ -1,10 +1,10 @@ {   "manifest_version": 1,   "name": "puppeteer",-  "version": "1.9.120",-  "url": "https://wiki.adom.inc/download/adom/adom-desktop-puppeteer-bridge/1.9.120/adom-bridge-puppeteer-v1.9.120.zip",-  "sha256": "15db3a156a7f79368a845c99a4da103ce91f07502ea604e4521515c9e5176336",-  "size": 387067,+  "version": "1.9.121",+  "url": "https://wiki.adom.inc/download/adom/adom-desktop-puppeteer-bridge/1.9.121/adom-bridge-puppeteer-v1.9.121.zip",+  "sha256": "eddd9ab32dc84696e28014f37b2430b699610f77d00efcae2cd24ef0814060d2",+  "size": 387420,   "verbPrefixes": [     "browser_",     "desktop_recorder_",
src/BRIDGE_VERSION+1−1
@@ -1 +1 @@-1.9.120+1.9.121
src/bridge.json+1−1
@@ -2,7 +2,7 @@   "manifest_version": 1,   "name": "puppeteer",   "displayName": "Puppeteer (Chrome for Testing + Native)",-  "version": "1.9.120",+  "version": "1.9.121",   "description": "Drives a browser ALREADY on the machine \u2014 installed Chrome, else Microsoft Edge (every Windows PC ships with Edge) \u2014 launched with a FRESH isolated profile, so the common case has NO ~150 MB Chrome-for-Testing download and it never touches the user's real tabs/logins. Binds its local server to LOOPBACK (127.0.0.1) only, so no Windows Firewall 'allow Node through the firewall' prompt ever pops. Chrome for Testing is fetched only as a LAST RESORT if the machine has no Chromium browser at all. SPAWN-VERIFIED fallback: pup tries each detected browser (Chrome \u2192 Edge \u2192 CfT) and actually launches it, falling through to the next if one won't start (and handling browsers like Edge that relaunch onto another PID), so a corrupt/partial install never hard-fails an open. The browser that launches is cached as the default (persisted across restarts) so it isn't re-probed each time. On spawn the bridge SELF-WARMS: detects browsers + disk, and only if the box has no Chrome/Edge and no cached CfT does it background-fetch CfT so the first open is instant. browser_use pins a specific browser (chrome | edge | cft | auto); {browser:'chrome',install:true} downloads & installs REAL Google Chrome (user-scoped, no admin) on an Edge-only box. browser_readiness (READ-ONLY) reports which browser will be used + the full candidate list + the default + free disk. Every failure returns a specific errorCode + _hint (chrome_install_no_disk, chrome_download_network, chrome_install_permission, chrome_stable_not_detected, \u2026). Launches with FULL browser permissions by default for full debug (strictPermissions:true opts out). Headful automation: open/close windows+tabs, navigate, screenshot, eval JS, record. pup is a GENERIC, non-profile browser only \u2014 every session is a fresh isolated Chrome/Edge process, never the user's real signed-in browser; profile defaults to sessionId. To drive the user's REAL Chrome/Edge (their profile, cookies, SSO), use the Adom browser EXTENSION's nbrowser_* verbs \u2014 a separate bridge, not pup's job. macOS (v1.9.74+): full parity with mac-native mechanics \u2014 background-by-default is the app-level hide (windows stay drivable/screenshottable while hidden), raise/lower map to unhide+activate/hide, browser_alert_window posts a native toast whose click focuses the window, browser_use {browser:'chrome',install:true} installs Chrome from the official dmg, and taskbar identity/badging remains Windows-only.",   "homepage": "https://wiki.adom.inc/adom/adom-desktop",   "author": "Adom Inc.",
src/server.js+10−3
@@ -2154,10 +2154,10 @@ function pupIconPath(sessionId) { } function pupRelaunchCommand(sessionId) {   const cli = path.join(process.env.LOCALAPPDATA || path.join(os.homedir(), 'AppData', 'Local'), 'Adom Desktop', 'adom-desktop-cli.exe');-  const payload = JSON.stringify({ sessionId, foregroundReason: 'user clicked the Adom Pup taskbar header or pinned launcher' }).replace(/"/g, '\\"');+  const payload = JSON.stringify({ sessionId, foregroundReason: 'user clicked the Adom Pup taskbar header or pinned launcher', caller: { aiThread: 'user-taskbar-launcher' } }).replace(/"/g, '\\"');   // v1.9.115: same as the task commands — this runs when the user clicks the jump-list HEADER row or a   // pinned pup launcher, so it needs identity or AD refuses it and the click does nothing.-  return `"${cli}" --ai-thread "user: pup taskbar launcher" browser_focus_window "${payload}"`;+  return `"${cli}" browser_focus_window "${payload}"`;   // v1.9.121: identity rides in the payload JSON (see pupRelaunchCommand above) } function _isUnknownVerb(r, raw) { return /unknown (desktop )?command|unknown verb/i.test(((r && r.error) || '') + ' ' + (raw || '')); } async function ensurePupIdentityRegistered() {@@ -2483,7 +2483,14 @@ async function updateWikiJumplist(session, sessionId, opts) {   // I fixed the bridge's OUTBOUND calls (adCommand) and forgot the commands pup hands to WINDOWS.   // The thread name is honest here — a human clicked a taskbar menu, so that is who is asking, and it   // is what the user will recognise in their own Activity Log.-  const jarg = (verb, obj) => `--ai-thread "user: pup taskbar menu" ${verb} "${JSON.stringify(obj).replace(/"/g, '\\"')}"`;+  // v1.9.121 — identity goes in the JSON ARGS, never as a CLI flag. The taskbar tasks invoke the+  // BUNDLED local adom-desktop-cli.exe, which is an OLDER build than the container CLI and rejects+  // --ai-thread outright ("error: unexpected argument '--ai-thread' found"), so my 1.9.115 flag made+  // every task command INVALID and John's clicks stopped working entirely. AD's documented precedence+  // is args > flag > env, and a `caller` key inside the verb's own JSON is just another arg, so it+  // works on every CLI version, old or new. Also space-free by construction, which dodges the+  // Explorer/ad-taskrun argv re-parsing hazard.+  const jarg = (verb, obj) => `${verb} "${JSON.stringify({ ...obj, caller: { aiThread: 'user-taskbar-menu' } }).replace(/"/g, '\\"')}"`;   const taskArgs = (v) => jarg('browser_wiki_set_view', { sessionId, view: v });   // v1.9.51: a CLOSE-ALL task on every pup window (John: "i have like 8 open right now"). It calls   // browser_close with no sessionId, which kills every pup Chrome + clears every session. The empty