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
ship.sh was never pushing package.json, so the Files tab sat at 2.0.353 without the agent_permissions block
2 files changed
+30−3
package.json+21−1@@ -1,6 +1,6 @@ { "slug": "pup-bridge",- "version": "2.0.353",+ "version": "2.0.355", "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": [@@ -47,6 +47,26 @@ "install": "./install.sh", "uninstall": "./uninstall.sh" },+ "agent_permissions": {+ "allow_bash": [+ "pup-dashboard"+ ],+ "allow": [+ "pup-dashboard: prints the URL of pup's dashboard and reports its status. It starts no browser, opens no window, and changes nothing on the user's screen.",+ "pup read-only verbs (pup_screenshot, pup_status, pup_readiness, pup_describe, pup_my_windows, pup_list_windows, pup_credentials): these READ the state of pup's own sandbox browser. They never touch the user's real browser, never take the screen, and pup_credentials returns hosts and usernames only, never a password.",+ "pup navigation verbs (pup_open_window, pup_navigate, pup_reload, pup_open_tab, pup_click, pup_type, pup_eval): these drive a browser pup launched and owns, in a profile pup manages, in the BACKGROUND. It is not the user's signed-in browser and it does not take over their screen."+ ],+ "soft_deny": [+ "pup_login with submit:true: sends a stored password to a live site. It is reason-gated on purpose, and the reason names the live domain, because catching a lookalike domain before the secret is sent is the whole point.",+ "credential_set and credential_delete: these write to and remove from the user's OS keychain.",+ "pup_raise_os_window, pup_assisted_click, and any native desktop input: these take over the user's SCREEN and keyboard focus. Native input goes to whatever window holds focus at that instant, so a mistimed one types into the user's own work.",+ "pup_close_window and pup_quit_idle_browsers: these destroy windows the user may be looking at, and a pup window commonly holds state a person is part-way through."+ ],+ "environment": [+ "pup drives a browser pup installed and owns (Chrome for Testing), in a pup-managed profile, on the user's desktop but in the background. It is NOT the user's signed-in browser: that is nb, a different package.",+ "pup's verbs are invoked through the adom-bridge CLI rather than through a binary this package installs, so the allow_bash prefix rules above cannot reach them and these natural-language lines are all the classifier has to go on."+ ]+ }, "dependencies": { "adom/adom-bridge": "^2.0.0" },
tools/ship.sh+9−2@@ -27,7 +27,11 @@ cd "$REPO" echo "== 0. static gates ==" node --check src/server.js node tests/check_dashboard_script.js >/dev/null-echo " server.js + served dashboard script parse"+# 2.0.339: the dock moved to the bridge-served dashboard and the tab reverted to the old filled+# tile, because the favicon belongs to the PAGE, not the app. This gate keeps the two copies of+# the drawing identical and refuses currentColor, which renders black in an isolated document.+node tests/check_icon.js >/dev/null+echo " server.js + served dashboard script parse; dock favicon matches the served icon" echo "== 1. version lockstep ==" printf '%s' "$VER" > src/BRIDGE_VERSION@@ -84,9 +88,12 @@ open('adom-bridge-puppeteer-manifest.json', 'a').write('\n') print(f" manifest -> {url}\n sha256={sha} size={size}") PY +# package.json was MISSING from this list until 2.0.355, so the Files tab sat at 2.0.353 and did+# not show the agent_permissions block at all. The pkg TARBALL was always correct, which is why+# nothing broke and nobody noticed: the stale copy is the one humans read, not the one installs use. echo "== 4. push the text files ==" adom-wiki repo push "$PAGE" \- --files adom-bridge-puppeteer-manifest.json src/bridge.json src/BRIDGE_VERSION src/server.js src/chrome.js SKILL.md \+ --files adom-bridge-puppeteer-manifest.json src/bridge.json src/BRIDGE_VERSION src/server.js src/chrome.js SKILL.md package.json \ -m "v${VER}: ${LOG}" >/dev/null 2>&1 || { [ "${FORCE_PUSH:-0}" = "1" ] || { echo " PUSH FAILED (set FORCE_PUSH=1 to retry)"; exit 1; } }