Commit Graph
394 Commits
Author SHA1 Message Date
ciregenz bfc57d686a [eric] browser: prove the windows cookie crypto layout on mac; make the tested helpers public 2026-07-28 18:22:46 -07:00
ciregenz 6034be1e40 [eric] browser: drop dead claude-only MODEL_MAP; guard aux calls to tiers not model ids 2026-07-28 18:16:36 -07:00
ciregenz 43cef02b17 [eric] browser: a post task never fills a comment box, even when it is the only one listed 2026-07-28 16:49:24 -07:00
ciregenz 1056613f80 [eric] browser: pin the guessed-submit guard, red-tested against the live LinkedIn false positive 2026-07-28 16:35:30 -07:00
ciregenz 9a1106bcb5 [eric] browser: a guessed submit click must prove the payload rendered, and questions never post 2026-07-28 15:27:36 -07:00
ciregenz 95b0e00d51 [eric] browser: stop the caller starving the send-script, which silently killed every write 2026-07-28 14:42:35 -07:00
ciregenz 49e935e3bd [eric] browser: a send may only claim success on evidence, and every completion is composed not templated 2026-07-28 14:05:00 -07:00
ciregenz c93ddf70ad [eric] browser: read-script defaults on with a kill switch; write-side stays off pending a fix 2026-07-28 13:35:36 -07:00
ciregenz c0c15b4c9c [eric] browser: every tier emits the same auditable trace, so the bubble never expands to nothing 2026-07-28 12:02:50 -07:00
ciregenz b99bc6cc3c [eric] browser: make a read wait until the page stops growing, not just until it looks long enough 2026-07-28 11:02:27 -07:00
ciregenz e28392b7bd [eric] settings: snap type onto the shared scale, 17 ad-hoc sizes down to 6 steps 2026-07-27 20:35:28 -07:00
ciregenz 59b07cd575 [eric] browser: let a hidden window take the bot challenge before the card loads a borrowed site 2026-07-27 20:15:39 -07:00
ciregenz 3003b1cd06 [eric] browser: present a borrowed site plain Chrome, and carry the whole jar 2026-07-27 19:33:52 -07:00
ciregenz 4ee276f9cf [eric] browser: borrow the sign-in at navigation time, not after the agent is already stuck 2026-07-27 16:29:19 -07:00
ciregenz c4987b0f13 [eric] browser: don't replay fingerprint-bound clearance tokens into the app partition 2026-07-27 14:57:28 -07:00
ciregenz 514aef45d6 [eric] browser: borrow the user's existing browser sign-in at a login wall (opt-in) 2026-07-27 14:01:05 -07:00
ciregenz 404ca418a3 [eric] browser: narrow the signed-in veto (notifications/profile appear logged out too) 2026-07-26 22:56:47 -07:00
ciregenz eea5ea3bd6 [eric] browser: seal today's three bug classes (mute aux lane, finder budget, soft signed-out) 2026-07-26 22:53:41 -07:00
ciregenz 9e11f128d3 [eric] browser: login-once handoff (pause on wall, sign in once, remember the site) 2026-07-23 17:14:14 -07:00
ciregenz 57a6954758 [eric] browser: honest delivery-check for ghost-drop sites + split send_script parsing 2026-07-23 14:53:58 -07:00
ciregenz ae42f50203 [eric] browser: button-name cleaning (gmail Send shortcut suffix) + direct-delete row tier 2026-07-22 13:41:59 -07:00
ciregenz 113e8d220c [eric] browser: delete+submit act via trusted input; reddit delete fast path proven live 2026-07-21 23:38:21 -07:00
ciregenz 10f9c12a8a [eric] browser: submit picker below-composer scope + container tier; readonly guard sealed 2026-07-21 21:02:55 -07:00
ciregenz 0d36f6d0fe [eric] browser: BrowserDeleteItem tool + no-repost-on-delete + composer late-render poll 2026-07-17 18:55:32 -07:00
ciregenz 1dd4d5ef78 [eric] browser: login-wall guard so the scripted send never fills an auth page 2026-07-17 16:43:54 -07:00
ciregenz 19734e1eac [eric] browser: repeat-write recipe tier (learn on verified DOM write, replay on repeat; default-off) 2026-07-17 11:50:07 -07:00
ciregenz 77181665c5 [eric] browser: read-script answers a read task from the staged authed page in one aux call (answer-or-INSUFFICIENT, fail-open) 2026-07-16 15:06:49 -07:00
ciregenz 493b58eca5 [eric] browser: plan-dispatch compiles cross-page chains + marked chosen picks (disambiguation turn-collapser); irreversible wall unchanged 2026-07-16 14:30:15 -07:00
ciregenz 72ddb07b59 [eric] browser: mid-loop post-fill code-send (model types, code finishes the send + verifies), so un-quoted sends skip the ~3-4 stale-Send-button turns 2026-07-15 20:02:57 -07:00
ciregenz 424ff22ce3 [eric] test: fix compose-confirmation test (asyncio.run, no leading-underscore attr) 2026-07-15 19:15:02 -07:00
ciregenz 32215136d2 [eric] browser: model-written send confirmation (cheap aux call, validated + fail-open to template) instead of a hardcoded line 2026-07-15 19:14:31 -07:00
ciregenz 7edb81a6cc [eric] test: warm-send summary assert case-insensitive for the friendly confirmation 2026-07-15 19:09:18 -07:00
ciregenz 3a9474e77d [eric] browser: cap+timeout the candidate scan (kill the 8s empty-scan idle) + send-script enables prestage opener (fixes ~50% fire-rate miss on search-page landings) 2026-07-15 18:26:52 -07:00
ciregenz 449f66057d [eric] browser: scope broadened submit vocab to the receipt-gated send-script; keep the always-on Send hint tight (broadening it regressed the default config with the send-script off) 2026-07-15 16:22:10 -07:00
ciregenz 5196ba77e3 [eric] browser: fire the 'from a previous visit' recall line only on a LEARNED playbook, not a shipped seed (else a first visit to a seeded site lies) 2026-07-15 15:46:35 -07:00
ciregenz e877afd3c8 [eric] browser: seed 117 popular sites (search/shop/food/stream/productivity/health/gov/AI); money sites read-only-never-transact; split data into seed_playbooks.py 2026-07-15 14:05:21 -07:00
ciregenz 06744e39c4 [eric] browser: +12 seed sites & write-mechanics; correct loop-tier comment (Haiku is the ~2x lever, not Sonnet, measured n=10) 2026-07-15 13:49:58 -07:00
ciregenz 1e68aa5d7b [eric] browser: send-script completes on X/IG/FB (submit-button vocab beyond LinkedIn Send) 2026-07-15 11:54:49 -07:00
ciregenz 1f74cc13de [eric] browser: general capture-replay write tier (site's own captured route, same-origin + gated, default off) 2026-07-14 23:47:17 -07:00
ciregenz d445543430 [eric] browser: wire BrowserApiWrite agent tool + robust Reddit write receipt 2026-07-14 23:27:39 -07:00
ciregenz 8bc7e479e8 [eric] browser: unified API-first write registry (site's own write API via borrowed session) + Reddit adapter
The general agent writes via UI puppeteering + the model loop (fire-rate ~50%, 13-52s); the deterministic alternative (cookie-borrow -> the site's OWN write API -> typed receipt) lived only in isolated MCP shims, and only Reddit's was genuinely API-first (X's shim is UI-driving). site_write_registry unifies it: has_api_write(domain,action) + api_write() route a write to a per-domain adapter (Reddit reuses reddit_writes, no fork), time it, and return a typed WriteResult (ok + the site's id/permalink receipt + latency); any failure becomes a typed ok=False so the agent falls back to the UI path, never a crash. A site with no adapter is a clean miss; adding one (X GraphQL, etc.) is one row. LIVE-VALIDATED end to end on Reddit through the registry: comment ok=True + reversible delete ok=True 196ms, verified [deleted] (deterministic, no captcha/DOM/selector, ~50-190x faster than UI). 6 unit tests (routing/receipt/fail-safe), linter clean, no import cycles. NOT yet wired as a browser-agent MCP tool (that path isn't live-testable on the wedged dev bench); receipt-string extraction returned 'ok' on the live run (write succeeded + verified reversible; id/permalink parse is a follow-up).
2026-07-14 19:51:53 -07:00
ciregenz 19a3e8ad1a [eric] browser: keystroke-fill fallback + cross-nav reveal retry (both flag-gated, default off)
Item 1: when the finder's execCommand insertText read-back fails (editors that reject synthetic input), retype the same text as real OS-level key events via wv.sendInputEvent, then verify from the marked element OR document.activeElement (editors like Reddit swap the node on activation, staling the selector). Item 3: when an open-first reveal navigates to a new document (Reddit thread, TikTok video, GitHub issue), the send-script re-perceives after a load beat and calls the finder once more on the destination, bounded to 2 tries. 4 new tests (cross-nav retry fires / no wasted retry) + structural tests split into test_browser_reveal.py to stay under the 300-line cap. Live real-path validation of the sendInputEvent leg is owed on a healthy rig: the eric/browser agent loop wedges at fresh-card webview mount (15.25s cap, renderer starvation, predates the suspend fix) at low load too
2026-07-12 20:52:15 -07:00
ciregenz 64675115f8 [eric] browser: reveal-and-find reach primitive (OSW_COMPOSER_REVEAL, default off) = when no composer is painted the finder takes ONE reversible reveal action (click a scored compose-trigger, open the first list item, or scroll) and rescans, bounded; SPA route changes keep the JS context alive so X/LinkedIn/Reddit/YouTube stay drivable in one call; never clicks an irreversible control (hard-block send/submit/pay/delete); send-script forwards reveal only under the flag; 2 tests (reveal forwarded when on, false by default) 2026-07-12 19:29:07 -07:00
ciregenz 4c85dd6314 [eric] browser: structural composer finder (OSW_COMPOSER_STRUCT, default off) = an in-page primitive that ranks editable regions (contenteditable/textarea/text-input near a Send/Post/Reply control, excluding search boxes) instead of matching AX names, marks the winner + fills+reads-back in-page (the only reliable commit-check for a React contenteditable whose text never reaches the AX tree); send-script uses it as a fallback when the name detector misses, unblocking unnamed/non-standard composers (Reddit Lexical, X DM); 3 tests, all safety gates + dry-run stop unchanged 2026-07-10 00:13:44 -07:00
ciregenz 31c4817146 [eric] browser: prestage opener-aware block rule (OSW_PRESTAGE_OPENER, default off) = a compose-entry word (post/comment/reply/tweet/write) is allowed to REVEAL a composer while none is present but REFUSED the instant a composer textbox exists (then it's the real submit); hard-irreversible words (send/submit/pay/buy/delete/subscribe) refused always; +1 deeper reach step + composer-open system prompt; flag-off is byte-identical to the legacy blanket gate; 6 tests incl the submit-still-refused safety invariant 2026-07-09 16:42:55 -07:00
ciregenz 329209259b [eric] browser: dry-run terminates the browser run with a grep-stable [dryrun-report] gate line (a dry-run decline falling through to the model loop could perform the REAL send the flag exists to avoid, and a loop rescue would contaminate gate attribution); inert when the flag is off; +2 tests 2026-07-09 16:26:15 -07:00
ciregenz 4eb1f909d2 [eric] browser: generalize the send-script surface gate from a LinkedIn-URL regex to a STRUCTURAL 'composer or opener present in the perception' check, so the same ~14s send fast-lane fires on ANY messaging site (X/Slack/Discord/Instagram/Gmail), no per-site code; broadened composer+opener name regexes to general messaging shapes; all safety gates unchanged (site-agnostic already); +2 tests incl a non-LinkedIn X composer firing 2026-07-08 23:53:11 -07:00
ciregenz 7de724c930 [eric] browser: fix the 2 warm-marriage replay bugs = (1) 'Send a message to X' opener no longer trips the replay send-boundary (it opens the composer, reversible), (2) marriage replays NAV+opener only and hands composer->send to the send-script (which polls the lazy overlay), instead of replaying a composer-textbox click that races the render; 4 tests 2026-07-08 23:39:19 -07:00
ciregenz 3257caafe4 [eric] browser: warm-write marriage (OSW_REPLAY_SENDTAIL, default off) = a learned send-skill's replayed prefix hands its post-nav state to the verified send-script tail, so a warm write completes with ZERO model turns; also fixes prefix steps missing from action_log (warm re-record was clobbering the skill with a tail-only version); zero-LLM e2e test 2026-07-08 23:20:07 -07:00
ciregenz f238fbfce9 [eric] browser: code-side plan dispatch (OSW_PLAN_DISPATCH, default off) = one aux call compiles the task's mechanical prefix into verified steps, code executes them resolve-late+verified, the big model starts with that work done; irreversibles refused in the PARSER, fail-open everywhere; the turn-collapser that doesn't wait for model tool adoption (0/3 A/Bs), 4 tests 2026-07-07 23:13:41 -07:00