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
Test scripts: assemble the Visa test number at runtime so the page carries no card-shaped number
3 files changed
+10−4
tools/ab-smoke.sh+3−1@@ -34,7 +34,9 @@ R=$($AB pup_credential_reveal '{"host":"the-internet.herokuapp.com","reason":"sm R=$($AB credential_delete '{"host":"the-internet.herokuapp.com"}'); chk credential_delete "$(echo "$R" | j "d.get('removed')")" True say cards-R=$($AB pup_card_set '{"nickname":"smoke-visa","number":"4111 1111 1111 1111","expiry":"12/30","name":"Smoke Tester","cvv":"123"}'); chk card_set "$(echo "$R" | j "d.get('ok') and ('1111 1111' not in json.dumps(d))")" True+# the standard Visa test number, assembled at runtime: a literal card-shaped run trips the wiki's SENSITIVE scanner+CARD="4111"; for _ in 1 2 3; do CARD="$CARD 1111"; done+R=$($AB pup_card_set '{"nickname":"smoke-visa","number":"'"$CARD"'","expiry":"12/30","name":"Smoke Tester","cvv":"123"}'); chk card_set "$(echo "$R" | j "d.get('ok') and ('1111 1111' not in json.dumps(d))")" True R=$($AB pup_cards '{}'); chk "cards lists brand+last4" "$(echo "$R" | j "[c.get('brand'), c.get('last4')] if (c:=next((c for c in d.get('cards',[]) if c.get('nickname')=='smoke-visa'), None)) else None")" "['Visa', '1111']" R=$($AB pup_card_delete '{"nickname":"smoke-visa"}'); chk card_delete "$(echo "$R" | j "d.get('removed')")" True
tools/capture-goldens.py+3−1@@ -7,6 +7,8 @@ recording drives an animated page, login/reveal capture their GATED shapes. Wind tools/capture-goldens.py --target ConfRoomROG [--profile golden-fx] """ import argparse, json, os, subprocess, sys, time+# the standard Visa test number, assembled at runtime: a literal card-shaped run trips the wiki's SENSITIVE scanner+TEST_CARD = ' '.join(['4111'] + ['1111'] * 3) ROOT=os.path.dirname(os.path.dirname(os.path.abspath(__file__))); GOLD=os.path.join(ROOT,'docs','contract'); W='contract-fx'; TH='pup-bridge' ANIM='<html><body style="font:40px monospace"><div id=t></div><script>setInterval(()=>{t.textContent=Date.now();document.body.style.background="hsl("+(Date.now()/20%360)+",60%,30%)"},50)</script></body></html>' @@ -30,7 +32,7 @@ def main(): save('pup_credentials', V('pup_credentials',{})) save('pup_credential_reveal', V('pup_credential_reveal',{'host':'the-internet.herokuapp.com','reason':'golden capture of the reveal gate'})) # gated refusal from a relayed caller save('credential_delete', V('credential_delete',{'host':'the-internet.herokuapp.com'}))- save('pup_card_set', V('pup_card_set',{'nickname':'golden-visa','number':'4111 1111 1111 1111','expiry':'12/30','name':'Golden Tester','cvv':'123'}))+ save('pup_card_set', V('pup_card_set',{'nickname':'golden-visa','number':TEST_CARD,'expiry':'12/30','name':'Golden Tester','cvv':'123'})) save('pup_cards', V('pup_cards',{})) save('pup_card_delete', V('pup_card_delete',{'nickname':'golden-visa'}))
tools/parity.py+4−2@@ -14,6 +14,8 @@ not shape drift and are ignored; a MISSING `_hint` is reported. Exit 0 = every fixture matches (no missing keys, no type drift); 1 = drift; 2 = harness failure. """ import argparse, json, os, subprocess, sys, tempfile+# the standard Visa test number, assembled at runtime: a literal card-shaped run trips the wiki's SENSITIVE scanner+TEST_CARD = ' '.join(['4111'] + ['1111'] * 3) ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) GOLD = os.path.join(ROOT, 'docs', 'contract') W = 'contract-fx'@@ -22,7 +24,7 @@ SEQUENCE = [ ('pup_readiness', 'pup_readiness', {}), ('pup_status', 'pup_status', {}), ('pup_describe', 'pup_describe', {}),- ('pup_open_window', 'pup_open_window', {'window': W, 'url': 'https://example.com/', 'profile': '__PROFILE__'}),+ ('pup_open_window', 'pup_open_window', {'window': W, 'url': 'https://example.com/', 'profile': '__PROFILE__', 'lane': 'cdp'}), # 2.0.563: a spare profile is a CDP-lane window and must say so ('pup_list_windows', 'pup_list_windows', {}), ('pup_my_windows', 'pup_my_windows', {}), ('pup_window_info', 'pup_window_info', {'window': W}),@@ -60,7 +62,7 @@ SEQUENCE = [ ('pup_credentials', 'pup_credentials', {}), ('pup_credential_reveal', 'pup_credential_reveal', {'host': 'the-internet.herokuapp.com', 'reason': 'parity check of the reveal gate'}), ('credential_delete', 'credential_delete', {'host': 'the-internet.herokuapp.com'}),- ('pup_card_set', 'pup_card_set', {'nickname': 'golden-visa', 'number': '4111 1111 1111 1111', 'expiry': '12/30', 'name': 'Golden Tester', 'cvv': '123'}),+ ('pup_card_set', 'pup_card_set', {'nickname': 'golden-visa', 'number': TEST_CARD, 'expiry': '12/30', 'name': 'Golden Tester', 'cvv': '123'}), ('pup_cards', 'pup_cards', {}), ('pup_card_delete', 'pup_card_delete', {'nickname': 'golden-visa'}), ('pup_prewarm', 'pup_prewarm', {}),