app
Pup - the AI's own browser
Public Made by Adomby adom
pup gives your AI a real browser on your desktop that it drives completely, in the background, signed in as you: windows that never jump in front of your work, one shared profile that learns your logins, and every window labeled on the taskbar with its AI thread's name.
← Commit history
Update 2 file(s)
2 files changed
+60
dev-skills/pup-taskbar-identity/ralph_floaty.shadded+18@@ -0,0 +1,18 @@+#!/bin/bash+# Ralph for the floaty pencil: pup_floaty_click (the test seam) -> flag -> sweep -> annotate+# overlay on that tab, then Esc exits. N rounds; asserts the full production chain each time.+TGT=AdomLapper; ROUNDS=${1:-3}; fail=0+ab(){ adom-bridge-cli --target $TGT "$@" 2>&1; }+for r in $(seq 1 $ROUNDS); do+ ab pup_open_window '{"sessionId":"rf","url":"https://wiki.adom.inc/adom/pup-bridge","foreground":false}' --ai-thread "floaty-ralph" >/dev/null 2>&1+ sleep 9+ ck=$(ab pup_floaty_click '{"sessionId":"rf"}' --ai-thread "floaty-ralph" | python3 -c "import sys,json;d=json.load(sys.stdin);print(d.get('success'))" 2>/dev/null)+ sleep 8 # sweep cadence+ ov=$(ab pup_eval '{"sessionId":"rf","expr":"document.getElementById(\"__pup_annotate\") ? \"yes\" : \"no\""}' --ai-thread "floaty-ralph" | python3 -c "import sys,json;print(json.load(sys.stdin).get('result'))" 2>/dev/null)+ esc=$(ab pup_eval '{"sessionId":"rf","expr":"(() => { window.dispatchEvent(new KeyboardEvent(\"keydown\",{key:\"Escape\"})); return document.getElementById(\"__pup_annotate\") ? \"stuck\" : \"exited\"; })()"}' --ai-thread "floaty-ralph" | python3 -c "import sys,json;print(json.load(sys.stdin).get('result'))" 2>/dev/null)+ ab pup_close_window '{"sessionId":"rf"}' --ai-thread "floaty-ralph" >/dev/null 2>&1+ sleep 3+ st="r$r click=$ck overlay=$ov esc=$esc"+ if [ "$ck" = "True" ] && [ "$ov" = "yes" ] && [ "$esc" = "exited" ]; then echo " PASS $st"; else echo " FAIL $st"; fail=$((fail+1)); fi+done+echo "FLOATY RALPH DONE | FAILURES: $fail"
dev-skills/pup-taskbar-identity/ralph_menus.shadded+42@@ -0,0 +1,42 @@+#!/bin/bash+TGT=AdomLapper; fail=0+ab(){ adom-bridge-cli --target $TGT "$@" 2>&1; }+j(){ python3 -c "import sys,json;d=json.load(sys.stdin);print(d.get('$1'))" 2>/dev/null; }+sess(){ ab pup_list_windows '{}' --ai-thread rmn 2>/dev/null | python3 -c "+import sys,json+for s in json.load(sys.stdin).get('sessions') or []:+ if s.get('sessionId')=='$1': print(s.get('profile'),s.get('tabCount') or len(s.get('tabs') or []))"; }+ok(){ [ "$2" = "$3" ] && echo " PASS $1 ($2)" || { echo " FAIL $1 (got '$2' want '$3')"; fail=$((fail+1)); }; }+for r in 1 2; do+ echo "── round $r ──"+ ab pup_open_window '{"sessionId":"mn","url":"https://wiki.adom.inc/adom/pup-bridge","foreground":false}' --ai-thread "menu-ralph" >/dev/null 2>&1+ sleep 7+ ab pup_open_tab '{"sessionId":"mn","url":"https://wiki.adom.inc/adom/definitions"}' --ai-thread "menu-ralph" >/dev/null 2>&1+ sleep 4+ T2="https://wiki.adom.inc/adom/definitions"+ # 1. window info (popup path, resolved from tab 2)+ ok "info" "$(ab pup_window_info "{\"_tabUrl\":\"$T2\"}" --ai-thread "user-toolbar" | j success)" "True"+ # 2. annotate from tab 2 (popup path) -> overlay present -> esc+ ab pup_annotate "{\"_tabUrl\":\"$T2\"}" --ai-thread "user-toolbar" >/dev/null 2>&1; sleep 2+ ov=$(ab pup_eval '{"sessionId":"mn","tabId":"tab-2","expr":"(() => { const w = document.getElementById(\"__pup_annotate\"); if (w) { window.dispatchEvent(new KeyboardEvent(\"keydown\",{key:\"Escape\"})); return \"yes\"; } return \"no\"; })()"}' --ai-thread "menu-ralph" | j result)+ ok "annotate-overlay" "$ov" "yes"+ # 3. snip hotkey path (worker: _tabUrl + tool snip) -> overlay -> esc+ ab pup_annotate "{\"_tabUrl\":\"$T2\",\"tool\":\"snip\"}" --ai-thread "user-toolbar" >/dev/null 2>&1; sleep 2+ sv=$(ab pup_eval '{"sessionId":"mn","tabId":"tab-2","expr":"(() => { const w = document.getElementById(\"__pup_annotate\"); if (w) { window.dispatchEvent(new KeyboardEvent(\"keydown\",{key:\"Escape\"})); return \"yes\"; } return \"no\"; })()"}' --ai-thread "menu-ralph" | j result)+ ok "snip-overlay" "$sv" "yes"+ # 4. view toggle round trip from tab 2 (the wonky one)+ ab pup_wiki_set_view "{\"_tabUrl\":\"$T2\",\"view\":\"public\"}" --ai-thread "user-taskbar-menu" >/dev/null 2>&1; sleep 12+ ok "to-public" "$(sess mn)" "iso-mn-pub 2"+ ab pup_wiki_set_view '{"sessionId":"mn","view":"authed"}' --ai-thread "user-taskbar-menu" >/dev/null 2>&1; sleep 12+ ok "to-authed" "$(sess mn)" "adom-you 2"+ # 5. dashboard+ ab pup_dashboard '{}' --ai-thread "user-toolbar" >/dev/null 2>&1; sleep 6+ dc=$(ab pup_list_windows '{}' --ai-thread rmn | python3 -c "import sys,json;print(any(s.get('sessionId')=='pup-dashboard' for s in json.load(sys.stdin).get('sessions') or []))")+ ok "dashboard" "$dc" "True"+ ab pup_close_window '{"sessionId":"pup-dashboard","takeover":true}' --ai-thread "menu-ralph" >/dev/null 2>&1+ # 6. close via tab-2 resolution (user caller)+ ab pup_close_window "{\"_tabUrl\":\"$T2\"}" --ai-thread "user-taskbar-menu" >/dev/null 2>&1; sleep 4+ gone=$(ab pup_list_windows '{}' --ai-thread rmn | python3 -c "import sys,json;print(not any(s.get('sessionId')=='mn' for s in json.load(sys.stdin).get('sessions') or []))")+ ok "close" "$gone" "True"+done+echo "===================="; echo "MENU RALPH DONE | FAILURES: $fail"