← Commit history

Publish 2.0.332

John Lauer ·5624bcfba0 ·1mo ago ·parent c5fc244
3 files changed +9−3
package.json+1−1
@@ -1,6 +1,6 @@ {   "slug": "pup-bridge",-  "version": "2.0.331",+  "version": "2.0.332",   "type": "app",   "description": "The pup SKILL PACK \u2014 the AI skills that teach a cloud/container AI how to drive the Adom Desktop Puppeteer (pup) bridge (browser_* verbs): the everyday `pup` skill plus focused sub-skills for windows/sessions/tabs, screenshots+recording, browsers+Chrome install, and driving the Adom wiki. Installs into ~/.claude/skills + ~/.codex/skills. DOCS ONLY \u2014 this is NOT the bridge runtime. The bridge itself (the Node program that drives the browser) runs on the DESKTOP: Adom Desktop bundles it and auto-installs/updates it, and it's published separately on the Releases tab as adom-bridge-puppeteer-v<ver>.zip. The pkg version is kept in lockstep with the Release version so the page's max version row always carries BOTH a pkg tarball (skills) and a runtime zip (bridge) \u2014 a skills-only or runtime-only bump on the top row breaks constraint installs. TL;DR: pkg install = the skills for your AI; the bridge = the Release zip, which Adom Desktop manages for you.",   "keywords": [
page.json+1−1
@@ -4,7 +4,7 @@   "slug": "pup-bridge",   "title": "Pup - Puppeteer Bridge",   "brief": "pup is the AI's own browser: a real, full Chrome on the user's desktop that the AI fully controls (a sandbox, not the user's signed-in browser). Rides Bridge; pup_* verbs open windows and tabs, navigate, screenshot, and eval JS.",-  "version": "2.0.331",+  "version": "2.0.332",   "tags": [     "skills",     "pup",
tools/pup-dashboard+7−1
@@ -184,6 +184,7 @@ async function buildStatus() {     detail: offline ? (tgt.name ? 'the desktop bridge is not answering' : 'no Adom Bridge is connected')       : (cftOk ? (cft.version ? `installed, pinned ${cft.version}` : 'installed and pinned')                : (bad(ready) ? `readiness could not be read (${ready.error || ready.errorCode || ready._err})` : (ready.reason || 'not installed yet'))),+    short: offline ? 'bridge offline' : (cftOk ? 'installed' : 'not installed'),     _hint: offline ? 'Start Adom Bridge on the desktop, then reload this page.'       : (cftOk ? null : 'Run pup_prewarm to install and warm Chrome for Testing before the first window.'),   });@@ -195,6 +196,7 @@ async function buildStatus() {     state: bad(status) ? 'fail' : 'ok',     detail: bad(status) ? `pup_* verbs not answering (${status._err || status.error || status.errorCode})`       : `pup ${status.version || '?'} answering on ${tgt.name}${tgt.all.length > 1 ? ` (of ${tgt.all.length} desktops: ${tgt.all.join(', ')})` : ''}`,+    short: bad(status) ? 'not answering' : 'answering',     _hint: bad(status) ? 'Check Adom Bridge is running on the desktop and the puppeteer bridge is installed (bridge_install).' : null,   }); @@ -208,6 +210,7 @@ async function buildStatus() {     detail: bad(status) ? 'unknown' : (sessions.length       ? `${sessions.length} window(s), ${tabs} tab(s): ` + sessions.map(s => `${s.sessionId}${s.owner ? ` (${s.owner})` : ''}`).join(', ')       : 'no pup windows open right now'),+    short: bad(status) ? 'unknown' : (sessions.length ? `${sessions.length} open` : 'none open'),     _hint: bad(status) ? null : 'Ask your AI to open one: pup_open_window {url}. It opens in the BACKGROUND and never steals your screen.',     sessions: sessions.map(s => ({ sessionId: s.sessionId, owner: s.owner || null, tabs: Array.isArray(s.tabs) ? s.tabs.length : null })),   });@@ -219,6 +222,7 @@ async function buildStatus() {     label: 'Profile',     state: bad(status) ? 'warn' : 'ok',     detail: bad(status) ? 'unknown' : `durable profile "${prof || 'adom-you'}": logins persist across windows`,+    short: bad(status) ? 'unknown' : (prof || 'adom-you'),     _hint: bad(status) ? null : 'Isolated throwaway instead: pup_open_window {isolated:true}.',   }); @@ -452,7 +456,9 @@ async function load(){     var leds=d.leds||[];     document.getElementById('leds').innerHTML=leds.map(function(l,i){       var st=ledState(l.state);-      var short=(l.detail||'').replace(/\\b\\d[\\d.]*\\b/g,'').replace(/ on [^.,;(]+/i,'').replace(/[.\\u2014(].*$/,'').replace(/\\s+/g,' ').trim().slice(0,26);+      var short=l.short||'';+      if(!short){ short=(l.detail||'').replace(/\\b\\d[\\d.]*\\b/g,'').replace(/ on [^.,;(]+/i,'').replace(/[.\\u2014(].*$/,'').replace(/\\s+/g,' ').trim();+        if(short.length>26){ var cut=short.slice(0,26); var sp=cut.lastIndexOf(' '); short=(sp>10?cut.slice(0,sp):cut)+'\\u2026'; } }       return '<span class="led-pill" data-state="'+st+'" data-i="'+i+'"><span class="dot"></span><b>'+l.label+'</b> <span class="st">'+short+'</span></span>';     }).join('');     document.querySelectorAll('.led-pill').forEach(function(pill){