From c2828f2b9b5fffa222cbe0df938e6848798b414c Mon Sep 17 00:00:00 2001 From: SHL0MS Date: Thu, 2 Jul 2026 21:16:10 -0400 Subject: [PATCH 01/46] feat(skills): add security/unbroker (autonomous data-broker removal) unbroker finds where a consenting person's info is exposed across data brokers and people-search sites and files the removals, running as far as each site allows and handing only genuinely human-only steps (hard CAPTCHA, gov-ID, phone, fax) back as an end-of-run digest. - Deterministic stdlib CLI (scripts/pdd.py) owns config, dossiers+consent, the broker DB, tier planning, the ledger, email, and the autonomous action queue; the agent scans/submits with native tools (web_extract, browser_*, delegate_task, cronjob, terminal). - Verify-before-disclose, least-disclosure (never volunteers SSN), consent gate, opaque ids, optional age-at-rest encryption, file-locked ledger. - Jurisdiction-aware (CCPA/CPRA, GDPR, generic); CA DROP one-shot covers the state registry (~545) in a single request; BADBOOL + curated people-search coverage; scheduled re-scan for re-listing. - No CAPTCHA-solving services or anti-bot bypass; browser email mode needs no stored password. - 85 hermetic tests (tests/skills/test_unbroker_skill.py; SMTP/IMAP via injected fakes, registry via CSV fixtures). Ships placeholder data only. Broker dataset adapted from BADBOOL (Yael Grauer, CC BY-NC-SA 4.0). --- optional-skills/security/unbroker/README.md | 163 +++ optional-skills/security/unbroker/SKILL.md | 285 ++++ .../security/unbroker/assets/unbroker.png | Bin 0 -> 455219 bytes .../brokers/advancedbackgroundchecks.json | 50 + .../references/brokers/beenverified.json | 56 + .../unbroker/references/brokers/clustal.json | 47 + .../references/brokers/clustrmaps.json | 52 + .../brokers/cyberbackgroundchecks.json | 53 + .../references/brokers/familytreenow.json | 50 + .../references/brokers/fastpeoplesearch.json | 43 + .../unbroker/references/brokers/intelius.json | 88 ++ .../unbroker/references/brokers/mylife.json | 35 + .../unbroker/references/brokers/nuwber.json | 52 + .../unbroker/references/brokers/peekyou.json | 53 + .../references/brokers/peoplefinders.json | 53 + .../unbroker/references/brokers/radaris.json | 58 + .../references/brokers/searchpeoplefree.json | 53 + .../unbroker/references/brokers/spokeo.json | 56 + .../references/brokers/thatsthem.json | 46 + .../references/brokers/truepeoplesearch.json | 43 + .../references/brokers/usphonebook.json | 53 + .../references/brokers/whitepages.json | 57 + .../unbroker/references/legal/ccpa.md | 27 + .../unbroker/references/legal/drop.md | 34 + .../unbroker/references/legal/gdpr.md | 20 + .../security/unbroker/references/methods.md | 235 +++ .../unbroker/references/state-machine.md | 43 + .../security/unbroker/scripts/autopilot.py | 396 +++++ .../security/unbroker/scripts/badbool.py | 177 +++ .../security/unbroker/scripts/brokers.py | 77 + .../security/unbroker/scripts/config.py | 124 ++ .../security/unbroker/scripts/crypto.py | 88 ++ .../security/unbroker/scripts/dossier.py | 135 ++ .../security/unbroker/scripts/email_modes.py | 76 + .../security/unbroker/scripts/emailer.py | 342 +++++ .../security/unbroker/scripts/ledger.py | 164 +++ .../security/unbroker/scripts/legal.py | 63 + .../security/unbroker/scripts/paths.py | 79 + .../security/unbroker/scripts/pdd.py | 810 +++++++++++ .../security/unbroker/scripts/registry.py | 293 ++++ .../security/unbroker/scripts/report.py | 161 ++ .../security/unbroker/scripts/scan.py | 32 + .../security/unbroker/scripts/storage.py | 138 ++ .../security/unbroker/scripts/tiers.py | 269 ++++ .../security/unbroker/scripts/vectors.py | 53 + .../templates/consent/authorization.md | 15 + .../emails/ccpa-authorized-agent.txt | 24 + .../templates/emails/ccpa-deletion.txt | 22 + .../emails/ccpa-indirect-deletion.txt | 30 + .../templates/emails/gdpr-erasure.txt | 19 + .../templates/emails/generic-optout.txt | 15 + tests/skills/test_unbroker_skill.py | 1296 +++++++++++++++++ 52 files changed, 6703 insertions(+) create mode 100644 optional-skills/security/unbroker/README.md create mode 100644 optional-skills/security/unbroker/SKILL.md create mode 100644 optional-skills/security/unbroker/assets/unbroker.png create mode 100644 optional-skills/security/unbroker/references/brokers/advancedbackgroundchecks.json create mode 100644 optional-skills/security/unbroker/references/brokers/beenverified.json create mode 100644 optional-skills/security/unbroker/references/brokers/clustal.json create mode 100644 optional-skills/security/unbroker/references/brokers/clustrmaps.json create mode 100644 optional-skills/security/unbroker/references/brokers/cyberbackgroundchecks.json create mode 100644 optional-skills/security/unbroker/references/brokers/familytreenow.json create mode 100644 optional-skills/security/unbroker/references/brokers/fastpeoplesearch.json create mode 100644 optional-skills/security/unbroker/references/brokers/intelius.json create mode 100644 optional-skills/security/unbroker/references/brokers/mylife.json create mode 100644 optional-skills/security/unbroker/references/brokers/nuwber.json create mode 100644 optional-skills/security/unbroker/references/brokers/peekyou.json create mode 100644 optional-skills/security/unbroker/references/brokers/peoplefinders.json create mode 100644 optional-skills/security/unbroker/references/brokers/radaris.json create mode 100644 optional-skills/security/unbroker/references/brokers/searchpeoplefree.json create mode 100644 optional-skills/security/unbroker/references/brokers/spokeo.json create mode 100644 optional-skills/security/unbroker/references/brokers/thatsthem.json create mode 100644 optional-skills/security/unbroker/references/brokers/truepeoplesearch.json create mode 100644 optional-skills/security/unbroker/references/brokers/usphonebook.json create mode 100644 optional-skills/security/unbroker/references/brokers/whitepages.json create mode 100644 optional-skills/security/unbroker/references/legal/ccpa.md create mode 100644 optional-skills/security/unbroker/references/legal/drop.md create mode 100644 optional-skills/security/unbroker/references/legal/gdpr.md create mode 100644 optional-skills/security/unbroker/references/methods.md create mode 100644 optional-skills/security/unbroker/references/state-machine.md create mode 100644 optional-skills/security/unbroker/scripts/autopilot.py create mode 100644 optional-skills/security/unbroker/scripts/badbool.py create mode 100644 optional-skills/security/unbroker/scripts/brokers.py create mode 100644 optional-skills/security/unbroker/scripts/config.py create mode 100644 optional-skills/security/unbroker/scripts/crypto.py create mode 100644 optional-skills/security/unbroker/scripts/dossier.py create mode 100644 optional-skills/security/unbroker/scripts/email_modes.py create mode 100644 optional-skills/security/unbroker/scripts/emailer.py create mode 100644 optional-skills/security/unbroker/scripts/ledger.py create mode 100644 optional-skills/security/unbroker/scripts/legal.py create mode 100644 optional-skills/security/unbroker/scripts/paths.py create mode 100644 optional-skills/security/unbroker/scripts/pdd.py create mode 100644 optional-skills/security/unbroker/scripts/registry.py create mode 100644 optional-skills/security/unbroker/scripts/report.py create mode 100644 optional-skills/security/unbroker/scripts/scan.py create mode 100644 optional-skills/security/unbroker/scripts/storage.py create mode 100644 optional-skills/security/unbroker/scripts/tiers.py create mode 100644 optional-skills/security/unbroker/scripts/vectors.py create mode 100644 optional-skills/security/unbroker/templates/consent/authorization.md create mode 100644 optional-skills/security/unbroker/templates/emails/ccpa-authorized-agent.txt create mode 100644 optional-skills/security/unbroker/templates/emails/ccpa-deletion.txt create mode 100644 optional-skills/security/unbroker/templates/emails/ccpa-indirect-deletion.txt create mode 100644 optional-skills/security/unbroker/templates/emails/gdpr-erasure.txt create mode 100644 optional-skills/security/unbroker/templates/emails/generic-optout.txt create mode 100644 tests/skills/test_unbroker_skill.py diff --git a/optional-skills/security/unbroker/README.md b/optional-skills/security/unbroker/README.md new file mode 100644 index 000000000..e215e556e --- /dev/null +++ b/optional-skills/security/unbroker/README.md @@ -0,0 +1,163 @@ +# unbroker + +An agent-native skill that finds a consenting person's exposed personal information across data +brokers and people-search sites and removes it. It runs automatically wherever it can, and hands off +to a human only where a site demands a CAPTCHA it cannot clear, a government ID, a phone call, or a +fax. + +

+ unbroker: autonomous removal pipeline (exposure field, the loop, ledger, re-scan horizon) +

+ +## About + +Hundreds of data brokers publish people's names, current and prior addresses, phone numbers, emails, +relatives, and property records. That exposure fuels doxxing, stalking, harassment, and identity +theft. Removing the data is the documented antidote, but it is high-volume work, full of dark +patterns, and perishable (brokers re-list you). Commercial services such as EasyOptOuts, Incogni, and +DeleteMe solve this for a fee, but they are closed, and you hand a company you know nothing about the +exact data you are trying to erase. + +unbroker brings those core capabilities together (EasyOptOuts' automation breadth, Incogni's +legal-request engine, DeleteMe's verification and reporting) as a transparent, auditable, +self-hosted skill that the user's own agent runs. It is **multi-tenant** (manage yourself, family, or +clients, each isolated), **consent-gated**, and built for **maximum automation with a human +fallback**. Scope is **US-first**, with EU/UK (GDPR) and global coverage on the roadmap. + +The design is **Hermes-native**: a small deterministic Python CLI (`scripts/pdd.py`) owns the state +(config, dossiers, broker DB, tier planning, ledger, drafts, reports), while the agent does the +scanning and submitting with native tools (`web_extract`, `browser_*`, email, `cronjob`, +`delegate_task`). [`SKILL.md`](SKILL.md) is the authoritative reference. + +## Install + +```bash +hermes skills install official/security/unbroker +``` + +Then start a new Hermes session and drive it (below). The skill works zero-config; a few optional +env vars unlock more automation (all documented in `SKILL.md` under Prerequisites): + +- `BROWSERBASE_API_KEY`: the recommended default browser. A real residential-IP cloud browser that + clears soft/managed CAPTCHAs (Turnstile, hCaptcha/reCAPTCHA checkbox) as normal operation, so + those brokers stay automated. It is not a solver and does not defeat hard challenges. +- Hands-off email, two ways: **browser mode** (`pdd.py setup --email-mode browser`, no stored + password; the agent sends opt-outs and opens verification links through your logged-in webmail), + or **`EMAIL_ADDRESS` + `EMAIL_PASSWORD`** for SMTP send + IMAP verification. Without either, it + falls back to writing drafts for you to send. +- the `age` binary: at-rest encryption of dossiers and ledgers. +- the `google-workspace` skill: a shared Google Sheets status tracker. + +## Usage + +Drive it from a Hermes session: + +> "Use the unbroker skill to remove my data from data brokers. Here is my consent. Run it hands-off +> and show me the human-task digest at the end." + +The agent configures itself (`setup --auto` selects programmatic email if `EMAIL_*` creds exist, the +cloud browser if available, and encryption if `age` is installed), records your consent, then drains +the autonomous queue: scan, opt out (parents first), send and verify emails, schedule re-checks. You +hear from it twice: at intake, and with one digest of anything only a human can do. + +The underlying CLI (run via `terminal`, as `python3 scripts/pdd.py `): + +| Command | Purpose | +|---|---| +| `pdd.py setup --auto` / `doctor` | Self-configure (most-autonomous valid config) and readiness check | +| `pdd.py intake` | Create a consenting subject (captures aliases, multiple emails/phones, prior addresses) | +| `pdd.py next` | The loop driver: ordered agent actions right now, the human digest, and the next wake time | +| `pdd.py brokers` / `refresh-brokers` | List people-search brokers, or pull the latest BADBOOL list plus the CA registry | +| `pdd.py registry` | State data-broker registry coverage (CA ~545 ingested; VT/OR/TX portals); `--search` to find one | +| `pdd.py drop` | The CA DROP one-shot: delete from all registered brokers in a single request | +| `pdd.py plan` | Per-broker tier, method, search vectors, and the exact fields to disclose | +| `pdd.py fanout` | Batch brokers into parallel `delegate_task` subagents | +| `pdd.py record` | Update the ledger (validated state machine); auto-stamps recheck dates | +| `pdd.py send-email` | Render and send an opt-out / CCPA / GDPR request (recipient locked to the broker's own address) | +| `pdd.py poll-verification` / `verify-link` | Resolve email-verification links (IMAP poll, or browser-mode from pasted text) | +| `pdd.py render-email` | Draft-only fallback (least-disclosure) | +| `pdd.py due` / `tasks` | Recheck queue for cron, and the consolidated human-task digest | +| `pdd.py status` / `report` | Per-subject status, plus optional Google Sheets rows | + +## How it works + +- **Autonomous by default.** After one human conversation (intake plus consent), the agent drains a + deterministic action queue (`pdd.py next`): scan, opt out parents-first, send and verify emails, + re-check on schedule, all without pausing to ask. Human-only work (gov-ID sites, phone callbacks, + hard-CAPTCHA sites) accumulates silently into a single end-of-run digest (`pdd.py tasks`). +- **Tiered automation (T0 to T3).** Every broker opt-out is classified from fully automated, to + automated with verification, to human-verified, to human-only. The agent always takes the highest + viable tier and escalates to a human task only when genuinely blocked. +- **Cluster parents first.** Many brokers are resold shells of a few parents, so one removal can + clear a dozen child sites. The planner orders parents ahead of standalone listings and ships + field-verified, per-parent playbooks that prefer the **right-to-delete** lane over mere suppression + (for example PeopleConnect's "delete my user data", or Whitepages' privacy email, which sidesteps + the phone-callback tool entirely). +- **Multi-identifier fan-out.** A person is indexed under every name/alias, phone, email, and + address. The planner expands all of them (filtered by what each broker supports) so listings under + a maiden name or an old address are found, not just "primary name plus current city". +- **Verify before you disclose.** Nothing is submitted until a real listing is confirmed, the match + is confirmed as the subject and not a namesake or relative, and only the exact fields a broker + requires are sent (least-disclosure; SSN and ID numbers are never volunteered). +- **Jurisdiction-aware.** Requests file under the framework that applies where the subject lives: + CCPA/CPRA in California, GDPR in the EU/UK, a general right-to-delete request otherwise. It never + cites a right the subject cannot invoke. +- **Coverage that matches or exceeds commercial services.** Two lanes: (1) people-search sites with + per-site opt-out mechanics (19 curated records, including FamilyTreeNow, Radaris, and Nuwber, plus + a live pull from [BADBOOL](https://github.com/yaelwrites/Big-Ass-Data-Broker-Opt-Out-List)), and + (2) the **state data-broker registries** as a distinct legal-coverage lane: the **California Data + Broker Registry** (~545 registered brokers, the authoritative universe the commercial services draw + from) is ingested, with Vermont, Oregon, and Texas surfaced as search portals. +- **The DROP one-shot.** California's Delete Request and Opt-out Platform is live: for a CA resident, + a single verified request deletes their data from **every registered broker at once**, and + `pdd.py next` surfaces it as the highest-leverage action. +- **Ledger, audit, and re-scan.** Every case is a validated state machine, every PII disclosure is + logged (field names only), and confirmed removals are re-scanned on a schedule so a re-listing is + caught and re-filed. Ledger writes are file-locked for safe concurrent runs. +- **Privacy by default.** Opaque subject ids (no name in ids, paths, or logs), optional `age` at-rest + encryption of dossiers, and everything local. The skill ships placeholder data only. + +## Tests + +85 hermetic tests (no network, browser, or email; SMTP and IMAP are exercised through injected +fakes): + +```bash +scripts/run_tests.sh tests/skills/test_unbroker_skill.py # CI-parity harness +python3 tests/skills/test_unbroker_skill.py # dependency-free fallback runner +``` + +## Safety and ethics + +- **Consent-gated.** The engine refuses to scan or act on a subject without a recorded + authorization. It is a removal tool, not a people-search aggregator. +- **Sanctioned browser only, no solver farms.** The default cloud browser clears soft/managed + CAPTCHAs the way any real browser would, but there is no CAPTCHA-solving service and no fingerprint + spoofing. Hard interactive challenges escalate to a human task. +- **Least-disclosure and honest reporting.** The skill submits only what a broker requires. "Hidden + from free search" is never reported as "deleted", and residual exposure (public records, paid-tier + retention) is disclosed. +- **PII handling.** Dossiers live under the Hermes home directory (`0600`, optionally + `age`-encrypted), with opaque ids. + +## Status + +**v1.0.** The deterministic engine, the autonomous loop, the verified cluster-parent deletion lanes, +and full broker-registry coverage (the CA Data Broker Registry plus the DROP one-shot) are built and +covered by 85 hermetic tests. The skill ships placeholder data only. Live agent-driven submission +against broker sites is the active field-testing frontier. + +## Credits and license + +- Broker dataset adapted from the **Big-Ass Data Broker Opt-Out List (BADBOOL)** by **Yael Grauer**, + licensed [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/) (attribution + required, non-commercial). See [yaelwrites.com](https://yaelwrites.com/). +- Code: MIT. + +## Disclaimer + +This is not legal advice. Only operate on people who have authorized removal of their own data. +Removing data from brokers reduces exposure but does not guarantee total erasure. Public records +(voter, property, court) and offline vectors are out of scope. diff --git a/optional-skills/security/unbroker/SKILL.md b/optional-skills/security/unbroker/SKILL.md new file mode 100644 index 000000000..3888e04d0 --- /dev/null +++ b/optional-skills/security/unbroker/SKILL.md @@ -0,0 +1,285 @@ +--- +name: unbroker +description: Autonomously remove your info from data-broker sites. +version: 1.0.0 +author: SHL0MS (github.com/SHL0MS) +license: MIT +platforms: [linux, macos, windows] +prerequisites: + commands: [python3] +metadata: + hermes: + tags: [privacy, data-broker, opt-out, ccpa, gdpr, security, doxxing] + category: security + related_skills: [google-workspace, agentmail, himalaya, scrapling, osint-investigation] + homepage: https://github.com/NousResearch/hermes-agent +--- + +# unbroker + +Find where a person's personal information (name, addresses, phone, email, relatives) is exposed on +data brokers and people-search sites, then remove it - automatically where possible, with guided +human steps only where a site demands a CAPTCHA, government ID, phone call, or fax. Manages multiple +people independently. It does **not** defeat anti-bot systems, does **not** act on anyone without +recorded consent, and does **not** remove public records (voter/property/court) or accounts the +person controls. + +The Python CLI (`scripts/pdd.py`) owns the deterministic state - config, dossiers + consent, the +broker database, tier planning, the ledger, drafts, reports, **email sending (SMTP), verification-link +polling (IMAP), and the autonomous action queue (`next`)**. You (the agent) do the scanning and +form-driving with native tools: `web_extract` and `browser_navigate` for searching and web forms, and +`cronjob` for recurring re-scans. + +## Autonomy contract + +This skill is designed to run **hands-off**. After intake (+ recorded consent) there are exactly TWO +legitimate human touchpoints: (1) the intake conversation itself, and (2) ONE consolidated human-task +digest at the end of the run (`$PDD tasks`). Between those: + +- **Never ask the operator to choose configuration.** `$PDD setup --auto` detects capabilities and + picks the most autonomous valid config itself. +- **Never pause before individual submissions** when `autonomy=full` (the default): the consent + recorded at intake is standing authorization for T0-T2 opt-outs. (`autonomy=assisted` restores + per-submission confirmation for cautious operators - honor `confirm_first` flags in `next` output.) +- **Never interrupt the run for human-only work.** Record it (`record ... human_task_queued + --reason "..."`) and keep going; it all surfaces once in the final digest. +- **Drive the whole run as a loop over `$PDD next `** - it returns the exact ordered actions + to take right now (scan, poll verification, re-check, opt out parents-first, requeue blocked), plus + the human digest. Execute every action, record outcomes, re-run `next`, repeat until + `done_for_now`. Then present the digest, report, and schedule the cron. + +The hard limits that autonomy never overrides: no acting without recorded consent, no disclosure +beyond `disclosure_fields`, no CAPTCHA/anti-bot bypass, and `confirmed_removed` only after a +verifying re-scan. + +## When to Use + +- "Remove my (or my family member's) data from data brokers / people-search sites." +- "Opt me out", "delete me from Spokeo/Whitepages/etc.", "clean up after a doxxing." +- "Set up recurring privacy monitoring" (brokers re-list people). +- Checking which brokers still expose someone and why. + +## Prerequisites + +- `python3` (stdlib only; no extra packages needed for the core engine). +- **Optional upgrades** (the skill works zero-config without these; `setup --auto` turns on every + one it detects - each one converts a class of human tasks into agent actions): + - **Cloud browser (recommended default): `BROWSERBASE_API_KEY`.** `setup --auto` selects it + whenever the key is present, and it is the intended baseline: a real residential-IP cloud + browser **clears soft/managed CAPTCHAs (Cloudflare Turnstile, hCaptcha/reCAPTCHA checkbox) as + normal operation**, so those brokers stay automated (T1) instead of becoming human tasks. This + is not CAPTCHA "solving" - no solver service, no fingerprint spoofing; only interactive/behavioral + ("hard") challenges the browser genuinely cannot pass fall back to a human task. Without the key, + the plain agent browser is used and soft-CAPTCHA brokers drop to T2 (human). + - Email automation, two credential-free-or-not options: + - **Browser mode (no password): `setup --email-mode browser`.** The agent sends opt-out/CCPA + emails and opens verification links through the operator's **logged-in webmail** using + `browser_*` tools. Nothing is stored. Needs the inbox signed in in the browser Hermes uses + (a cloud browser like Browserbase won't hold the session; use a local/operator browser). + Falls back to drafts for an email if the inbox isn't reachable. + - **SMTP/IMAP (stored creds): `EMAIL_ADDRESS` + `EMAIL_PASSWORD`** (+ `EMAIL_SMTP_HOST` / + `EMAIL_IMAP_HOST` for non-mainstream providers; gmail/outlook/yahoo/icloud/fastmail inferred). + The CLI sends via `send-email` and reads verify links via `poll-verification`. The `agentmail` + skill (per-broker aliases) also counts. + - Google Sheets tracker: the `google-workspace` skill. + - The `scrapling` skill for stealth/Cloudflare-protected pages. + +## How to Run + +Run everything through the `terminal` tool. From this skill's directory: + +```bash +PDD="python3 scripts/pdd.py" +``` + +The engine stores data under `$PDD_DATA_DIR` (default `$HERMES_HOME/unbroker`), written +`0600`. Run via `terminal`, **not** `execute_code` (that sandbox scrubs env and redacts output, which +breaks reading the dossier). + +## Quick Reference + +| Command | Purpose | +|---|---| +| `$PDD setup --auto` | **Autonomous setup**: detect capabilities, pick the most autonomous valid config (no questions) | +| `$PDD doctor` | Readiness check: config, broker count, and which upgrades are on/available | +| `$PDD intake --full-name "..." [--alias ...] [--email ... --phone ...] [--city --state] [--prior-location "City,ST"] --consent` | Create a consenting subject; captures aliases + multiple emails/phones + prior locations; prints `subject_id` | +| `$PDD next ` | **The autonomous loop driver**: ordered agent actions right now + human digest + `next_wake_at` | +| `$PDD brokers [--priority crucial]` | List the people-search broker database (curated + live) | +| `$PDD refresh-brokers` | Pull the latest BADBOOL people-search list **and the CA Data Broker Registry** (`next` requeues this automatically when the cache is stale) | +| `$PDD registry [--search NAME]` | State registry coverage (CA ~545 ingested; VT/OR/TX portals surfaced); the DROP/email lane, not scanned | +| `$PDD drop [--filed]` | **The one-shot legal lever**: one CA DROP request deletes from ALL registered brokers; `--filed` records it | +| `$PDD plan [--priority crucial]` | Per-broker tier + method + `search_vectors` + the exact fields to disclose | +| `$PDD plan --batch` | **Reduce view**: overlays ledger state, groups brokers by next action (unscanned/found/indirect/blocked/in_progress/done), collapses ownership clusters, **orders `found` cluster-parents-first + emits a tailored `parent_playbook`**, prints `next_actions` | +| `$PDD fanout [--priority crucial] [--size 8]` | Batch brokers into parallel `delegate_task` subagents (auto for large runs) | +| `$PDD record [--found true] [--evidence JSON] [--disclosed F --channel C] [--reason "..."]` | Update the ledger (validated state machine); **auto-stamps `next_recheck_at`** | +| `$PDD send-email --listing [--kind ccpa_indirect ...]` | Render + record the request (recipient locked to the broker's own address). **browser** mode returns a `compose` payload to send via webmail (no password); **programmatic** mode SMTP-sends | +| `$PDD verify-link --text ''` | **browser mode**: extract a broker's verification link from webmail text you read (anti-phishing scored) | +| `$PDD poll-verification [--broker ]` | **programmatic mode**: poll IMAP for verification links (anti-phishing scored); auto-advances `submitted → verification_pending` | +| `$PDD render-email --listing ` | Draft only (fallback when no email mode is configured) | +| `$PDD due ` | Cases whose recheck window arrived (the cron re-scan queue) | +| `$PDD tasks ` | ONE consolidated human-task digest (present at END of run) | +| `$PDD status ` | Markdown status report | +| `$PDD report --sheets` | Rows for the Google Sheets tracker | + +## Batch operation (two-phase: crawl-all, then delete) + +For anything past a couple of brokers, run this as **map → reduce → act**, not broker-by-broker: + +- **Phase 1 - DISCOVER (read-only, parallel, idempotent).** Crawl *every* broker first and record a + verdict for each (`found` / `not_found` / `indirect_exposure` / `blocked`). Scanning has no side + effects, so it is safe to parallelize and retry. Getting the full exposure map *before* acting is + what unlocks cluster dedup and prioritization below. **Default: the parent drives `web_extract` + probes directly** - most people-search sites render name/phone/address results as static HTML that + `web_extract` reads in seconds. Escalate to `browser_*` only for the few JS-only sites, and to + `delegate_task` subagents only for genuinely *reasoning*-heavy work (large-scale namesake/relative + disambiguation). **Do NOT hand a browser-toolset subagent a big list of brokers to crawl** - in the + field this timed out repeatedly (600s, ~5-6 brokers each, no summary) because browser navigation is + heavy; the ledger writes that survived came at 10x the cost of parent `web_extract`. A `blocked` + (DataDome/Cloudflare/`antibot`) site is *not* a subagent job either: record `blocked` and requeue it + for a stealth/cloud browser (Browserbase) pass. Subagent reports are self-reports - the parent + re-fetches key URLs to confirm a `found` before trusting it (this cuts both ways: it caught a real + listing the parent had wrongly assumed was a false positive). +- **REDUCE - `$PDD plan --batch`.** Collapses the crawl into a phase-oriented plan: groups by + next action, **collapses ownership clusters** (a parent removal that clears children is ONE action, + not N - e.g. one Intelius/PeopleConnect suppression covers Truthfinder/Instant Checkmate/US Search/…), + and prints `next_actions`. `phase` is `discover` while anything is unscanned, else `delete`. +- **Phase 2 - DELETE (sequential, irreversible).** Work the reduced groups **parents first**: + `plan --batch` orders the `found` group cluster-parents-first (most children first) and emits a + `parent_playbook` with tailored, ordered steps per parent - follow that order and those steps + (full recipes in `references/methods.md` → "Ownership clusters - DO PARENTS FIRST"). Do the + cluster parents (skipping the covered children), **re-scan each parent's children after it confirms** + (they usually drop out), then the standalone listings; send the `indirect_exposure` cases as + CCPA/GDPR delete-my-PII emails (`send-email --kind ccpa_indirect`), and defer `blocked` to the + stealth-browser pass. Opt-outs hit CAPTCHAs, email-verification loops, and session binding - work + them **one at a time, carefully** (this is the opposite of fan-out), but do NOT stop to ask + permission per submission in `autonomy=full`; in `assisted`, confirm each one. **Prefer deletion + over suppression** where a broker offers both (e.g. PeopleConnect's "Right to Delete / DELETE MY + USER DATA" actually removes data; the suppression flow only hides it). + +Subagent reports are self-reports: the parent re-verifies key claims (listing URLs, match basis) before +recording `found` and before any deletion. + +## Procedure (the autonomous loop) + +1. **Setup (once, no questions).** Run `$PDD setup --auto` - it detects capabilities and configures + the most autonomous valid combination itself (programmatic email when `EMAIL_*` creds exist, + Browserbase when its key exists, `age` encryption when the binary exists, `autonomy=full`). Then + `$PDD doctor` and show the operator the readiness output **for information, not as a question** - + proceed immediately. Mention what would unlock more automation (e.g. email creds) but do not wait. +2. **Intake + consent (the ONE human conversation).** `$PDD intake ...` with `--consent` (and + `--consent-method`). Without consent the engine refuses to plan or act. Collect everything in one + pass - names/aliases, current + prior cities, emails, phones - so you never have to come back with + questions. For California subjects, also read `references/legal/drop.md`: `next` will surface a + `drop_submit` one-shot that deletes from every registered broker (~545) at once, which is the + single highest-leverage action. File it, then `drop --filed`. For non-CA subjects the + registry is covered by targeted CCPA/GDPR emails (`registry --search`, then `send-email`); the + people-search sites are worked directly in either case. +3. **Drain the queue.** Loop: + + ``` + while true: + q = $PDD next + if q.actions is empty: break + execute EVERY action in order; record each outcome via $PDD record + ``` + + `next` emits, in order: `refresh_brokers` (stale cache), `fanout_scan`/`scan_inline` (Phase 1 + crawl - see step 4), `poll_verification` (in-flight email confirmations), `verify_removal` (due + re-checks), `optout_web_form`/`optout_email_send` (Phase 2, parents-first with playbook steps), + `indirect_email_send`, and `stealth_rescan`. Human-only work never appears as an action - it + accumulates in `q.human_digest`. In `autonomy=full`, execute actions without pausing; honor + `confirm_first` in `assisted` mode. +4. **Scanning (when `next` says so).** For `fanout_scan`: run `$PDD fanout ` and **spawn one + `delegate_task` subagent per `batch`, in parallel, passing that batch's ready-made `brief`** - do + not scan all brokers yourself sequentially. For `scan_inline`: scan the few brokers yourself. + Either way, each broker gets **every** `search_vectors` entry via the `references/methods.md` + ladder (`web_extract` → `site:` probe → `browser_navigate` → `scrapling`), a 404 is INCONCLUSIVE + (not `not_found`), `blocked` is recorded when `antibot` is set and no stealth browser is available, + and subject vs namesake/relative is confirmed before recording: + `$PDD record --found --evidence '{"listing_urls":[...]}'`. + The parent re-verifies key `found` claims from subagents before trusting them. +5. **Opt-outs (when `next` says so).** Actions come pre-ordered parents-first with `steps` from each + broker record's own `optout.playbook` (field-verified; cluster parents like PeopleConnect, + Whitepages, BeenVerified, Spokeo have exact, live-checked recipes). **Deletion beats + suppression**: when an action carries `prefer_deletion`, complete the record's DELETION lane (e.g. + PeopleConnect's "DELETE MY USER DATA"), never just the hide-my-listing flow. Per method: + - **web_form** → drive `optout_url` with `browser_navigate`/`browser_type`/`browser_click`, submit + only `disclosure_fields`, screenshot the confirmation, then the action's `after` record command. + Playbooks may end with a right-to-delete `send-email` follow-up - do it (full erasure, not just + listing suppression). + - **email** → `$PDD send-email --kind --to + --listing ` records + discloses in one step (recipient locked to addresses the broker + record declares; `next` picks the kind from residency - never claim CCPA/GDPR for someone who + can't). In **browser** mode it returns a recipient-locked `compose` payload: compose a new + message to `compose.to` with `compose.subject`/`compose.body` exactly in the operator's webmail + via `browser_*` and send (no password); in **programmatic** mode it SMTP-sends. `next` also + routes human-gated forms (phone-callback/gov-ID) through a broker's deletion email when one + exists - the **rescue lane** (verified Whitepages pattern). Draft-only falls back to + `render-email` + a digest entry. + - **captcha** → soft/managed challenges clear automatically on the default cloud browser (proceed + as normal); only a hard interactive/behavioral challenge it can't pass is recorded `blocked` + (requeued for the stealth/operator-browser pass). Never a solver service. + - **phone_callback / account / gov_id / fax / mail / voice (T3)** *without a deletion email* → + never an agent action; `next` already routed these to the digest. Record them: + `$PDD record human_task_queued --reason "..."`. + 6. **Verification (when `next` says so).** In **programmatic** mode `$PDD poll-verification ` + finds arrived confirmation links via IMAP (anti-phishing scored, auto-advances state). In + **browser** mode, open the broker's confirmation email in the operator's webmail and run + `$PDD verify-link --text ''` to score the link. Either way **open the + link in the same browser** (several brokers bind the verification session to the browser that + opens it), finish the flow, then record `awaiting_processing`. `confirmed_removed` ONLY after a + verifying re-scan shows the listing gone - never off the submission flow's own confirmation page. +7. **Wrap up (once per run).** When `next` returns no actions: present `$PDD tasks ` (the + consolidated human digest) if non-empty, then `$PDD status `; if the Sheets tracker is + on, append `$PDD report --sheets` rows via the `google-workspace` skill. +8. **Schedule the next wake-up.** `next` returns `next_wake_at` (earliest due re-check). Create ONE + `cronjob` that re-runs this skill's loop for the subject (a prompt like: *"run the + unbroker loop for : `$PDD next` and execute all actions"*). Processing + windows, verification polls, and reappearance sweeps all flow through the same queue, so the case + keeps advancing with zero human attention. + +## Pitfalls + +- **Never disclose more than the broker already shows.** Submit only `disclosure_fields`. The engine + never volunteers SSN/ID numbers; you must not either. +- **No consent, no action.** The engine enforces this; do not work around it to "research" a third party. +- **`send-email` is idempotent + rate-limited.** It refuses to re-send a case already `submitted` + or beyond (use `--force` only if a genuine re-send is needed), and SMTP sends are paced by + `email_min_interval_seconds` (default 20s) with retry/backoff. Do not loop it to "make sure" - + a successful SMTP handoff is not proof of delivery; the due-queue re-scan is the real confirmation. +- **Ledger writes are locked.** Concurrent runs (cron + manual) serialize safely; if you ever see a + lock timeout, another run is mid-write - let it finish, don't delete the `.lock` by hand. +- **Autonomy ≠ improvisation.** Full autonomy means not *asking* between steps; it does not loosen any + gate. If a broker demands MORE than the planned `disclosure_fields` mid-flow, stop that case and + queue it (`human_task_queued --reason`) rather than deciding alone to disclose extra PII. +- **Don't interrupt the run with questions.** Config choices are `setup --auto`'s job; human-only work + goes to the digest. The only mid-run question that's ever warranted is a missing-identity fact that + blocks scanning (e.g. no city at all) - and that should have been collected at intake. +- **Use `terminal`, not `execute_code`** for `pdd.py` (secret scrubbing + output redaction break it). +- **Dossiers are plaintext by default** (JSON, `0600` under `HERMES_HOME`). For at-rest encryption run + `$PDD setup --encryption age` - it generates a local `age` key and encrypts dossiers + ledgers (the + audit log holds field names only and stays plaintext). It guards casual/backup/commit exposure, not + a full-`HERMES_HOME` read; set `PDD_AGE_IDENTITY` to a separate volume for real key separation. + `$PDD doctor` shows whether encryption is *actually* engaged (not just whether `age` is installed). +- **"Hidden from free search" ≠ deleted.** Only mark `confirmed_removed` after verifying the record is + actually gone; note paid-tier retention in the report. +- **Soft CAPTCHAs clear by default; don't fight the hard ones.** The default cloud browser passes + managed/soft challenges as normal operation (those brokers stay T1). For a hard interactive one it + genuinely can't pass, record `blocked` and let the stealth/operator-browser pass take it - never a + third-party solver service or fingerprint spoofing. +- **Broker pages change.** If a flow breaks, `$PDD record ... blocked` and flag the broker file in + `references/brokers/` for re-verification instead of guessing. +- **Verify non-field-verified records before submitting.** `confidence: auto` records came from + parsing BADBOOL (read `optout.notes`/`optout.links`, confirm the real opt-out URL). `confidence: + documented` records (several people-search sites) carry the correct published opt-out URL but have + **not** been field-verified (they 403 datacenter IPs), so confirm the live flow via the operator's + residential browser on first use, then set `last_verified`. Field-verified curated records (no + `confidence`, e.g. the cluster parents) have checked mechanics and take precedence. + +## Verification + +- `scripts/run_tests.sh tests/skills/test_unbroker_skill.py` (hermetic; no network), or the + dependency-free runner `python3 tests/skills/test_unbroker_skill.py`. +- Dry run: `$PDD setup --auto && $PDD doctor && SID=$($PDD intake --full-name "Test Person" + --email t@example.com --consent | python3 -c 'import sys,json;print(json.load(sys.stdin)["subject_id"])') + && $PDD next "$SID"` and confirm a readiness summary plus an ordered action queue. diff --git a/optional-skills/security/unbroker/assets/unbroker.png b/optional-skills/security/unbroker/assets/unbroker.png new file mode 100644 index 0000000000000000000000000000000000000000..18f7e3d5193a9df3646e4a085c2e6f91eba7dd3f GIT binary patch literal 455219 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 z

8b<4LRFD-odKb3zPr#^|lwuOto+-#fF*6 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

ow_PZ6AWf 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

e#kzvt!$~ZQHhO+qP}n>A2%`eCs{u-Y@qrRMoD% z)_lesk4f__{D+acdUec@V-S|{V#q?gfKq9zc;b@0it7il;NN8U-S6}OXcPTVB{HB~ zc>NMDr1KTjE$!+cNLgk3gRl9Q=;R^P$#KQA!y>jz()39Pj_Rbw+jf&k>N-{;ymk?a zR;CLz;s3sePPf%ja?Y9NJQN62&_;$A4U11wgr9q7=14;K=|X;Ze#=BdeO$eCPZ~Gf z5j6r~L4`oZox*5@_?@DNTC)bwi<}FCkJl0N1)blj@^@cQ0V}nn=Q?)zL-*AcY^57@ z7`!d*5Fg3eu_}`MTGAKVl3!N-#%jX}yD31>t1X`Pf5-|rb`Xu`$qroW+tq$G{=KYx zuNRR<=^#`Y*;1veDsVYWwnRr71q;AftR~w#l)otICl?U*orp{->Z-Bm_#2cUI2-L5Ovj z=M7?@{btM0^z=ktrmMF-@3PL+vBG9cqWfE3?*Vn;7* zVNW}~mR9dc%eL_$eRsWH%hU~i^*z0s6>Rq}LF@Zd%%*G#`(o*ZLulI;0YMUnh1MHk z+C?$iYq~V=#ZFCi2YK-mYBw?u;3pAg=w!WrVP~9+Y+@Si1SNyU$bLh@s{`I{7s{WU#kuDF`LGilg-bKV9sZC+U?pNN8vhocR zoifNv4UD*1vODddg;T4~YEMTa^TKCe^O%~?E=HQI_h2dAV2&UdYxsrTDt7H&6j5bW zo{nQZe7Yz{yai!sL4n&+IFzY}+6xOxkZ<@+Ox6A&FxM>|#0sDoe_wcNs~=)?mkIwB zs^RuHUz5Fo`D?zEwv|lWatoR(!bmjP4(Qc+EV(``;s1D_1tY%B#r?aK}qXjFXZeZVZaix9f<1*kR(7?_OQs!bM~7 zq?Sgl#QBhmy55UMSsk@mX`TN)Y*gO@HX%XDqV-SC79{S#7iyAVVh>plHQ3sQ<1r3C z;{fn3_eVP;AIleD~=%|t4LAaV%Y>(M0ldf4D%C^3%{=lSLhO<&BV7$m}6P3RH|f}w`@$_@C#?A40_;* zulg=heROueNCm?JL|>%%sb0{0w(9r?Lvjkfr2-(dA2CQ+S^Sy4``R<6Zl*XxoI}5oW?OG2{^%cdg#K z5dD6F_)vG(J>N5NpajmQhs>TagX{xEK3A6X4Y~mm^et@2GUKi4v&oq}ZF;jQ4B)E7 zlImK6jplLjob_r>t7OA|_DYlQS+n4~+LEbwUvGxr0?TXM)%s1OI`87U*ncbl*hDux zO8Z0qQl6J$b4Q{VkEkhBYLSE{0yY2#!=lMzc|30n`fx}-o2hpN=XBiQ z&Gu@h=$#Jj{&DqSjoprdO->@=0!Pa#G}+mqOwV3rHX{klG;7=x5XVfx{3^#nX}T@K0u#h$dFYt!g}2)06RT;Yv+kwB5{-P3P^}7QXN&;R zQv66874R1lC+-^^@ETI=XSK_1{Hz?fLP0pt^pdzV0@AcWH_g7=!e@`R)V^DaQ&oE` zDRy#|%Ju~+FWw5&s8X!%W8$2Tv#>%|pFlHFI5KY5F4ml8Yhbe`+4O4OvpBKdG*bh0 zV%n9wMn@;EDBl{p9aw|p*^PoH9_lmS%g#@a_ycQ^9iXs(%+K7GMdUnR(f5bVpo;Mn-aAB=tR=Zw}=UlY&ZZX|j z1tVKqEK?w?)O1N|Mg7Mc16>u~o>P0q>=B^qF=MuJcly@mL9Tv~P8VmSd3kl;X+y6+ zfhvw=!C?Vz2^MI$+MRh^ip%za1-_Qm*g_v5?$UvfYp*F*ZHF<`bX7xANsc3k4V%Y$ z5Qq7~tq=ksH+$s=;>lblQh;Go+ZNiepvaX$_|mE@=!~a$xquYUWQ_wAucfO}sn2~k zcEW>`RN&l?N@sEo9=W~`7Rod2C2vzkxEyay9g7TI;{qk2V2$lCpVJO?;DSl!^XXfn zKcVYL=Tw0Oigxdl&wnvOv+Tshzbli3EU zL(>4-XA1^5m$d_~Xw*}@joHUEg5n1AH=-?m05YE{O(+v*(wyb(Xk(E@9N&inphL$V z^Z-_++VzuU%K>%-;kS3C)%AF|ROg#vt}2tRq%3yK#$3=SixizQf;+Yj2oerd^iy2W+ppz95E0OZ_MD`Ar4W9}ihueHW@BKHu7<;A z&Ds-si@|EdHp9zM{o7@$uE0@xsC+qM>-F7@4k53t4_O^ZN`xb2P zY2L>OZq{;>Vg^G(6D=L@bJ~nC$Co^*a@jg0(N?y|iPPUeB`VT={#@c;(~wx>rp@jw zV^u_bX(?Mv59(cunuto*HbNxheZ7UHsHp$P$ZB1%4iq4LtNMLK>~`tsutw@L^th(h zr7I?ALQV6KHCytq7!I}_^OT#A>YSW-h;Ad!f~=B8Q^UDjpfUJb6EntFaUI`K!5ymg z>&IbS#lN-+@!97RjaFVbqe1q4+Tc$CXPbnT)3-Lc(jV9?P0fCw@V-u#mA%lanaPVe ze)3|vK?A8R7>*e}tHy2gj#f)0{5IZ&F{UE5V-thlS(Sptqjvc+vdJJaMC&-1MI>yg znP-q!2e&$QJZcWaE!$nn8zn^w6+<4SIAWSJjis&Orwus1y2Gs-VMj8H>{m4$KsJlA z_(`I0jnTpn4V9*0V1}^faJm**FX`YMj5jBhURM3B>uYcVL;_uZLbbRJ`jgxkI+CHU zN5v~4V;zKLp;HN>W^gR<&u2T+LyfTKSy>|#;@pPBs%N)dsU*dhN~xx|bLxT=LetDt zL2BN1+3sBlC40L^CXEni3r@vqm5l2ZlHEZuovYQPdON-P)an*1&ZLep!(_LV$|#

PL=nI)i9;5RR*8@W)vawWZs*$lkll@!! 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 )K%VFS{pj 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 literal 0 HcmV?d00001 diff --git a/optional-skills/security/unbroker/references/brokers/advancedbackgroundchecks.json b/optional-skills/security/unbroker/references/brokers/advancedbackgroundchecks.json new file mode 100644 index 000000000..ecc3932a6 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/advancedbackgroundchecks.json @@ -0,0 +1,50 @@ +{ + "id": "advancedbackgroundchecks", + "name": "AdvancedBackgroundChecks", + "category": "people_search", + "priority": "high", + "jurisdictions": ["US"], + "search": { + "method": "url_pattern", + "url": "https://www.advancedbackgroundchecks.com", + "fetch": "web_extract", + "match_signal": "result", + "by": ["name", "phone", "address"], + "url_patterns": { + "name": "https://www.advancedbackgroundchecks.com/name/{first}-{last}", + "name_state": "https://www.advancedbackgroundchecks.com/name/{first}-{last}/in/{ST}", + "phone": "https://www.advancedbackgroundchecks.com/phone/{digits10}", + "address": "https://www.advancedbackgroundchecks.com/address/{num}-{street-with-type}-{city}-{ST}-{zip}", + "person_profile": "https://www.advancedbackgroundchecks.com/find/person/{first}-{last}-{22charID}" + }, + "url_format_quirks": [ + "All path segments lowercase, spaces -> hyphens. Name: /name/jane-public ; name+state: /name/jane-public/in/NY (state 2-letter UPPERCASE).", + "Phone: /phone/5551234567 (10 digits, NO punctuation).", + "Address: /address/123-main-st-anytown-ny-12345 (all hyphen-joined incl. ZIP; abbreviations like 'S' and 'Ave' kept verbatim, not expanded).", + "Removable unit is the person profile: /find/person/{first}-{last}-{22charID} (opaque mixed-case ID). Also /find/name/{first}-{last} and /find/name/{first}-{last}/in/{ST}.", + "NO 404s for plausible patterns: an empty search returns a soft-200 page with 'similar' fuzzy rows. The real 'not found' signal is the ABSENCE of an exact-match block in the results heading, NOT an HTTP error. Do not record not_found off a 404 here; read the heading.", + "No anti-bot gating on search/result/phone/address pages (web_extract reads them fine). Site self-brands as 'ActualPeopleSearch' in FAQ text.", + "Search tabs: /?tab=phone /?tab=email /?tab=address. Directories: /lastnames/{surname} /firstnames/{first} /people/{state-name}/{city-name} /people/zip/{zip} /people/areacode/{code}." + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://www.advancedbackgroundchecks.com/opt-out", + "requires": { + "profile_url": false, + "email_verification": true, + "captcha": true, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": ["full_name", "contact_email"], + "notes": "Two-step email-verification flow: initial form (radio 'I am: The subject of the request / An authorized agent of the subject', First name*, Middle name, Last name*, Email*, consent) -> emailed link -> full form -> confirmation (processed within 45 days). CAPTCHA-gated: Google reCAPTCHA ('Recaptcha requires verification'). Verified read-only 2026-06-30; not submitted.", + "est_processing_days": 3, + "reappearance_risk": "medium" + }, + "last_verified": "2026-06-30", + "source": "BADBOOL" +} diff --git a/optional-skills/security/unbroker/references/brokers/beenverified.json b/optional-skills/security/unbroker/references/brokers/beenverified.json new file mode 100644 index 000000000..8fad47fe3 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/beenverified.json @@ -0,0 +1,56 @@ +{ + "id": "beenverified", + "name": "BeenVerified", + "category": "people_search", + "priority": "crucial", + "jurisdictions": ["US"], + "parent": "beenverified", + "owns": ["peoplelooker", "peoplesmart"], + "search": { + "method": "url_pattern", + "url": "https://www.beenverified.com/app/optout/search", + "fetch": "browser", + "match_signal": "result", + "by": ["name", "phone", "email", "address"] + }, + "optout": { + "tier": "T1", + "method": "web_form", + "url": "https://www.beenverified.com/svc/optout/search/optouts", + "email": "privacy@beenverified.com", + "requires": { + "profile_url": true, + "email_verification": true, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": ["full_name", "contact_email", "profile_url"], + "deletion": { + "via": "email_followup", + "email": "privacy@beenverified.com", + "kinds": ["ccpa", "generic"], + "notes": "privacy@beenverified.com is the documented address for opt-out, access, deletion, and correction requests (verified from the live privacy policy 2026-07-01). Controller is The Lifetime Value Co. -- a deletion request here can name their other properties too. DPO: dpo@beenverified.com. CCPA window: respond within 45 days (extendable to 90)." + }, + "playbook": [ + "Opt-out tool at beenverified.com/svc/optout/search/optouts ('Do Not Sell or Share' footer link; the legacy /app/optout/search path serves the same search) -- clears PeopleLooker + PeopleSmart.", + "Search the subject, open the matching listing, and submit with the confirmed profile URL + contact email. Email verification: poll-verification picks up the confirmation link; open it in the agent's own browser.", + "ONE opt-out per email address via the tool; for additional listings email support@beenverified.com or privacy@beenverified.com.", + "FULL DELETION follow-up (right-to-delete, beyond listing suppression): send-email --kind ccpa (CA) / generic to privacy@beenverified.com naming the listing URL(s); as the controller is The Lifetime Value Co., ask that the deletion cover affiliated LTV properties (NeighborWho, Ownerly, NumberGuru, Bumper) in the same request.", + "A separate property-search opt-out exists (NeighborWho/Ownerly are property-focused sisters); note residual exposure if relevant and re-scan the children after the parent confirms." + ], + "notes": "Opt-out form + deletion email both verified from the live privacy policy 2026-07-01 (policy dated 2025-10-21). Authorized agents: signed authorization letter or CA POA emailed to privacy@beenverified.com; agent-submitted delete/know requests must include the consumer's name, valid email, age, and address.", + "quirks": [ + "The 'Do Not Sell or Share My Personal Information' footer link now points to /svc/optout/search/optouts (observed 2026-07-01); records citing /app/optout/search are the same tool's older entry.", + "One opt-out per email address through the tool; email support for additional removals. The same browser/inbox must open the confirmation link.", + "Sister LTV Co. properties (NeighborWho, Ownerly, NumberGuru, Bumper) keep separate opt-out tools -- do NOT assume the BV tool cleared them; the privacy@ deletion request can name them, then verify by scanning each.", + "Right-to-know requests get an initial response within 10 days; deletion/access within 45 days (CCPA)." + ], + "est_processing_days": 7, + "reappearance_risk": "medium" + }, + "last_verified": "2026-07-01", + "source": "BADBOOL" +} diff --git a/optional-skills/security/unbroker/references/brokers/clustal.json b/optional-skills/security/unbroker/references/brokers/clustal.json new file mode 100644 index 000000000..c90a6fdfd --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/clustal.json @@ -0,0 +1,47 @@ +{ + "id": "clustal", + "name": "Clustal", + "category": "people_search", + "priority": "high", + "jurisdictions": ["US"], + "search": { + "method": "url_pattern", + "url": "https://www.clustal.org/", + "fetch": "web_extract", + "match_signal": "record", + "by": ["name"], + "url_patterns": { + "name_index": "https://www.clustal.org/people-search/{letter}/{first-last}/", + "name_state": "https://www.clustal.org/people-search/{letter}/{first-last}/{st}/", + "record": "https://www.clustal.org/record/{first-last}-{8charID}/" + }, + "url_format_quirks": [ + "Name index: /people-search/{first-initial}/{first-last}/ e.g. /people-search/k/jane-public/ (lowercase, first letter of LAST name as the {letter} segment, hyphen-joined name). Optional state refine appends /{st}/ lowercase 2-letter.", + "Detail (removable unit): /record/{first-last}-{8charID}/ e.g. /record/jane-public-a1b2c3d4/ (opaque mixed-case 8-char id). The index page links each match to its /record/ URL.", + "Readable via web_extract (no hard bot gate as of 2026-07-01). Rich profile: age/DOB, current+prior addresses, phones, emails, relatives, neighbors, associates.", + "Name only: search is by name(+state); no reverse phone/email/address path observed. NOTE: clustal.org squats the 'Clustal' bioinformatics brand but IS a real people-search/data-broker site ('Find Your DNA Relatives'), not the sequence-alignment tool - do not dismiss it as a false positive." + ] + }, + "optout": { + "tier": "T0", + "method": "web_form", + "url": "https://www.clustal.org/privacy-control/", + "requires": { + "profile_url": true, + "email_verification": true, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": ["profile_url", "contact_email"], + "notes": "Opt-out at /privacy-control/ using the /record/ profile URL; support help@clustal.org. Verify the exact form fields + any CAPTCHA live before submitting (requires flags below are provisional from the site's opt-out copy, not yet a live form walk-through).", + "email": "help@clustal.org", + "est_processing_days": 7, + "reappearance_risk": "medium" + }, + "last_verified": "2026-07-01", + "source": "BADBOOL", + "confidence": "curated" +} diff --git a/optional-skills/security/unbroker/references/brokers/clustrmaps.json b/optional-skills/security/unbroker/references/brokers/clustrmaps.json new file mode 100644 index 000000000..988aeddd6 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/clustrmaps.json @@ -0,0 +1,52 @@ +{ + "id": "clustrmaps", + "name": "ClustrMaps", + "category": "people_search", + "priority": "high", + "jurisdictions": [ + "US" + ], + "parent": "clustrmaps", + "owns": [], + "search": { + "method": "url_pattern", + "url": "https://clustrmaps.com/", + "fetch": "browser", + "match_signal": "result", + "antibot": "cloudflare", + "by": [ + "name", + "phone", + "address" + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://clustrmaps.com/bl/opt-out", + "requires": { + "profile_url": true, + "email_verification": true, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": [ + "contact_email", + "profile_url" + ], + "notes": "Address/resident aggregator. Opt-out at /bl/opt-out: submit the profile URL + email, confirm the link.", + "quirks": [ + "Opt-out URL is the documented public endpoint; datacenter IPs get 403 (anti-bot), so confirm the live flow via the operator's residential browser before the first submission, then set last_verified.", + "Needs the confirmed profile_url (the address/person page).", + "Email verification required." + ], + "est_processing_days": 3, + "reappearance_risk": "medium" + }, + "last_verified": null, + "source": "curated", + "confidence": "documented" +} diff --git a/optional-skills/security/unbroker/references/brokers/cyberbackgroundchecks.json b/optional-skills/security/unbroker/references/brokers/cyberbackgroundchecks.json new file mode 100644 index 000000000..a592504f7 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/cyberbackgroundchecks.json @@ -0,0 +1,53 @@ +{ + "id": "cyberbackgroundchecks", + "name": "CyberBackgroundChecks", + "category": "people_search", + "priority": "high", + "jurisdictions": [ + "US" + ], + "parent": "cyberbackgroundchecks", + "owns": [], + "search": { + "method": "url_pattern", + "url": "https://www.cyberbackgroundchecks.com/", + "fetch": "browser", + "match_signal": "result", + "antibot": "cloudflare", + "by": [ + "name", + "phone", + "address" + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://www.cyberbackgroundchecks.com/removal", + "requires": { + "profile_url": true, + "email_verification": true, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": [ + "full_name", + "contact_email", + "profile_url" + ], + "notes": "Free people-search. Opt-out at /removal: find the record, submit email, confirm link.", + "quirks": [ + "Opt-out URL is the documented public endpoint; datacenter IPs get 403 (anti-bot), so confirm the live flow via the operator's residential browser before the first submission, then set last_verified.", + "Needs the confirmed profile_url.", + "Email verification required." + ], + "est_processing_days": 3, + "reappearance_risk": "medium" + }, + "last_verified": null, + "source": "curated", + "confidence": "documented" +} diff --git a/optional-skills/security/unbroker/references/brokers/familytreenow.json b/optional-skills/security/unbroker/references/brokers/familytreenow.json new file mode 100644 index 000000000..5700d57d0 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/familytreenow.json @@ -0,0 +1,50 @@ +{ + "id": "familytreenow", + "name": "FamilyTreeNow", + "category": "people_search", + "priority": "crucial", + "jurisdictions": [ + "US" + ], + "parent": "familytreenow", + "owns": [], + "search": { + "method": "url_pattern", + "url": "https://www.familytreenow.com/", + "fetch": "browser", + "match_signal": "result", + "antibot": "cloudflare", + "by": [ + "name", + "phone", + "address" + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://www.familytreenow.com/optout", + "requires": { + "profile_url": false, + "email_verification": false, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": [ + "full_name" + ], + "notes": "Notorious free people-search / doxxing site (no registry). Opt-out: search the record, select it, confirm removal on-site. No account, free.", + "quirks": [ + "Opt-out URL is the documented public endpoint; datacenter IPs get 403 (anti-bot), so confirm the live flow via the operator's residential browser before the first submission, then set last_verified.", + "Select the exact record from search results, then confirm removal; historically no email step, but re-lists periodically so keep the re-scan scheduled." + ], + "est_processing_days": 2, + "reappearance_risk": "high" + }, + "last_verified": null, + "source": "curated", + "confidence": "documented" +} diff --git a/optional-skills/security/unbroker/references/brokers/fastpeoplesearch.json b/optional-skills/security/unbroker/references/brokers/fastpeoplesearch.json new file mode 100644 index 000000000..3cd7c90b1 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/fastpeoplesearch.json @@ -0,0 +1,43 @@ +{ + "id": "fastpeoplesearch", + "name": "FastPeopleSearch", + "category": "people_search", + "priority": "high", + "jurisdictions": ["US"], + "search": { + "method": "url_pattern", + "url": "https://www.fastpeoplesearch.com/", + "fetch": "browser", + "antibot": "datadome", + "match_signal": "result", + "by": ["name", "phone", "address"], + "url_patterns": { + "name": "https://www.fastpeoplesearch.com/name/{first}-{last}" + }, + "url_format_quirks": [ + "Name path /name/jane-public (lowercase, hyphen join) was ACCEPTED by the router under challenge, so the name pattern is confirmed even though content never rendered.", + "Sibling of truepeoplesearch (near-identical removal flow/branding); phone pattern is LIKELY /{digits} or /phone/{digits} and address /address/... but UNCONFIRMED - do not assume.", + "MOST aggressively gated of the people-search trio (2026-06-30): both server-side scraping (Firecrawl 504) AND headless browser (Cloudflare -> DataDome) fail on search AND /removal. Treat as fully blocked; needs residential-proxy/stealth browser to scan or opt out." + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://www.fastpeoplesearch.com/removal", + "requires": { + "profile_url": false, + "email_verification": true, + "captcha": true, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": ["full_name", "contact_email"], + "notes": "Opt-out NOT directly observed (2026-06-30): /removal is itself behind DataDome. By sibling-site pattern almost certainly mirrors truepeoplesearch (email-link flow, subject/agent toggle, name+email fields, hCaptcha) - INFERRED, not verified. Confirm before acting.", + "est_processing_days": 3, + "reappearance_risk": "high" + }, + "last_verified": "2026-06-30", + "source": "BADBOOL" +} diff --git a/optional-skills/security/unbroker/references/brokers/intelius.json b/optional-skills/security/unbroker/references/brokers/intelius.json new file mode 100644 index 000000000..1b3af8358 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/intelius.json @@ -0,0 +1,88 @@ +{ + "id": "intelius", + "name": "Intelius", + "category": "people_search", + "priority": "crucial", + "jurisdictions": [ + "US" + ], + "parent": "peopleconnect", + "owns": [ + "truthfinder", + "instantcheckmate", + "ussearch", + "zabasearch", + "classmates", + "peoplefinder", + "peoplelookup", + "addresses", + "anywho", + "publicrecords" + ], + "search": { + "method": "url_pattern", + "url": "https://www.intelius.com/", + "fetch": "web_extract", + "match_signal": "result", + "by": [ + "name", + "phone", + "address" + ], + "url_patterns": { + "name": "https://www.intelius.com/people-search/{First}-{Last}/", + "name_state": "https://www.intelius.com/people-search/{first}-{last}/{state-name}/", + "full_report": "https://www.intelius.com/search/?firstName={First}&lastName={Last}&city={City}&state={ST}&traffic%5Bsource%5D=INTSEO" + }, + "url_format_quirks": [ + "Name summary page: /people-search/{First}-{Last}/ (hyphen join; case-insensitive, both Jane-Public and jane-public work). Readable via web_extract (no hard bot gate as of 2026-06-30).", + "State refine: /people-search/{first}-{last}/{state-name}/ with the state SPELLED OUT lowercase, e.g. /jane-public/new-york/ (NOT the 2-letter code).", + "The summary shows last-known address + a 'possible relatives' list + a FAQ ('Where does X live?'). Corroborate the subject by address before acting; the 'Top People with the Last Name {Last}' block is unrelated namesakes.", + "Part of PeopleConnect: same data surfaces on Truthfinder/InstantCheckmate/USSearch; one suppression at suppression.peopleconnect.us covers the cluster." + ] + }, + "optout": { + "tier": "T1", + "method": "web_form", + "url": "https://suppression.peopleconnect.us/login", + "email": "privacy@peopleconnect.us", + "requires": { + "profile_url": false, + "email_verification": true, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": [ + "contact_email" + ], + "deletion": { + "via": "in_flow", + "url": "https://suppression.peopleconnect.us/guided-mode", + "email": "privacy@peopleconnect.us", + "kinds": ["ccpa", "generic"], + "notes": "The portal's 'Right to Delete / DELETE MY USER DATA' (bottom of guided-mode) is the verified deletion path and covers the whole cluster. privacy@peopleconnect.us is the documented rights-request address (their 2025 CPRA metrics: 33,513 delete requests, median response < 1 day) - use it as the fallback if the portal breaks." + }, + "playbook": [ + "PeopleConnect portal (suppression.peopleconnect.us/login, privacy-center entry at /privacy-center) -- ONE flow here clears Truthfinder, Instant Checkmate, US Search, ZabaSearch, Classmates and ~15 more. DO THIS PARENT FIRST.", + "Step 1 asks ONLY for an email + consent checkbox (no name/DOB, no CAPTCHA) -> sends a verification email. Least-disclosure entry: just the contact email.", + "poll-verification will pick up the verify link. The link authenticates a SESSION bound to the browser that OPENS it: the SAME agent browser must open the link and drive /guided-mode (a different browser is bounced to /login).", + "SUPPRESSION != DELETION -- guided-mode's default flow only HIDES the report (data retained, can re-list). Scroll to the BOTTOM of guided-mode and use 'Right to Delete / DELETE MY USER DATA' (CCPA/CPRA) -- this actually deletes across the cluster and emails its own confirmation link; poll and open that too.", + "If the portal breaks: email privacy@peopleconnect.us (rights-request address, median response < 1 day per their published metrics), or sister addresses privacy@intelius.com / privacy@truthfinder.com / privacy@instantcheckmate.com / support@ussearch.com / privacy@classmates.com; phone 1-888-245-1655.", + "After the deletion confirms, re-scan the covered children (they normally drop out) before submitting any duplicate child opt-out." + ], + "notes": "PeopleConnect portal covers the cluster. Authorized-agent requests: signed written authorization (full name, address, phone, the email the consumer uses) or POA; for Right-to-Delete they verify agent authority with the consumer by email. Verified from the live privacy policy 2026-07-01 (policy dated 2026-06-30).", + "quirks": [ + "Step 1 (suppression.peopleconnect.us/login) asks ONLY for an email + a consent checkbox, then 'Continue' -> a verification email with a link. No CAPTCHA, no name/DOB at step 1. Least-disclosure entry: just the contact email. Verified live 2026-06-30.", + "The verification link authenticates a SESSION and lands on /guided-mode. That session is bound to the browser that OPENED it; a different browser hitting /guided-mode is redirected back to /login. So for hands-off automation the SAME agent browser must open the verify link (Mode B: read inbox -> agent browser navigates the link -> drive guided-mode).", + "SUPPRESSION != DELETION. The guided-mode/suppression flow only HIDES the background report (data retained, can re-list). At the BOTTOM of guided-mode there is a separate 'Right to Delete' section with a 'DELETE MY USER DATA' button (CCPA/CPRA) that removes the user data across the cluster - this is the stronger action and should be preferred. It also emails a confirmation link. (Confirmed via security.org Instant Checkmate guide + live flow 2026-06-30.)", + "Their published request metrics (2025, all US users regardless of state): 33,513 deletion requests, 26,603 complied, median response < 1 day - the deletion lane is real and fast. Verified from privacy policy 2026-07-01." + ], + "est_processing_days": 7, + "reappearance_risk": "medium" + }, + "last_verified": "2026-07-01", + "source": "BADBOOL" +} diff --git a/optional-skills/security/unbroker/references/brokers/mylife.json b/optional-skills/security/unbroker/references/brokers/mylife.json new file mode 100644 index 000000000..cdb739c19 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/mylife.json @@ -0,0 +1,35 @@ +{ + "id": "mylife", + "name": "MyLife", + "category": "people_search", + "priority": "crucial", + "jurisdictions": ["US"], + "search": { + "method": "url_pattern", + "url": "https://www.mylife.com", + "fetch": "browser", + "match_signal": "profile", + "by": ["name"] + }, + "optout": { + "tier": "T3", + "method": "phone", + "url": "https://www.mylife.com/privacyrequest", + "requires": { + "profile_url": true, + "email_verification": false, + "captcha": false, + "gov_id": true, + "account": false, + "phone_callback": false, + "phone_voice": true, + "payment": false + }, + "inputs": ["full_name", "profile_url"], + "notes": "Often pushes a driver's-license upload or a call to (888) 704-1900. Emailing privacy@mylife.com with name + profile link is an alternative. Also covers Wink.com.", + "est_processing_days": 14, + "reappearance_risk": "high" + }, + "last_verified": "2026-06-28", + "source": "BADBOOL" +} diff --git a/optional-skills/security/unbroker/references/brokers/nuwber.json b/optional-skills/security/unbroker/references/brokers/nuwber.json new file mode 100644 index 000000000..f8d4424a3 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/nuwber.json @@ -0,0 +1,52 @@ +{ + "id": "nuwber", + "name": "Nuwber", + "category": "people_search", + "priority": "high", + "jurisdictions": [ + "US" + ], + "parent": "nuwber", + "owns": [], + "search": { + "method": "url_pattern", + "url": "https://nuwber.com/", + "fetch": "browser", + "match_signal": "result", + "antibot": "cloudflare", + "by": [ + "name", + "phone", + "address" + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://nuwber.com/removal/link", + "requires": { + "profile_url": true, + "email_verification": true, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": [ + "contact_email", + "profile_url" + ], + "notes": "People-search. Opt-out: submit the profile URL + email at /removal/link, confirm via the emailed link.", + "quirks": [ + "Opt-out URL is the documented public endpoint; datacenter IPs get 403 (anti-bot), so confirm the live flow via the operator's residential browser before the first submission, then set last_verified.", + "Needs the confirmed profile_url (paste the listing URL you recorded).", + "Email verification required." + ], + "est_processing_days": 3, + "reappearance_risk": "medium" + }, + "last_verified": null, + "source": "curated", + "confidence": "documented" +} diff --git a/optional-skills/security/unbroker/references/brokers/peekyou.json b/optional-skills/security/unbroker/references/brokers/peekyou.json new file mode 100644 index 000000000..0c46810dc --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/peekyou.json @@ -0,0 +1,53 @@ +{ + "id": "peekyou", + "name": "PeekYou", + "category": "people_search", + "priority": "high", + "jurisdictions": [ + "US" + ], + "parent": "peekyou", + "owns": [], + "search": { + "method": "url_pattern", + "url": "https://www.peekyou.com/", + "fetch": "browser", + "match_signal": "result", + "antibot": "cloudflare", + "by": [ + "name", + "phone", + "address" + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://www.peekyou.com/about/contact/optout", + "requires": { + "profile_url": true, + "email_verification": true, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": [ + "full_name", + "contact_email", + "profile_url" + ], + "notes": "Aggregates social/web profiles. Opt-out: paste your PeekYou profile URL(s), pick a reason, provide email, confirm the link.", + "quirks": [ + "Opt-out URL is the documented public endpoint; datacenter IPs get 403 (anti-bot), so confirm the live flow via the operator's residential browser before the first submission, then set last_verified.", + "Needs the confirmed PeekYou profile_url.", + "Email verification required." + ], + "est_processing_days": 7, + "reappearance_risk": "medium" + }, + "last_verified": null, + "source": "curated", + "confidence": "documented" +} diff --git a/optional-skills/security/unbroker/references/brokers/peoplefinders.json b/optional-skills/security/unbroker/references/brokers/peoplefinders.json new file mode 100644 index 000000000..6187f0c14 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/peoplefinders.json @@ -0,0 +1,53 @@ +{ + "id": "peoplefinders", + "name": "PeopleFinders", + "category": "people_search", + "priority": "high", + "jurisdictions": [ + "US" + ], + "parent": "peoplefinders", + "owns": [], + "search": { + "method": "url_pattern", + "url": "https://www.peoplefinders.com/", + "fetch": "browser", + "match_signal": "result", + "antibot": "cloudflare", + "by": [ + "name", + "phone", + "address" + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://www.peoplefinders.com/opt-out", + "requires": { + "profile_url": true, + "email_verification": true, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": [ + "full_name", + "contact_email", + "profile_url" + ], + "notes": "Standalone people-search (Confi-Chek family). Opt-out: find the listing, submit with a contact email, confirm via the emailed link.", + "quirks": [ + "Opt-out URL is the documented public endpoint; datacenter IPs get 403 (anti-bot), so confirm the live flow via the operator's residential browser before the first submission, then set last_verified.", + "Needs the confirmed profile_url from evidence.", + "Email verification: poll-verification picks up the link; open it in the agent browser." + ], + "est_processing_days": 7, + "reappearance_risk": "medium" + }, + "last_verified": null, + "source": "curated", + "confidence": "documented" +} diff --git a/optional-skills/security/unbroker/references/brokers/radaris.json b/optional-skills/security/unbroker/references/brokers/radaris.json new file mode 100644 index 000000000..dbfb29a9a --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/radaris.json @@ -0,0 +1,58 @@ +{ + "id": "radaris", + "name": "Radaris", + "category": "people_search", + "priority": "crucial", + "jurisdictions": [ + "US" + ], + "search": { + "method": "url_pattern", + "url": "https://radaris.com/", + "fetch": "web_extract", + "match_signal": "View Profile", + "by": [ + "name", + "phone", + "address" + ], + "url_patterns": { + "name": "https://radaris.com/p/{First}/{Last}/" + }, + "url_format_quirks": [ + "Name profile page: /p/{First}/{Last}/ with First/Last Capitalized and a TRAILING slash, e.g. /p/Jane/Public/ . Readable via web_extract (no hard bot gate as of 2026-06-30).", + "The page aggregates: a 'phone numbers & home addresses' table (the DIRECT hit for the subject), a relatives/namesakes carousel ('Review the potential relatives'), and resume/CV records. The subject's removable row is in the address table; the carousel entries are OTHER people - disambiguate by address/age before acting.", + "Page is noisy with testimonials/reviews boilerplate; the signal blocks are 'phone numbers & home addresses N' and 'resumes & CV records N'." + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://radaris.com/control-privacy", + "requires": { + "profile_url": true, + "email_verification": true, + "captcha": true, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": [ + "profile_url", + "contact_email" + ], + "notes": "Multi-step control-privacy wizard: step 1 NEXT -> step 2 'identify your personal page' (paste the NUMBERED profile URL into the 'Or Enter URL of your page' field; typing reveals a NEXT submit button) -> then user_email + Google reCAPTCHA -> emailed verification link. If there is no View Profile button for the subject, email customer-service@radaris.com and reply to the auto-response until removed.", + "email": "customer-service@radaris.com", + "quirks": [ + "CAPTCHA: the form carries a Google reCAPTCHA (hidden field g-recaptcha-response) plus anti-bot fingerprint tokens (jfp, token). Tier is T2 without a captcha-clearing browser backend (T1 with Browserbase). (Record previously mis-declared captcha:false.)", + "The /control-privacy form REQUIRES the per-person NUMBERED profile URL. Pasting the aggregate /p/{First}/{Last}/ URL is rejected with the validation error: 'The URL must include unique number at the end'. The real removable URL looks like https://{region}.radaris.com/person/~First-Last/1234567890 (see the field placeholder).", + "The subject's own record may appear ONLY as a static row in the 'phone numbers & home addresses' table with NO 'View Profile' link, so no numbered profile URL is exposed for them (the /p/{First}/{Last}/ page deep-links only to relatives/namesakes via JS onclick, not static hrefs). When that happens the /control-privacy form cannot be used -- do NOT fabricate or submit a relative's or namesake's profile URL. Fall back to email: write customer-service@radaris.com with the subject's own listed details and request removal, replying to the auto-response until confirmed.", + "Pressing Enter in the URL field reloads the wizard to step 1 (does not submit); type into the field and click the revealed NEXT button instead." + ], + "est_processing_days": 14, + "reappearance_risk": "high" + }, + "last_verified": "2026-06-30", + "source": "BADBOOL" +} diff --git a/optional-skills/security/unbroker/references/brokers/searchpeoplefree.json b/optional-skills/security/unbroker/references/brokers/searchpeoplefree.json new file mode 100644 index 000000000..47be96535 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/searchpeoplefree.json @@ -0,0 +1,53 @@ +{ + "id": "searchpeoplefree", + "name": "SearchPeopleFree", + "category": "people_search", + "priority": "high", + "jurisdictions": [ + "US" + ], + "parent": "searchpeoplefree", + "owns": [], + "search": { + "method": "url_pattern", + "url": "https://www.searchpeoplefree.com/", + "fetch": "browser", + "match_signal": "result", + "antibot": "cloudflare", + "by": [ + "name", + "phone", + "address" + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://www.searchpeoplefree.com/opt-out", + "requires": { + "profile_url": true, + "email_verification": true, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": [ + "full_name", + "contact_email", + "profile_url" + ], + "notes": "Free people-search. Opt-out: find the listing, submit with an email, confirm the link.", + "quirks": [ + "Opt-out URL is the documented public endpoint; datacenter IPs get 403 (anti-bot), so confirm the live flow via the operator's residential browser before the first submission, then set last_verified.", + "Needs the confirmed profile_url.", + "Email verification required." + ], + "est_processing_days": 3, + "reappearance_risk": "medium" + }, + "last_verified": null, + "source": "curated", + "confidence": "documented" +} diff --git a/optional-skills/security/unbroker/references/brokers/spokeo.json b/optional-skills/security/unbroker/references/brokers/spokeo.json new file mode 100644 index 000000000..d63c0f101 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/spokeo.json @@ -0,0 +1,56 @@ +{ + "id": "spokeo", + "name": "Spokeo", + "category": "people_search", + "priority": "crucial", + "jurisdictions": ["US"], + "parent": "spokeo", + "owns": ["freepeopledirectory"], + "search": { + "method": "url_pattern", + "url": "https://www.spokeo.com/search", + "fetch": "browser", + "match_signal": "profile", + "by": ["name", "phone", "email", "address"] + }, + "optout": { + "tier": "T1", + "method": "web_form", + "url": "https://www.spokeo.com/optout", + "email": "privacy@spokeo.com", + "requires": { + "profile_url": true, + "email_verification": true, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": ["profile_url", "contact_email"], + "deletion": { + "via": "email_followup", + "email": "privacy@spokeo.com", + "kinds": ["ccpa", "generic"], + "notes": "privacy@spokeo.com is the documented direct privacy contact (verified live on /optout 2026-07-01). Use for full CCPA deletion beyond listing opt-out, for listings the form rejects, and when more listings keep surfacing." + }, + "playbook": [ + "Opt-out form at spokeo.com/optout -- clears FreePeopleDirectory. Inputs: the confirmed profile URL + contact email; the form emails a confirmation link (poll-verification picks it up; open it in the agent's own browser).", + "EVERY LISTING SEPARATELY: 'you may have multiple listings on Spokeo. Each one is identified by a unique URL and must be opted out individually' (their own wording). Run ALL search vectors first, collect every listing URL, and submit one opt-out per URL.", + "Fast: requests process in 24-48 hours per their page -- re-scan after 2 days and record the real outcome.", + "FULL DELETION follow-up: send-email --kind ccpa (CA) / generic to privacy@spokeo.com naming all listing URLs -- covers data retained beyond the free-search suppression.", + "Paid/account data may be retained even when hidden from free search -- verify actual removal via re-scan; never mark confirmed_removed off the free-search view alone." + ], + "notes": "Form + privacy@spokeo.com verified live 2026-07-01. Their page: opting out does not remove data from original sources and listings may reappear as new public records arrive -- keep the reappearance re-scan scheduled.", + "quirks": [ + "Profile URL formats the form accepts: listing URL like spokeo.com/{First}-{Last}/{City}/{ST}/p{id} or a purchase URL spokeo.com/purchase?q=... (examples shown on /optout).", + "Multiple listings per person are NORMAL (one per name x location x record cluster); each unique URL must be opted out individually -- feed every found listing URL through the form.", + "Processing is 24-48h ('depending on the nature of your request and the amount of data').", + "Paid accounts may retain data even when hidden from free search - verify actual removal, don't mark confirmed_removed off the free-search view alone." + ], + "est_processing_days": 2, + "reappearance_risk": "medium" + }, + "last_verified": "2026-07-01", + "source": "BADBOOL" +} diff --git a/optional-skills/security/unbroker/references/brokers/thatsthem.json b/optional-skills/security/unbroker/references/brokers/thatsthem.json new file mode 100644 index 000000000..dd6113313 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/thatsthem.json @@ -0,0 +1,46 @@ +{ + "id": "thatsthem", + "name": "That's Them", + "category": "people_search", + "priority": "crucial", + "jurisdictions": ["US"], + "search": { + "method": "url_pattern", + "url": "https://thatsthem.com/", + "fetch": "browser", + "match_signal": "result", + "by": ["name", "phone", "email", "address"], + "url_patterns": { + "name": "https://thatsthem.com/name/{First}-{Last}/{City}-{ST}", + "phone": "https://thatsthem.com/phone/{areacode}-{prefix}-{line}", + "email": "https://thatsthem.com/email/{email}", + "address": "https://thatsthem.com/address/{Street}-{City}-{ST}-{ZIP}" + }, + "url_format_quirks": [ + "ADDRESS path is fully hyphen-joined and joins street+city+state+ZIP with hyphens (e.g. /address/123-Main-St-Anytown-NY-12345) and REQUIRES the ZIP. The older slash form (/address/Street/City-ST) and any ZIP-less form 404.", + "NAME and PHONE and EMAIL paths use a slash before city/state and do NOT need a ZIP: /name/First-Last/City-ST , /phone/AAA-PPP-LLLL , /email/addr@host.", + "Street abbreviations are kept verbatim (Ave, Pl, St) - do NOT expand to Avenue/Place/Street; expanding 404s.", + "A 404 on a constructed URL means WRONG PATTERN, not 'no record present'. Treat as INCONCLUSIVE: fall back to the on-site search box (browser_type into the address/name field + submit) and read the resulting canonical URL." + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://thatsthem.com/optout", + "requires": { + "profile_url": false, + "email_verification": false, + "captcha": true, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": ["full_name", "street", "city", "state", "postal", "contact_email", "phone"], + "notes": "Opt-out form is gated by a Cloudflare Turnstile CAPTCHA (so tier is T2 without a captcha-clearing browser backend; T1 with Browserbase). All 7 fields are marked required by the form (Full Name, Street Address, City, State, ZIP, Email, Phone). Site sends a confirmation email and states ~72h processing (this is a completion notice, not a click-to-verify link). Least-disclosure tension: the form DEMANDS email+phone even though a public record may show less - disclose only to remove a record that is actually about the subject. Do not click the Spokeo identity-theft-protection link (paid product).", + "est_processing_days": 3, + "reappearance_risk": "low" + }, + "last_verified": "2026-06-30", + "source": "BADBOOL" +} diff --git a/optional-skills/security/unbroker/references/brokers/truepeoplesearch.json b/optional-skills/security/unbroker/references/brokers/truepeoplesearch.json new file mode 100644 index 000000000..0523fdab1 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/truepeoplesearch.json @@ -0,0 +1,43 @@ +{ + "id": "truepeoplesearch", + "name": "TruePeopleSearch", + "category": "people_search", + "priority": "high", + "jurisdictions": ["US"], + "search": { + "method": "url_pattern", + "url": "https://www.truepeoplesearch.com/", + "fetch": "browser", + "antibot": "datadome", + "match_signal": "result", + "by": ["name", "phone", "address", "email"], + "url_patterns": { + "name": "https://www.truepeoplesearch.com/results?name={First%20Last}&citystatezip={City,%20ST}" + }, + "url_format_quirks": [ + "Search results URL is QUERY-PARAM, not path: /results?name=Jane%20Public&citystatezip=Anytown,%20NY (space-encoded; comma between city and state). Confirmed as the canonical form the site's own search box generates.", + "On-site search tabs: Name / Phone / Address / Email / Neighbors (so name-, phone-, address-, and email-searchable).", + "HARD-BLOCKED for automated reads (2026-06-30): Cloudflare 'Just a moment...' interstitial -> DataDome device-check CAPTCHA (geo.captcha-delivery.com) on every results navigation. Page chrome (header/footer) may render while the result body stays blocked; submitting any search bounces to DataDome. web_extract/Firecrawl 504-timed out. Needs a residential-proxy/stealth browser (e.g. Browserbase) to scan; otherwise record 'blocked'." + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://www.truepeoplesearch.com/removal", + "requires": { + "profile_url": false, + "email_verification": true, + "captcha": true, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": ["full_name", "contact_email"], + "notes": "Removal page renders even when results are blocked. Flow: name+email+captcha -> emailed link -> fill opt-out form matching the record -> confirmation ('allow 3 days'). Fields: dropdown 'Exercise my rights as a: The subject of the request / An authorized agent of the subject', First Name*, Middle Name, Last Name*, Email Address*, consent checkbox. CAPTCHA-gated: hCaptcha ('I am human'). Contact support@truepeoplesearch.com; PO Box 7775 PMB 29296, San Francisco CA 94120-7775. Verified read-only 2026-06-30; not submitted. (Record previously mis-declared email_verification:false.)", + "est_processing_days": 3, + "reappearance_risk": "high" + }, + "last_verified": "2026-06-30", + "source": "BADBOOL" +} diff --git a/optional-skills/security/unbroker/references/brokers/usphonebook.json b/optional-skills/security/unbroker/references/brokers/usphonebook.json new file mode 100644 index 000000000..ff1d0082b --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/usphonebook.json @@ -0,0 +1,53 @@ +{ + "id": "usphonebook", + "name": "USPhoneBook", + "category": "people_search", + "priority": "high", + "jurisdictions": [ + "US" + ], + "parent": "usphonebook", + "owns": [], + "search": { + "method": "url_pattern", + "url": "https://www.usphonebook.com/", + "fetch": "browser", + "match_signal": "result", + "antibot": "cloudflare", + "by": [ + "name", + "phone", + "address" + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://www.usphonebook.com/opt-out", + "requires": { + "profile_url": true, + "email_verification": true, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": [ + "full_name", + "contact_email", + "profile_url" + ], + "notes": "Reverse-phone + people-search. Opt-out: paste the listing URL, provide an email, confirm via the emailed link.", + "quirks": [ + "Opt-out URL is the documented public endpoint; datacenter IPs get 403 (anti-bot), so confirm the live flow via the operator's residential browser before the first submission, then set last_verified.", + "Needs the confirmed profile_url.", + "Email verification required." + ], + "est_processing_days": 3, + "reappearance_risk": "medium" + }, + "last_verified": null, + "source": "curated", + "confidence": "documented" +} diff --git a/optional-skills/security/unbroker/references/brokers/whitepages.json b/optional-skills/security/unbroker/references/brokers/whitepages.json new file mode 100644 index 000000000..ddc6a0362 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/whitepages.json @@ -0,0 +1,57 @@ +{ + "id": "whitepages", + "name": "Whitepages", + "category": "people_search", + "priority": "crucial", + "jurisdictions": ["US"], + "parent": "whitepages", + "owns": ["411"], + "search": { + "method": "url_pattern", + "url": "https://www.whitepages.com/", + "fetch": "browser", + "match_signal": "listing", + "by": ["name", "phone", "address"] + }, + "optout": { + "tier": "T1", + "method": "email", + "url": "https://www.whitepages.com/suppression_requests", + "email": "privacyrequest@whitepages.com", + "requires": { + "profile_url": true, + "email_verification": true, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": ["full_name", "contact_email", "profile_url"], + "deletion": { + "via": "email", + "email": "privacyrequest@whitepages.com", + "url": "https://whitepagesprivacy.zendesk.com/hc/en-us/requests/new", + "kinds": ["ccpa", "generic"], + "notes": "privacyrequest@whitepages.com handles BOTH opt-out (removal from the site) and CCPA deletion requests, explicitly offered for people who do not want to provide a phone number for the automated tool. ~2 business day reply; opt-outs processed within 15 days. Verified from whitepages.com/privacy/consumer-rights 2026-07-01 (page dated 2026-06-22)." + }, + "playbook": [ + "EMAIL LANE (fully autonomous -- use this): send the removal + deletion request to privacyrequest@whitepages.com including the confirmed listing URL. This is Whitepages' own documented alternative 'if you would prefer not to provide a phone number'. Expect a reply within ~2 business days; they may ask identity-verification questions (name, email) -- answer with least-disclosure, never an ID number.", + "Include in the email: the listing URL(s), the subject's full name as listed, and the request to (a) remove the listing(s), (b) opt out of sale/sharing, and (c) delete personal data (CCPA 1798.105 for CA residents; they honor requests from other states per their consumer-rights page).", + "'Once a listing is removed, all known connected listings are also removed and the requester's information will not be sold by Whitepages in any capacity' -- one request covers connected listings; still re-scan afterward, and check Whitepages Premium + 411.com separately.", + "Alternative 1: webform at whitepagesprivacy.zendesk.com/hc/en-us/requests/new (same ~2-day handling; good fallback if the mailbox bounces).", + "Alternative 2 (only with an operator on the phone): the automated tool at whitepages.com/suppression_requests -- paste the listing URL, provide a phone number, answer the automated voice call and enter the 4-digit code. Fastest (est 1 day) but NOT autonomous.", + "Opt-out requests may take up to 15 days; verify with a re-scan before recording confirmed_removed." + ], + "notes": "Email/webform lane verified 2026-07-01: privacyrequest@whitepages.com or the Zendesk form replace the phone-callback tool ('if you would prefer not to provide a phone number... submit a request to a customer service agent'). Authorized agents: written signed permission required. General privacy contact: support@whitepages.com.", + "quirks": [ + "The automated suppression tool (whitepages.com/suppression_requests) REQUIRES a phone number + automated voice call with a 4-digit code + agreeing to their ToS -- that lane is phone_callback/T2. The email/webform lane exists precisely to avoid it; prefer email for autonomy.", + "Deletion exceptions they state: public records (property, court), fraud-prevention data, active-subscription data, legal holds. 'Hidden from search' vs 'deleted' distinction applies -- their opt-out removes the listing; the CCPA deletion covers non-public account data.", + "CCPA opt-out requests: up to 15 days to process. Right-to-know/access requests also via privacyrequest@whitepages.com or the Zendesk form." + ], + "est_processing_days": 15, + "reappearance_risk": "medium" + }, + "last_verified": "2026-07-01", + "source": "BADBOOL" +} diff --git a/optional-skills/security/unbroker/references/legal/ccpa.md b/optional-skills/security/unbroker/references/legal/ccpa.md new file mode 100644 index 000000000..475a7ce01 --- /dev/null +++ b/optional-skills/security/unbroker/references/legal/ccpa.md @@ -0,0 +1,27 @@ +# CCPA / CPRA (California) + +Use for California residents (`residency_jurisdiction` starts with `US-CA`) and, in practice, many US +brokers that honor CCPA-style requests nationwide. + +## Rights invoked + +- **Delete** personal information (Cal. Civ. Code 1798.105). +- **Opt out** of sale/sharing of personal information (1798.120). + +## Request content + +Render with `legal.render_request("ccpa", broker, fields)` -> `templates/emails/ccpa-deletion.txt`. +Include only: full legal name, the contact email for correspondence, and the confirmed listing +URL(s). Do **not** include SSN or government IDs. + +## Authorized agent + +When acting for another consenting subject, use `render_request("ccpa_agent", ...)` +(`templates/emails/ccpa-authorized-agent.txt`) and attach the authorization artifact recorded in the +dossier (`consent.authorization_artifact`). The broker may separately verify the consumer's identity. + +## Notes + +- Brokers must respond within 45 days (extendable). Track as `awaiting_processing` until confirmed. +- "Hidden from free search" is not deletion - verify the record is actually gone before + `confirmed_removed`. diff --git a/optional-skills/security/unbroker/references/legal/drop.md b/optional-skills/security/unbroker/references/legal/drop.md new file mode 100644 index 000000000..3b96333fc --- /dev/null +++ b/optional-skills/security/unbroker/references/legal/drop.md @@ -0,0 +1,34 @@ +# California DROP portal (highest-leverage lever) + +The California **Delete Request and Opt-out Platform** (`privacy.ca.gov/drop`) lets a California +resident demand deletion from **every registered data broker** with a single verified request, for +free. DROP is **live** (as of 2026); registered brokers must begin processing requests on +**2026-08-01**. The registered universe is the **California Data Broker Registry** (~545 brokers in +2025), which this skill ingests as its own coverage lane (`pdd.py registry`); one DROP request covers +all of them, which is how this skill reaches (and exceeds) the breadth of commercial services. + +## When to use + +For any subject with `residency_jurisdiction` starting `US-CA`, sequence DROP **first**: `pdd.py next` +surfaces a single `drop_submit` action covering the whole registry. Then handle the individual +people-search sites (which are also worked directly because they hold free, indexed listings). After +filing, run `pdd.py drop --filed` so the loop stops re-surfacing it. For non-CA subjects +DROP does not apply; cover the registry brokers with targeted CCPA/GDPR deletion emails +(`pdd.py registry --search`, then `pdd.py send-email`). + +## Flow (agent-assisted, mostly human verification) + +1. The operator creates/verifies a DROP account (identity verification is required by the state; this + is a human step - `human_task_queued`). +2. Submit one deletion request covering all registered brokers. +3. Record a single ledger case `case__drop` to track it; mark `submitted` -> + `awaiting_processing`. Registered brokers must process deletions on the state's schedule. +4. After the DROP cycle, re-scan the people-search long tail and only act on sites still showing data. + +## Caveats + +- DROP covers **registered data brokers**, not every people-search site. Keep doing the individual + opt-outs for non-registered sites. +- Identity verification means parts of this cannot (and should not) be fully automated. +- FCRA-regulated brokers (flagged in the registry, `optout.fcra`) hold consumer-report data with + separate rules; deletion may be limited and a dispute or security-freeze may apply instead. diff --git a/optional-skills/security/unbroker/references/legal/gdpr.md b/optional-skills/security/unbroker/references/legal/gdpr.md new file mode 100644 index 000000000..d00d54693 --- /dev/null +++ b/optional-skills/security/unbroker/references/legal/gdpr.md @@ -0,0 +1,20 @@ +# GDPR / UK-GDPR (roadmap - Phase 3) + +For EU/UK subjects. Not part of the P0 US-first scope; templates and routing land in Phase 3. + +## Rights invoked + +- **Erasure** ("right to be forgotten") - Article 17. +- **Object** to processing - Article 21. + +## Request content + +Render with `legal.render_request("gdpr", broker, fields)` -> +`templates/emails/gdpr-erasure.txt`. Address the controller's privacy/DPO contact. Include the data +subject's name, the contact email, and the listing URL(s); cite Article 17. + +## Notes + +- Controllers must respond within one month (Article 12(3)). +- EU-specific brokers and portals (e.g. Acxiom's EU consumer portals) are added in Phase 3 with + `jurisdictions: ["EU"]` records and residency-aware routing. diff --git a/optional-skills/security/unbroker/references/methods.md b/optional-skills/security/unbroker/references/methods.md new file mode 100644 index 000000000..6e25f0a7b --- /dev/null +++ b/optional-skills/security/unbroker/references/methods.md @@ -0,0 +1,235 @@ +# Opt-out method playbooks + +How the agent executes each broker `optout.method` using native Hermes tools. Always obey the +**verify-before-disclose** rule: confirm a real listing exists, then submit only the fields the broker +requires (`pdd.py plan` lists them per broker). + +**Autonomy:** `pdd.py next ` sequences all of this - it decides which method applies, orders +parents first, and routes human-only work to the digest. In `autonomy=full` (default), execute its +actions without pausing per submission; the consent recorded at intake is the authorization. These +playbooks are the HOW for each action type. + +## Scan ladder (all methods) + +Confirm exposure before acting, cheapest first. Run **every** `search_vectors` entry from `pdd.py +plan` (each name x location, phone, email, and address the broker's `search.by` supports) - different +vectors surface different listings for the same person; dedupe found URLs. + +1. `web_extract` on the broker `search.url` (fast HTML -> markdown). Look for `search.match_signal`. + Build per-vector URLs from `search.url_patterns` and heed `search.url_format_quirks` (see below). +1b. **`site:` search-engine probe (cheap, do it early and in parallel).** `web_search` with + `site: "First Last"` (add a city/ZIP or a unique phone/address to cut namesake + noise) often returns the **exact profile-slug URL** in one shot - which both confirms the listing + exists AND hands you the opaque `/find/person/` or `/p/` URL you'd otherwise have to + derive. Two big wins seen in the field: (a) it disambiguates namesakes fast - the SERP snippet + shows age/city so you can tell the subject from a same-name relative before fetching anything; and + (b) a broad `"First Last" ` search (no `site:`) surfaces **brokers not yet in + your DB** (e.g. information.com, peoplefinders.com) - record those as bonus exposures. Note: empty + `site:` results are INCONCLUSIVE (many broker pages aren't indexed / are `noindex`), not `not_found`. +2. If the page is JS-rendered or returns nothing useful, `browser_navigate` + `browser_snapshot` + (and `browser_type`/`browser_click` to run the site's search box). +3. If blocked by stealth/Cloudflare, use the `scrapling` skill via `terminal`. **If the broker record + has `search.antibot` set (e.g. `datadome`), results are behind a device-check CAPTCHA**: a + cloud/stealth browser (Browserbase) or `scrapling` may get through; if none is available, do **not** + burn attempts - `pdd.py record blocked` and move on (a re-scan with a stealth + backend can pick it up later). +3b. **Operator-browser path (the reliable unblock for anti-bot sites).** Cloudflare/DataDome key on + datacenter IPs + headless fingerprints, so `web_extract`, the proxyless agent browser, and even a + cloud browser often fail - but the **operator's own everyday browser (residential IP, real + fingerprint) sails straight through**. For any `blocked` site, hand the operator a paste-ready + search URL (built from `search.url_patterns`), give them the identity anchors to judge by (current + + prior addresses, age, a distinguishing detail) and the namesake/relative watch-list, and ask for + the verdict or a screenshot (the agent can read screenshots). This is a **first-class scan path, not + a fallback** - treat the operator's live check as authoritative and record the real verdict + (`found` / `not_found` / `indirect_exposure`), citing `scanned_via: operator_browser`. Same for + opt-out forms the agent's browser can't reach: guide the operator field-by-field (least-disclosure), + pausing before submit. (This is exactly why the same trick clears email-verification links the agent + can't open - see the Verification loop.) +4. Capture evidence: save listing URLs and a `browser` screenshot into the subject's `evidence/` dir, + then `pdd.py record found --found true --evidence '{"listing_urls":[...]}'`. + +If a listing genuinely does not exist: `pdd.py record not_found` and move on. + +### A 404 (or empty body) is INCONCLUSIVE, not "not_found" + +A constructed search URL that 404s almost always means the **URL pattern is wrong**, not that the +person is absent. Never record `not_found` off a 404. Instead: + 1. Re-check the broker's `search.url_patterns` / `url_format_quirks` and rebuild the URL. + 2. Fall back to the **on-site search box**: `browser_navigate` to the search page, `browser_type` + the raw query, `browser_click` Search, then read the **canonical result URL** the site lands on. + 3. Only after the site's own search returns an empty result set do you record `not_found`. + 4. If a pattern was wrong, fix it in `references/brokers/.json` (`url_patterns` + + `url_format_quirks`) so the next run is correct - see the rule below. + +### Log URL/format quirks for every site you scrape + +Whenever you discover how a broker's URLs are actually shaped (path layout, hyphen-vs-slash joins, +whether ZIP is required, abbreviation handling, query-param search, anti-bot gating), record it in +that broker's `references/brokers/.json` under `search.url_patterns` (the templates) and +`search.url_format_quirks` (the gotchas, including which forms 404). Bump `last_verified`. This makes +the deterministic URL path reliable across runs and subjects instead of rediscovered each time. If the +opt-out form's real requirements differ from the record (extra required fields, a CAPTCHA, an account), +fix `optout.requires` / `optout.inputs` / `optout.tier` too - those drive tier selection and +least-disclosure. Log opt-out mechanics gotchas (a broker that needs a profile URL but doesn't expose +one for the subject, an email-only fallback, an authorized-agent toggle) in `optout.quirks` - the +planner surfaces these as `optout_quirks` per broker. Example: Radaris sometimes shows the subject only +as a static address-table row with no "View Profile" link, so `/control-privacy` (which needs a profile +URL) can't be used - fall back to `optout.email` rather than submitting a namesake's URL. + +### Distinguish the subject from namesakes and relatives + +People-search sites are dense with namesakes and family clusters. Before recording `found`, confirm the +record is the **subject themselves** (corroborate via DOB, a known current/prior address, or the +identifier you searched). Two non-removable patterns to record as evidence but NOT as the subject's own +listing: + - **Namesake:** same name, different person (different DOB/location with no overlap). Not the subject. + - **Relative record:** the listing is about a *different* person (a relative) and merely *names* the + subject in a "Family" field, or carries the subject's email/phone as a secondary datum. This is a + third party's record - the consent gate correctly blocks acting on it. See "Indirect exposure" in + the web_form section for what the subject *can* still request. + +## web_form + +1. `browser_navigate` to `optout.url`; `browser_snapshot` to read the form. +2. Fill only the planned `disclosure_fields` with `browser_type`/`browser_click`; for `profile_url`, + paste the confirmed listing URL from evidence. +3. Submit; `browser_snapshot` to confirm the success state; screenshot to `evidence/`. +4. `pdd.py record submitted --disclosed --disclosed --channel web_form`. +5. If the broker requires email verification, follow **Verification loop** below. + +### Indirect exposure (named as a relative / your email on someone else's record) + +You asked the right question: if a broker lists a *relative* and names you in their "Family" field, or +shows **your** email/phone on **their** record, that IS personal information about you - even though the +record's primary subject is a third party. Resolve it in two distinct lanes: + +- **The self-service opt-out form does NOT cover this.** That form removes a record whose *primary + subject* is you. It has no notion of "scrub my identifiers from this other person's record," and + submitting it with the relative's address to force a match would be (a) disclosing data the listing + doesn't tie to you and (b) acting on a third party's record. Don't. The consent gate exists to stop + exactly that. +- **What you CAN do - a targeted "delete my personal information" request (CCPA 1798.105 / GDPR Art.17).** + These rights attach to *your* personal information *wherever the business holds it*, including as a + data point on another person's profile. So the subject may email the broker's privacy address and + request suppression of **their own specific identifiers** (this email address, this phone number, my + name in family/relative associations), citing the relative listings as the locations. This is a + narrower request than a full opt-out and does not require the relative's consent - you are only asking + them to delete data about *you*. Use `render-email` with the `ccpa`/`gdpr` template, list only the + subject's own identifiers + the URLs where they appear, and record it as a normal `submitted` → + `awaiting_processing` email case. Verify by re-scanning those identifier vectors (email/phone) after + the statutory window - `confirmed_removed` only when the subject's identifier no longer appears. +- **Caveat:** the broker may decline to alter a third party's record beyond removing your specific + identifiers, and "your name in a family graph" can be derived from public records they'll re-list. + Note residual exposure in the report rather than marking a clean removal. (Operational guidance, not + legal advice.) + +## email + +`pdd.py send-email --listing [--kind ccpa|gdpr|ccpa_indirect]` always does +the deterministic parts (recipient locked to an address the broker record declares, refusing anything +else; `--listing` mandatory; records `submitted`, logs disclosure, stamps `next_recheck_at`). How it +actually sends depends on `email_mode`: + +1. **browser mode (no password, autonomous):** the command returns a recipient-locked `compose` + payload (`to`/`subject`/`body`). Compose a NEW message in the operator's **logged-in webmail** via + `browser_*` (paste `compose.body` exactly, disclosing nothing beyond it) and send. No credentials + stored. Requires the inbox signed in in the browser Hermes uses. +2. **programmatic mode (SMTP creds):** the command SMTP-sends it directly, no human. +3. **draft_only fallback:** `pdd.py render-email --listing `; a digest entry + tells the operator to send it, and the agent records `submitted --channel email` afterward. + +Then follow the **Verification loop** if the broker emails a confirmation link. + +## Verification loop (email_verification brokers) + +- **browser mode (autonomous, no password):** open the broker's confirmation email in the operator's + webmail (`browser_*`), then `pdd.py verify-link --text ''` returns + the anti-phishing-scored link. `browser_navigate` it **in the same browser** (several brokers, e.g. + PeopleConnect, bind the session to the browser that opens the link), finish the flow, record + `awaiting_processing`. +- **programmatic mode (IMAP):** `pdd.py poll-verification ` polls IMAP for every in-flight + case, extracts the link (anti-phishing scored: only opt-out-looking links on the broker's own + domains), and auto-advances `submitted → verification_pending`. Then `browser_navigate` the link in + the agent's own browser, finish the flow, record `awaiting_processing`. +- **draft_only:** the digest tells the operator to click the link in the subject's inbox; the agent + records `awaiting_processing` on their word. +- Either way, the due queue (`pdd.py due`) brings the case back after the broker's processing window + for the verifying re-scan; only that re-scan justifies `confirmed_removed`. + +## phone_callback (e.g. Whitepages) + +Submit the web form, then the site places an automated call with a numeric code. If the operator is +available to read the code, capture it and complete the form (T2). Otherwise queue a human task. + +## phone (voice menu) / fax / mail / gov_id -> human task (T3) + +Do **not** attempt to automate. Create a `todo` task and `pdd.py record +human_task_queued` with exact instructions and an explicit **withhold** list (never SSN; never a +driver's-license number unless the subject chooses to and crosses out the ID number). Capture the +confirmation reference back into the ledger when the operator completes it. + +## captcha + +**Default: soft/managed CAPTCHAs clear automatically.** The recommended baseline backend is the +Browserbase cloud browser (`setup --auto` selects it when `BROWSERBASE_API_KEY` is set). Being a +real browser on a residential IP, it passes managed challenges - Cloudflare Turnstile, hCaptcha / +reCAPTCHA checkbox - as normal operation, so those brokers stay T1 and you just proceed. This is +**not** CAPTCHA solving: no solver service, no fingerprint spoofing. + +Only a **hard** challenge the browser genuinely can't pass (interactive image grids, behavioral +scoring that flags the session) becomes a fallback: `record ... blocked` and requeue it for the +stealth/operator-browser pass (`methods.md` → scan ladder 3b - the operator's own residential +browser is the reliable unblock). Without a cloud browser configured, soft-CAPTCHA brokers drop to +T2 and become human tasks. **Never use a third-party CAPTCHA-defeating service.** + +## Ownership clusters - DO PARENTS FIRST (playbooks live in the broker records) + +Many brokers are resold shells of a few parents, so **one parent removal clears a whole cluster of +children** (see `owns` in each record). In Phase 2 you MUST work the cluster **parents first**, then +the standalone listings - doing a child before its parent wastes a submission the parent would have +covered. `pdd.py plan --batch` **orders the `found` group parents-first** and emits a +`parent_playbook` whose `steps` come verbatim from each record's **`optout.playbook`** - the single +source of truth, field-verified, updated as live runs discover mechanics. What follows is the +operating doctrine; the exact steps are in `references/brokers/.json`. + +**Deletion beats suppression, email lanes beat forms.** Each parent record carries a structured +`optout.deletion` lane (`via: in_flow | email | email_followup`, plus the privacy address). The +autopilot routes accordingly: + +- **`in_flow`** (PeopleConnect): the deletion control lives INSIDE the web flow - complete the flow + and use the **Right to Delete / DELETE MY USER DATA** control, never just the suppression step. +- **`via: email`** (Whitepages): the fully-autonomous lane - `send-email` the request (residency-picked + kind: CCPA for US-CA, GDPR for EU/UK, generic otherwise), then `poll-verification` for their reply + and answer identity questions with least-disclosure. This is also the **rescue lane**: any broker + whose form demands a phone-callback/gov-ID/account but that declares a deletion email gets routed + here instead of the human digest. +- **`email_followup`** (BeenVerified, Spokeo): the opt-out form is the fast primary (it clears the + listing), and the playbook then sends a right-to-delete email for full erasure beyond suppression. + +Verified parent facts (live-checked 2026-07-01; details + steps in the records): + +- **Intelius/PeopleConnect** (~15+ sites in one flow): portal entry asks only email + consent → + verify link is **session-bound to the browser that opens it** → guided-mode → **DELETE MY USER + DATA** at the bottom (suppression alone re-lists). Fallback `privacy@peopleconnect.us` - their own + published metrics: 33.5k deletion requests, median response < 1 day. +- **Whitepages**: `privacyrequest@whitepages.com` (or the Zendesk form) handles removal + CCPA + deletion **without the phone-callback tool** - that phone call is only required by the automated + tool. One removal also drops "all known connected listings". ≤15 days; check 411.com + Premium. +- **BeenVerified**: opt-out tool (footer "Do Not Sell" link → `/svc/optout/search/optouts`) + email + verification; one opt-out per email address. Then `privacy@beenverified.com` deletion follow-up - + controller is The Lifetime Value Co., so name their sister properties (NeighborWho, Ownerly, + NumberGuru, Bumper) in the same request, and verify each separately. +- **Spokeo**: form takes ONE listing URL at a time and **each listing must be opted out + individually** - collect every listing URL from all search vectors first, then submit one opt-out + per URL. 24-48h processing. `privacy@spokeo.com` for full deletion beyond free-search suppression. + +After each parent removal is confirmed, **re-scan its children** before submitting anything for them - +usually they drop out and need no separate opt-out. + +### Any other parent +A parent without a hand-verified `optout.playbook` gets synthesised steps from its structured record +(URL/email, `requires` flags, deletion lane, notes/quirks). Follow those, and **write what you learn +back into `references/brokers/.json`** (`optout.playbook`, `optout.deletion`, `quirks`, +`last_verified`) so the next run is exact - that file, not this one, is where per-broker knowledge +accrues. + diff --git a/optional-skills/security/unbroker/references/state-machine.md b/optional-skills/security/unbroker/references/state-machine.md new file mode 100644 index 000000000..feae5a3ef --- /dev/null +++ b/optional-skills/security/unbroker/references/state-machine.md @@ -0,0 +1,43 @@ +# Case state machine + +One case = one (subject x broker). `pdd.py record` validates every transition against this table and +appends it to `audit.jsonl`. Authoritative definition lives in `scripts/ledger.py`. + +## States + +| State | Meaning | +|---|---| +| `new` | Case created, nothing done | +| `searching` | Scan in progress | +| `not_found` | Subject not listed (will be re-checked next cycle) | +| `found` | Listing confirmed; action needed | +| `indirect_exposure` | Subject's PII (email/phone/name) appears on a **third party's** record (e.g. named in a relative's "Family" field). Not removable via self-service opt-out; needs a targeted CCPA/GDPR delete-my-PII request | +| `action_selected` | Tier/method chosen | +| `submitted` | Opt-out submitted | +| `verification_pending` | Awaiting email/callback verification | +| `awaiting_processing` | Submitted, no verification needed; broker processing | +| `confirmed_removed` | Verified gone | +| `reappeared` | Was removed, now listed again | +| `human_task_queued` | Needs an operator step (captcha/ID/phone/fax/mail) | +| `blocked` | Broker dead / mechanics broken -> flag for DB re-verification | + +## Allowed transitions + +``` +new -> searching | found | not_found | indirect_exposure | blocked +searching -> not_found | found | indirect_exposure | blocked +not_found -> searching | found | indirect_exposure | blocked +found -> action_selected | submitted | human_task_queued | indirect_exposure | blocked +indirect_exposure -> submitted | human_task_queued | not_found | found | blocked +action_selected -> submitted | human_task_queued | blocked +submitted -> verification_pending | awaiting_processing | human_task_queued | blocked +verification_pending -> confirmed_removed | human_task_queued | blocked +awaiting_processing -> confirmed_removed | human_task_queued | blocked +confirmed_removed -> reappeared | confirmed_removed (recheck refreshes the date) +reappeared -> found | indirect_exposure +human_task_queued -> found | indirect_exposure | action_selected | submitted | verification_pending + | awaiting_processing | confirmed_removed | blocked +blocked -> searching | found | not_found | indirect_exposure | action_selected +``` + +A transition to the same state is always allowed (idempotent field updates). diff --git a/optional-skills/security/unbroker/scripts/autopilot.py b/optional-skills/security/unbroker/scripts/autopilot.py new file mode 100644 index 000000000..0c900818a --- /dev/null +++ b/optional-skills/security/unbroker/scripts/autopilot.py @@ -0,0 +1,396 @@ +"""Autonomous action queue: what should the agent do RIGHT NOW for this subject? + +`next_actions` turns (dossier, broker DB, config, ledger) into an ordered queue of +concrete agent actions plus a human digest. The agent's whole run becomes a loop: + + while True: + q = pdd.py next + if not q["actions"]: break + execute each action, record outcomes + present q["human_digest"] once; schedule cron at q["next_wake_at"] + +Policy (cfg["autonomy"]): + full - intake consent is standing authorization; T0-T2 agent actions are + executed without pausing. Humans appear only in the digest. + assisted - same queue, but every submission action carries confirm_first=True. + +The queue is deterministic and side-effect free: it never mutates the ledger, it +only reads. Executing + recording stays with the agent (and the record command). +""" +from __future__ import annotations + +import datetime as _dt +import os +from pathlib import Path + +import brokers as brokers_mod +import emailer +import ledger as ledger_mod +import paths +import registry +import tiers + +CACHE_STALE_DAYS = 7 # refresh the live broker list after this +FANOUT_THRESHOLD = 8 # above this many unscanned brokers, use delegate_task fan-out + +# States with nothing left to do (absent a due recheck). +_TERMINAL = {"not_found", "confirmed_removed"} +_IN_FLIGHT = {"submitted", "verification_pending", "awaiting_processing"} + + +def cache_age_days(now: float | None = None) -> float | None: + """Age of the live BADBOOL cache in days, or None if never pulled.""" + p: Path = paths.brokers_cache_path() + if not p.exists(): + return None + now = now if now is not None else _dt.datetime.now().timestamp() + return max(0.0, (now - p.stat().st_mtime) / 86400.0) + + +def _now_iso() -> str: + return _dt.datetime.now(_dt.timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") + + +def _min_future_recheck(ledger: dict, at: str) -> str | None: + future = [c.get("next_recheck_at") for c in ledger.values() + if c.get("next_recheck_at") and c["next_recheck_at"] > at] + return min(future) if future else None + + +def _digest(broker_row: dict, reason: str, steps: list[str], prep: list[str] | None = None) -> dict: + return { + "broker_id": broker_row.get("broker_id"), + "broker_name": broker_row.get("broker_name"), + "reason": reason, + "agent_prep": prep or [], # commands the agent runs BEFORE handing this to the human + "steps": steps, # what the human actually does + "withhold": ["SSN", "full driver's-license / passport numbers"], + } + + +def request_kind(dossier: dict, allowed: list[str] | None = None) -> str: + """Pick the honest legal basis for a deletion request from the subject's residency. + + ccpa only for California residents, gdpr only for EU/UK residents, generic otherwise. + `allowed` (from the broker's deletion.kinds) can restrict DOWN to generic but never + upgrades to a law the subject can't truthfully claim. + """ + res = (dossier.get("residency_jurisdiction") or "US").upper() + if res.startswith("US-CA"): + kind = "ccpa" + elif res.startswith(("EU", "UK", "GB")): + kind = "gdpr" + else: + kind = "generic" + if allowed and kind not in allowed and "generic" in allowed: + kind = "generic" + return kind + + +_HUMAN_GATES = ("gov_id", "fax", "mail", "phone_voice", "phone_callback", "account") + + +def _email_lane(row: dict) -> tuple[str | None, str]: + """(address, why) for the autonomous email lane of this broker, if one exists. + + Lane rules: + 1. the broker's primary opt-out method IS email; + 2. the record marks its deletion lane email-preferred (deletion.via == "email"); + 3. RESCUE: the primary flow is human-gated (gov ID / fax / phone / account) but a + right-to-delete email exists - the email lane restores full autonomy (this is the + verified Whitepages pattern: privacyrequest@ accepts requests precisely so people + don't have to do the phone-callback tool). + """ + deletion = row.get("deletion") or {} + req = row.get("optout_requires") or {} + if row.get("method") == "email": + addr = row.get("optout_email") or deletion.get("email") + return (addr, "primary opt-out method is email") if addr else (None, "") + if deletion.get("via") == "email" and deletion.get("email"): + return deletion["email"], "record prefers the right-to-delete email lane" + if (row.get("tier") == "T3" or any(req.get(k) for k in _HUMAN_GATES)) and deletion.get("email"): + return deletion["email"], "rescue: primary flow is human-gated; deletion email restores autonomy" + return None, "" + + +def _optout_action(row: dict, playbook: dict[str, dict], subject_id: str, dossier: dict, + email_mode: str, smtp_ok: bool, confirm_first: bool) -> tuple[dict | None, dict | None]: + """Map one actionable `found` row to (agent_action, human_digest_entry). + + Routing order maximizes autonomy: (1) the email lane (primary email method, preferred + right-to-delete email, or rescue from a human-gated form) beats everything when SMTP is + up; (2) genuinely human-only flows go to the digest; (3) web forms are driven with the + record's own field-verified playbook steps. + """ + bid = row["broker_id"] + req = row.get("optout_requires") or {} + tier = row.get("tier") + deletion = row.get("deletion") or {} + + # 1) The autonomous EMAIL LANE (right-to-delete by email + confirm the reply). + # Autonomous when SMTP is configured (programmatic/alias) OR in browser mode (agent sends via + # the operator's logged-in webmail; no password needed). + email_addr, lane_why = _email_lane(row) + can_email = (email_mode in ("programmatic", "alias") and smtp_ok) or email_mode == "browser" + if email_addr and can_email: + kind = request_kind(dossier, deletion.get("kinds")) + via = "browser" if email_mode == "browser" else "smtp" + then = ("send-email records it + returns a recipient-locked payload; compose and send it in " + "the operator's webmail via browser_*, then `verify-link` on the reply and open the link" + if via == "browser" else + "state auto-records as submitted; poll-verification picks up their verification reply, " + "open its link, then record") + return { + "type": "optout_email_send", + "broker_id": bid, "broker_name": row.get("broker_name"), "tier": tier, + "confirm_first": confirm_first, "send_via": via, + "to": email_addr, "kind": kind, "why": lane_why, + "command": f"python3 scripts/pdd.py send-email {subject_id} {bid} --kind {kind} " + f"--to {email_addr} --listing ", + "then": then, + }, None + if row.get("method") == "email": + return None, _digest(row, "email opt-out (draft mode: a human must hit send)", + ["Send the rendered draft from your own mail client", + f"Then: python3 scripts/pdd.py record {subject_id} {bid} submitted " + f"--disclosed contact_email --channel email"], + prep=[f"python3 scripts/pdd.py render-email {subject_id} {bid} --listing "]) + + # 2) Genuinely human-only work goes to the digest (no email lane could rescue it). + if tier == "T3": + return None, _digest(row, "human-only opt-out (gov ID / fax / mail / voice phone)", + [f"Follow the broker's process at {row.get('optout_url') or row.get('optout_email')}", + "Provide only the fields the listing already shows; cross out ID numbers on any document"]) + if req.get("phone_callback"): + return None, _digest(row, "phone-callback verification (operator must be on the phone)", + [f"Open {row.get('optout_url')} and submit with only the planned fields", + "Answer the automated call and enter the 4-digit code to finish"], + prep=[f"python3 scripts/pdd.py plan {subject_id} --batch # confirm fields first"]) + if req.get("account"): + return None, _digest(row, "requires creating/holding an account with the broker", + [f"Create/log in at {row.get('optout_url')} and submit the opt-out", + "Use the subject's contact email; no extra PII beyond the planned fields"]) + + # 3) web_form: drive the browser with the record's own playbook steps. + steps = (playbook.get(bid) or {}).get("steps") or list(row.get("optout_playbook") or []) \ + or tiers.synthesize_steps(row) + action = { + "type": "optout_web_form", + "broker_id": bid, "broker_name": row.get("broker_name"), "tier": tier, + "confirm_first": confirm_first, + "optout_url": row.get("optout_url"), + "clears_children": row.get("clears_children") or [], + "steps": steps, + "after": f"python3 scripts/pdd.py record {subject_id} {bid} submitted " + f"--disclosed ... --channel web_form", + } + if deletion: + action["prefer_deletion"] = ("this record has a right-to-delete lane -- complete the DELETION " + "flow, not just suppression" + (f" ({deletion.get('notes')})" + if deletion.get("notes") else "")) + if req.get("captcha"): + action["note"] = ("CAPTCHA-gated: attempt with the configured browser backend once; if it " + "does not clear, record blocked (do NOT retry-loop or bypass)") + return action, None + + +def next_actions(dossier: dict, brokers_list: list[dict], cfg: dict, + ledger: dict | None = None, env: dict | None = None) -> dict: + env = os.environ if env is None else env + ledger = ledger or {} + subject_id = dossier.get("subject_id", "") + autonomy = cfg.get("autonomy", "full") + confirm_first = autonomy == "assisted" + email_mode = cfg.get("email_mode", "draft_only") + mail = emailer.available(env) + at = _now_iso() + + batch = tiers.batch_plan(dossier, brokers_list, cfg, ledger, + browser_clears_captcha=cfg.get("browser_backend") == "browserbase" + or bool(env.get("BROWSERBASE_API_KEY"))) + groups = batch["groups"] + playbook = {p["broker_id"]: p for p in batch.get("parent_playbook") or []} + by_id = {b.get("id"): b for b in brokers_list} + + actions: list[dict] = [] + digest: list[dict] = [] + + # 0) keep the broker DB fresh (autonomously) + age = cache_age_days() + if age is None or age > CACHE_STALE_DAYS: + actions.append({ + "type": "refresh_brokers", + "why": "live broker cache missing" if age is None else f"cache is {age:.0f} days old", + "command": "python3 scripts/pdd.py refresh-brokers", + }) + + # 0b) DROP one-shot: for a CA resident, ONE request deletes from every registered + # broker (the whole CA Data Broker Registry) -- the highest-leverage removal there is. + registry_recs = brokers_mod.load_registry_cache() + residency = (dossier.get("residency_jurisdiction") or "US").upper() + drop_filed = bool((dossier.get("preferences") or {}).get("drop_filed_at")) + if registry_recs and residency.startswith("US-CA") and not drop_filed: + actions.append({ + "type": "drop_submit", + "one_shot": True, + "registry_count": len(registry_recs), + "url": registry.DROP_URL, + "command": f"python3 scripts/pdd.py drop {subject_id}", + "why": f"CA resident: one DROP request deletes from all {len(registry_recs)} registered " + "data brokers at once (superset of what commercial services cover).", + "after": f"python3 scripts/pdd.py drop {subject_id} --filed", + }) + + # 1) Phase 1 crawl: everything unscanned (read-only, parallel-safe) + unscanned = groups.get("unscanned") or [] + if unscanned: + ids = [r["broker_id"] for r in unscanned] + if len(ids) > FANOUT_THRESHOLD: + actions.append({ + "type": "fanout_scan", + "broker_ids": ids, + "command": f"python3 scripts/pdd.py fanout {subject_id}", + "how": "spawn ONE delegate_task subagent per batch IN PARALLEL with each batch's brief; " + "parent re-verifies key `found` claims before trusting them", + }) + else: + actions.append({ + "type": "scan_inline", + "broker_ids": ids, + "command": f"python3 scripts/pdd.py plan {subject_id}", + "how": "run every search_vector per broker via the methods.md ladder " + "(web_extract -> site: probe -> browser), record a verdict per broker", + }) + + # 2) in-flight email verifications: poll the inbox (or hand to the human in draft mode) + for st in ("submitted", "verification_pending"): + for bid, case in sorted(ledger.items()): + if case.get("state") != st: + continue + broker = by_id.get(bid) or {} + if not ((broker.get("optout") or {}).get("requires") or {}).get("email_verification"): + continue + if mail["imap"]: + actions.append({ + "type": "poll_verification", "via": "imap", + "broker_id": bid, + "command": f"python3 scripts/pdd.py poll-verification {subject_id} --broker {bid}", + "then": "browser_navigate the returned link IN THE SAME AGENT BROWSER (sessions are " + f"browser-bound), complete the flow, then record: awaiting_processing", + }) + elif email_mode == "browser": + actions.append({ + "type": "poll_verification", "via": "browser", "broker_id": bid, + "how": "open the broker's confirmation email in the operator's logged-in webmail " + f"(browser_*), then `python3 scripts/pdd.py verify-link {subject_id} {bid} " + "--text ''` to score the link, browser_navigate it in the SAME " + "browser, then record awaiting_processing", + }) + else: + digest.append(_digest( + {"broker_id": bid, "broker_name": (broker.get("name") or bid)}, + "verification email must be opened by a human (draft mode, no inbox access)", + ["Open the broker's verification email in the subject's inbox and click the link", + f"Then: python3 scripts/pdd.py record {subject_id} {bid} awaiting_processing"])) + + # 3) due rechecks: processing windows elapsed / reappearance sweeps + for case in ledger_mod.due(subject_id, at=at, ledger=ledger): + bid = case.get("broker_id") + st = case.get("state") + if st in ("awaiting_processing", "confirmed_removed"): + actions.append({ + "type": "verify_removal", + "broker_id": bid, + "why": "processing window elapsed" if st == "awaiting_processing" else "periodic reappearance re-scan", + "how": "re-run this broker's search_vectors; if gone record confirmed_removed; " + "if still listed record reappeared and requeue the opt-out", + }) + elif st in ("submitted", "verification_pending") and not mail["imap"]: + pass # already covered by the digest entry above + + # 4) Phase 2 opt-outs: parents first (batch_plan already ordered them) + for row in groups.get("found") or []: + action, task = _optout_action(row, playbook, subject_id, dossier, + email_mode, mail["smtp"], confirm_first) + if action: + actions.append(action) + if task: + digest.append(task) + + # 5) indirect exposure: targeted delete-my-PII requests + for row in groups.get("indirect_exposure") or []: + bid = row["broker_id"] + if (email_mode in ("programmatic", "alias") and mail["smtp"]) or email_mode == "browser": + actions.append({ + "type": "indirect_email_send", + "broker_id": bid, "confirm_first": confirm_first, + "send_via": "browser" if email_mode == "browser" else "smtp", + "command": f"python3 scripts/pdd.py send-email {subject_id} {bid} --kind ccpa_indirect " + f"--listing ", + }) + else: + digest.append(_digest(row, "indirect-exposure request (draft mode: a human must hit send)", + ["Send the rendered ccpa_indirect draft", + f"Then: python3 scripts/pdd.py record {subject_id} {bid} submitted " + f"--disclosed contact_email --channel email"], + prep=[f"python3 scripts/pdd.py render-email {subject_id} {bid} " + f"--kind ccpa_indirect --listing "])) + + # 6) blocked sites: stealth pass if we have one, else the operator-browser path + blocked = groups.get("blocked") or [] + if blocked: + ids = [r["broker_id"] for r in blocked] + if bool(env.get("BROWSERBASE_API_KEY")): + actions.append({ + "type": "stealth_rescan", + "broker_ids": ids, + "how": "retry these with the cloud/stealth browser backend, then record real verdicts", + }) + else: + for r in blocked: + digest.append(_digest(r, "site blocks automated access (anti-bot); a human browser gets through", + ["Open the paste-ready search URL from `plan` in your everyday browser", + "Report the verdict (or a screenshot) back to the agent", + f"Agent records: python3 scripts/pdd.py record {subject_id} " + f"{r['broker_id']} "])) + + # 7) anything already parked as a human task + for bid, case in sorted(ledger.items()): + if case.get("state") == "human_task_queued": + broker = by_id.get(bid) or {} + digest.append(_digest({"broker_id": bid, "broker_name": broker.get("name") or bid}, + case.get("human_task_reason") or "queued manual step", + ["See `pdd.py tasks` for the exact steps recorded with this case"])) + + # registry coverage summary (breadth beyond the scannable people-search sites) + coverage = None + if registry_recs: + coverage = { + "people_search_sites": len(brokers_list), + "registered_data_brokers": len(registry_recs), + "worked_via": "CA DROP one-shot" if residency.startswith("US-CA") else "targeted CCPA/GDPR email", + } + if not residency.startswith("US-CA"): + coverage["note"] = ("DROP is CA-only; for this subject the registry is covered by targeted " + "CCPA/GDPR deletion emails (`registry --search` then `send-email`), " + "not a single portal request.") + elif drop_filed: + coverage["note"] = "DROP already filed; registry deletions are in the brokers' hands." + + next_wake = _min_future_recheck(ledger, at) + return { + "subject": subject_id, + "autonomy": autonomy, + "phase": batch.get("phase"), + "counts": batch.get("counts"), + "actions": actions, + "human_digest": digest, + "coverage": coverage, + "done_for_now": not actions, + "fully_done": not actions and not digest and not next_wake, + "next_wake_at": next_wake, + "note": ("assisted mode: pause for operator confirmation on every action with confirm_first=true" + if confirm_first else + "full autonomy: recorded intake consent authorizes these submissions; do not pause. " + "Present human_digest ONCE at the end of the run, not per item."), + } diff --git a/optional-skills/security/unbroker/scripts/badbool.py b/optional-skills/security/unbroker/scripts/badbool.py new file mode 100644 index 000000000..9a415ceef --- /dev/null +++ b/optional-skills/security/unbroker/scripts/badbool.py @@ -0,0 +1,177 @@ +"""Pull and parse the Big-Ass Data Broker Opt-Out List (BADBOOL) into broker records. + +BADBOOL (https://github.com/yaelwrites/Big-Ass-Data-Broker-Opt-Out-List) is a +maintained, frequently-updated markdown list. `refresh` fetches it and parses the +"People Search Sites" section into records that merge UNDER the curated DB (curated +records always win). Auto-parsed records carry source="BADBOOL-auto" and +confidence="auto" so the agent treats their URLs as best guesses to verify first. + +`parse()` is pure (markdown in, records out) so it is tested offline; `fetch()` is +the only network call and can be bypassed by passing markdown directly to refresh(). +""" +from __future__ import annotations + +import re +import urllib.request +from pathlib import Path + +import storage + +DEFAULT_URL = ( + "https://raw.githubusercontent.com/yaelwrites/" + "Big-Ass-Data-Broker-Opt-Out-List/master/README.md" +) +USER_AGENT = "Mozilla/5.0 (compatible; unbroker/1.0; data opt-out)" + +# BADBOOL legend symbols. +SYMBOLS = { + "crucial": "\U0001F490", # 💐 + "high": "\u2620", # ☠ + "gov_id": "\U0001F3AB", # 🎫 + "phone": "\U0001F4DE", # 📞 + "payment": "\U0001F4B0", # 💰 +} + +_LINK_RE = re.compile(r"\[([^\]]+)\]\(([^)]+)\)") +_OPTOUT_HINT = re.compile( + r"opt[\- ]?out|optout|removal|remove|suppress|control-privacy|delete", re.I +) +_FIND_HINT = re.compile(r"find|your information|search|look ?up|look for", re.I) + + +def slug(name: str) -> str: + # Drop a trailing .com/.org/.info on the displayed name so "FastPeopleSearch.com" + # matches the curated id "fastpeoplesearch"; keep .net/.id so distinct sites differ. + n = re.sub(r"\.(com|org|info)\b", "", name.strip(), flags=re.I) + return re.sub(r"[^a-z0-9]+", "", n.lower()) + + +def _heading_flags(heading: str) -> tuple[str, dict]: + flags = {key: (sym in heading) for key, sym in SYMBOLS.items()} + name = heading + for sym in SYMBOLS.values(): + name = name.replace(sym, "") + name = name.replace("\ufe0f", "").strip() + return name, flags + + +def _priority(flags: dict) -> str: + if flags["crucial"]: + return "crucial" + if flags["high"]: + return "high" + return "standard" + + +def _pick(links: list[tuple[str, str]], hint: re.Pattern) -> str | None: + for _text, url in links: + if hint.search(url): + return url + for text, url in links: + if hint.search(text): + return url + return None + + +def _clean(text: str) -> str: + return re.sub(r"\s+", " ", text).strip()[:600] + + +def _build(name: str, flags: dict, body: str) -> dict: + links = _LINK_RE.findall(body) + web = [(t, u) for t, u in links if u.lower().startswith("http")] + mailtos = [u[7:] for _t, u in links if u.lower().startswith("mailto:")] + optout_url = _pick(web, _OPTOUT_HINT) + search_url = _pick(web, _FIND_HINT) or (web[0][1] if web else None) + + if flags["phone"]: + method = "phone" + elif optout_url: + method = "web_form" + elif mailtos: + method = "email" + else: + method = "manual" + + return { + "id": slug(name), + "name": name, + "category": "people_search", + "priority": _priority(flags), + "jurisdictions": ["US"], + "search": {"method": "url_pattern", "url": search_url, "fetch": "browser", + "match_signal": "result", "by": ["name", "phone", "address"]}, + "optout": { + "method": method, + "url": optout_url, + "email": mailtos[0] if mailtos else None, + "requires": { + "gov_id": flags["gov_id"], + "phone_voice": flags["phone"], + "payment": flags["payment"], + "email_verification": False, + "captcha": False, + "account": False, + "phone_callback": False, + }, + "inputs": ["full_name", "contact_email"], + "notes": _clean(body), + "links": [{"text": t, "url": u} for t, u in links], + "est_processing_days": 14, # unknown for auto records; drives next_recheck_at + }, + "source": "BADBOOL-auto", + "confidence": "auto", + "last_verified": None, + } + + +def parse(markdown: str) -> list[dict]: + """Parse the 'People Search Sites' section of BADBOOL into broker records.""" + records: list[dict] = [] + in_people = False + heading: str | None = None + body: list[str] = [] + + def flush() -> None: + nonlocal heading, body + if heading is not None: + name, flags = _heading_flags(heading) + if name: + records.append(_build(name, flags, "\n".join(body).strip())) + heading, body = None, [] + + for line in markdown.splitlines(): + if line.startswith("## "): + flush() + in_people = line[3:].strip().lower().startswith("people search") + continue + if not in_people: + continue + if line.startswith("### "): + flush() + heading = line[4:].strip() + elif heading is not None: + body.append(line) + flush() + return records + + +def fetch(url: str = DEFAULT_URL, timeout: int = 30) -> str: + req = urllib.request.Request(url, headers={"User-Agent": USER_AGENT}) + with urllib.request.urlopen(req, timeout=timeout) as resp: # noqa: S310 + return resp.read().decode("utf-8", errors="replace") + + +MIN_EXPECTED = 20 # BADBOOL's People Search section lists ~47; far fewer => upstream reorg, warn + + +def refresh(cache_path: Path, url: str = DEFAULT_URL, markdown: str | None = None) -> dict: + """Fetch (or accept) BADBOOL markdown, parse it, and write the snapshot cache.""" + md = markdown if markdown is not None else fetch(url) + records = parse(md) + storage.write_json(cache_path, records) + out = {"parsed": len(records), "cache_path": str(cache_path), "source_url": url} + if len(records) < MIN_EXPECTED: + out["warning"] = (f"only {len(records)} parsed (expected >{MIN_EXPECTED}); BADBOOL's " + "'People Search Sites' section may have moved/reorganized - check the parser") + return out diff --git a/optional-skills/security/unbroker/scripts/brokers.py b/optional-skills/security/unbroker/scripts/brokers.py new file mode 100644 index 000000000..4cb63a5c6 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/brokers.py @@ -0,0 +1,77 @@ +"""Load and query the broker database (references/brokers/*.json). + +Each broker is one JSON file for clean diffs/PRs. Files beginning with `_` are +ignored (reserved for notes/scratch). +""" +from __future__ import annotations + +import json +from pathlib import Path + +import paths +import storage + +PRIORITY_ORDER = {"crucial": 0, "high": 1, "standard": 2, "long_tail": 3} + + +def _load_curated(directory: Path | None = None) -> list[dict]: + directory = directory or paths.brokers_dir() + out: list[dict] = [] + if not directory.exists(): + return out + for fp in sorted(directory.glob("*.json")): + if fp.name.startswith("_"): + continue + out.append(json.loads(fp.read_text(encoding="utf-8"))) + return out + + +def load_live_cache() -> list[dict]: + """Records pulled from BADBOOL via `refresh-brokers` (empty until refreshed).""" + return storage.read_json(paths.brokers_cache_path(), []) or [] + + +def load_registry_cache() -> list[dict]: + """CA Data Broker Registry records (separate coverage lane; empty until refreshed). + + Kept OUT of load_all() by default: these are not people-search sites to scan, they + are worked via the CA DROP one-shot + CCPA email. Consumers of the scan/plan/fanout + pipeline must not receive them; use this directly for coverage counts and the DROP/ + email lanes. + """ + return storage.read_json(paths.registry_cache_path(), []) or [] + + +def load_all(directory: Path | None = None, include_live: bool = True) -> list[dict]: + """Curated records, with live BADBOOL records merged underneath (curated wins).""" + merged: dict[str, dict] = {b["id"]: b for b in _load_curated(directory)} + if include_live: + for b in load_live_cache(): + bid = b.get("id") + if bid and bid not in merged: + merged[bid] = b + out = list(merged.values()) + out.sort(key=lambda b: (PRIORITY_ORDER.get(b.get("priority", "standard"), 9), b.get("id", ""))) + return out + + +def get(broker_id: str, directory: Path | None = None) -> dict | None: + for b in load_all(directory): + if b.get("id") == broker_id: + return b + return None + + +def by_priority(*levels: str, directory: Path | None = None) -> list[dict]: + wanted = set(levels) if levels else None + return [b for b in load_all(directory) if wanted is None or b.get("priority") in wanted] + + +def clusters(directory: Path | None = None) -> dict[str, list[str]]: + """Map a parent broker id -> child site ids it can clear (force-multipliers).""" + out: dict[str, list[str]] = {} + for b in load_all(directory): + owns = b.get("owns") or [] + if owns: + out[b["id"]] = list(owns) + return out diff --git a/optional-skills/security/unbroker/scripts/config.py b/optional-skills/security/unbroker/scripts/config.py new file mode 100644 index 000000000..7f53554fe --- /dev/null +++ b/optional-skills/security/unbroker/scripts/config.py @@ -0,0 +1,124 @@ +"""Install-wide configuration with easiest-first defaults. + +Everything works zero-config. `setup --auto` (the autonomous path) detects what +this environment can do and picks the MOST AUTONOMOUS valid configuration without +asking anyone; plain `setup` keeps the easiest-first defaults and only upgrades a +setting when a flag opts in. + +`autonomy` is policy, orthogonal to capability: + full - intake consent is standing authorization; the agent submits T0-T2 + opt-outs without pausing per submission (default). + assisted - the agent pauses for operator confirmation before each submission. +""" +from __future__ import annotations + +import os +from pathlib import Path +from shutil import which + +import emailer +import paths +import storage + +DEFAULT_CONFIG = { + "autonomy": "full", # hands-off after intake+consent + "email_mode": "draft_only", # zero credentials + "browser_backend": "auto", # auto = Browserbase when BROWSERBASE_API_KEY is set + # (recommended default; clears soft CAPTCHAs), else plain browser + "tracker_backend": "local-json", # no external dependency + "encryption": "none", # files still written 0600 + "default_rescan_interval_days": 120, + "email_min_interval_seconds": 20, # pace SMTP sends so a run can't torch the account +} + +VALID = { + "autonomy": {"full", "assisted"}, + # email_mode: + # draft_only - render drafts; the operator sends + clicks verify links (zero setup) + # browser - the agent sends + opens verify links through the operator's logged-in + # webmail via browser_* tools (NO password stored; needs a browser the + # operator's inbox is signed into) + # programmatic - CLI sends via SMTP + reads verify links via IMAP (needs EMAIL_* creds) + # alias - AgentMail agent-owned inboxes / per-broker aliases + "email_mode": {"draft_only", "browser", "programmatic", "alias"}, + "browser_backend": {"auto", "browserbase", "agent-browser", "camofox"}, + "tracker_backend": {"local-json", "google-sheets"}, + "encryption": {"none", "age"}, +} + + +def load_config() -> dict: + cfg = dict(DEFAULT_CONFIG) + cfg.update(storage.read_json(paths.config_path(), {}) or {}) + return cfg + + +def save_config(cfg: dict) -> Path: + merged = dict(DEFAULT_CONFIG) + merged.update(cfg) + for key, allowed in VALID.items(): + if merged.get(key) not in allowed: + raise ValueError(f"invalid {key!r}: {merged.get(key)!r} (allowed: {sorted(allowed)})") + return storage.write_json(paths.config_path(), merged) + + +def detect_capabilities(env: dict | None = None) -> dict: + """Report which opt-in upgrades are available without extra setup.""" + env = os.environ if env is None else env + home = paths.hermes_home() + google = ( + (home / "google_token.json").exists() + or (home / "skills" / "productivity" / "google-workspace").exists() + or (home / "skills" / "google-workspace").exists() + ) + mail = emailer.available(env) + return { + "browserbase": bool(env.get("BROWSERBASE_API_KEY")), + "agentmail": bool(env.get("AGENTMAIL_API_KEY")), + "email_imap_smtp": bool(env.get("EMAIL_ADDRESS") and env.get("EMAIL_PASSWORD")), + "smtp_send": mail["smtp"], # CLI can SEND opt-out emails itself + "imap_read": mail["imap"], # CLI can POLL verification links itself + "google_workspace": google, + "age": which("age") is not None, + } + + +def auto_configure(env: dict | None = None) -> dict: + """Pick the most autonomous configuration this environment supports (no questions). + + - email: programmatic when SMTP creds exist (CLI sends + IMAP-verifies itself); + alias mode when only AgentMail exists; draft_only as the capability floor. + - browser: browserbase when the key exists (clears soft CAPTCHAs -> more T1). + - encryption: age when the binary is installed (free privacy, zero human cost). + - tracker: stays local-json (google-sheets needs a sheet id -> a human choice). + """ + caps = detect_capabilities(env) + cfg = load_config() + cfg["autonomy"] = "full" + if caps["smtp_send"]: + cfg["email_mode"] = "programmatic" + elif caps["agentmail"]: + cfg["email_mode"] = "alias" + else: + cfg["email_mode"] = "draft_only" + cfg["browser_backend"] = "browserbase" if caps["browserbase"] else "auto" + if caps["age"]: + cfg["encryption"] = "age" + return cfg + + +def browser_clears_captcha(cfg: dict, env: dict | None = None) -> bool: + """True if the chosen browser backend can clear soft CAPTCHAs (shifts T2 -> T1). + + Browserbase is the recommended default: a real residential-IP cloud browser passes + soft/managed challenges (Turnstile, hCaptcha/reCAPTCHA checkbox) as normal operation. + This is NOT solving/spoofing - hard interactive challenges still escalate to a human. + `auto` inherits this whenever BROWSERBASE_API_KEY is present. + """ + backend = cfg.get("browser_backend", "auto") + if backend == "browserbase": + return True + if backend == "auto": + env = os.environ if env is None else env + return bool(env.get("BROWSERBASE_API_KEY")) + return False diff --git a/optional-skills/security/unbroker/scripts/crypto.py b/optional-skills/security/unbroker/scripts/crypto.py new file mode 100644 index 000000000..98594f5e8 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/crypto.py @@ -0,0 +1,88 @@ +"""At-rest encryption for sensitive files via the `age` binary (optional). + +Engaged ONLY when config `encryption: age` AND an age identity key exists AND the +`age`/`age-keygen` binaries are available. When engaged, JSON docs under +`subjects/` (dossier, ledger) are written as `.age` ciphertext; the audit +log (field NAMES + states only, no raw PII values), `config.json`, and the broker +cache stay plaintext so the engine can read them. + +Threat model (be honest): this protects against casual disk inspection, accidental +`git add`/commits, screen-shares, and backup/cloud-sync leakage. The identity key +defaults to living beside the data at `$PDD_DATA_DIR/age-identity.txt` (0600); set +`PDD_AGE_IDENTITY` to a separate volume/token for true key separation. It does NOT +protect against an attacker who can already read your whole HERMES_HOME (they get +key + data together). +""" +from __future__ import annotations + +import json +import subprocess +from pathlib import Path +from shutil import which + +import paths + + +def age_available() -> bool: + return which("age") is not None and which("age-keygen") is not None + + +def encryption_setting() -> str: + """Read `encryption` straight from config.json (no config/storage import => no cycle).""" + cfg = paths.config_path() + if not cfg.exists(): + return "none" + try: + return (json.loads(cfg.read_text(encoding="utf-8")) or {}).get("encryption", "none") + except (ValueError, OSError): + return "none" + + +def identity_path() -> Path: + return paths.age_identity_path() + + +def ensure_identity() -> Path: + """Generate an age identity (X25519 keypair) if missing; return its path.""" + if not age_available(): + raise RuntimeError("`age`/`age-keygen` not found; cannot enable encryption") + p = identity_path() + if not p.exists(): + p.parent.mkdir(parents=True, exist_ok=True) + try: + p.parent.chmod(0o700) + except OSError: + pass + subprocess.run(["age-keygen", "-o", str(p)], check=True, capture_output=True) + try: + p.chmod(0o600) + except OSError: + pass + return p + + +def recipient() -> str: + """The age public key (recipient) for the identity, parsed from its header.""" + p = ensure_identity() + for line in p.read_text(encoding="utf-8").splitlines(): + s = line.strip() + if s.lower().startswith("# public key:"): + return s.split(":", 1)[1].strip() + if s.startswith("age1"): + return s + raise RuntimeError(f"no public key found in {p}") + + +def is_engaged() -> bool: + """True only when encryption is actually active (configured + available + key present).""" + return encryption_setting() == "age" and age_available() and identity_path().exists() + + +def encrypt(data: bytes) -> bytes: + out = subprocess.run(["age", "-r", recipient()], input=data, capture_output=True, check=True) + return out.stdout + + +def decrypt(data: bytes) -> bytes: + out = subprocess.run(["age", "-d", "-i", str(identity_path())], input=data, capture_output=True, check=True) + return out.stdout diff --git a/optional-skills/security/unbroker/scripts/dossier.py b/optional-skills/security/unbroker/scripts/dossier.py new file mode 100644 index 000000000..50b4c8c6b --- /dev/null +++ b/optional-skills/security/unbroker/scripts/dossier.py @@ -0,0 +1,135 @@ +"""Subject dossier management + consent gate + least-disclosure field selection.""" +from __future__ import annotations + +import datetime as _dt +import hashlib +import os +from pathlib import Path + +import paths +import storage + +# Identifiers we never volunteer in an opt-out (would expand exposure, not reduce it). +NEVER_VOLUNTEER = {"ssn", "social_security_number", "passport", "drivers_license"} + +VALID_CONSENT_METHODS = {"self", "written_authorization", "poa"} + + +def now() -> str: + return _dt.datetime.now(_dt.timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") + + +def new_subject_id(full_name: str = "") -> str: + # Opaque id: derives NOTHING from the name, so PII never leaks into directory names, + # case ids, drafts, or the audit log. full_name kept only for call compatibility. + return "sub_" + hashlib.sha1(os.urandom(8)).hexdigest()[:10] + + +def create(identity: dict, consent: dict, residency: str = "US", prefs: dict | None = None) -> dict: + dossier = { + "subject_id": new_subject_id(identity.get("full_name", "subject")), + "consent": consent, + "identity": identity, + "residency_jurisdiction": residency, + "preferences": prefs or {"email_mode": "draft_only", "rescan_interval_days": 120}, + "created_at": now(), + } + save(dossier) + return dossier + + +def load(subject_id: str) -> dict | None: + return storage.read_json(paths.dossier_path(subject_id), None) + + +def save(dossier: dict) -> Path: + return storage.write_json(paths.dossier_path(dossier["subject_id"]), dossier) + + +def is_authorized(dossier: dict) -> bool: + c = dossier.get("consent") or {} + return bool(c.get("authorized")) and c.get("method") in VALID_CONSENT_METHODS + + +def require_authorized(dossier: dict) -> None: + if not is_authorized(dossier): + raise PermissionError( + f"subject {dossier.get('subject_id')!r} has no recorded authorization; refusing to act" + ) + + +def all_names(dossier: dict) -> list[str]: + """Primary name + aliases (maiden/married/nicknames), deduped, in priority order.""" + ident = dossier.get("identity", {}) + out: list[str] = [] + seen: set[str] = set() + for n in [ident.get("full_name"), *(ident.get("also_known_as") or [])]: + if n and n.lower() not in seen: + seen.add(n.lower()) + out.append(n) + return out + + +def all_addresses(dossier: dict) -> list[dict]: + """Current + prior addresses, each tagged with `kind` (current|prior).""" + ident = dossier.get("identity", {}) + out: list[dict] = [] + cur = ident.get("current_address") + if cur: + out.append({**cur, "kind": cur.get("kind", "current")}) + for a in ident.get("prior_addresses") or []: + out.append({**a, "kind": a.get("kind", "prior")}) + return out + + +def all_locations(dossier: dict) -> list[dict]: + """Distinct city/state pairs across all addresses (the vectors for name searches).""" + out: list[dict] = [] + seen: set[tuple] = set() + for a in all_addresses(dossier): + city = a.get("city") + key = ((city or "").lower(), (a.get("state") or "").lower()) + if city and key not in seen: + seen.add(key) + out.append({"city": city, "state": a.get("state")}) + return out + + +def contact_email(dossier: dict) -> str | None: + """The single email used for opt-out correspondence (designated, else the first).""" + ident = dossier.get("identity", {}) + prefs = dossier.get("preferences", {}) + emails = ident.get("emails") or [] + return prefs.get("contact_email_for_optouts") or (emails[0] if emails else None) + + +def select_disclosure(dossier: dict, inputs: list[str], override_email: str | None = None) -> dict: + """Return ONLY the dossier fields a broker's opt-out actually requires. + + Enforces least-disclosure: skips anything in NEVER_VOLUNTEER, and skips + `profile_url` (that is captured per-listing at submit time, not from the dossier). + A single contact email is used for correspondence even when the subject has several + (see all_names / all_addresses / search vectors for using every alternate to *find* listings). + """ + ident = dossier.get("identity", {}) + addr = ident.get("current_address") or {} + phones = ident.get("phones") or [] + available = { + "full_name": ident.get("full_name"), + "first_name": (ident.get("full_name") or "").split(" ")[0] or None, + "contact_email": override_email or contact_email(dossier), + "current_address": addr or None, + "street": addr.get("line1"), + "city": addr.get("city"), + "state": addr.get("state"), + "postal": addr.get("postal"), + "date_of_birth": ident.get("date_of_birth"), + "phone": phones[0] if phones else None, + } + out: dict = {} + for key in inputs: + if key in NEVER_VOLUNTEER or key == "profile_url": + continue + if available.get(key) is not None: + out[key] = available[key] + return out diff --git a/optional-skills/security/unbroker/scripts/email_modes.py b/optional-skills/security/unbroker/scripts/email_modes.py new file mode 100644 index 000000000..d5b40eb84 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/email_modes.py @@ -0,0 +1,76 @@ +"""Email modes A/B/C helpers + anti-phishing verification-link extraction. + +Mode A (default): render a ready-to-send draft to disk; the operator sends it. +Mode B/C: the agent SENDS via a Hermes email mechanism (IMAP/SMTP gateway, +`himalaya`, AgentMail, or Gmail via `google-workspace`) and READS the reply to +resolve the verification link with `extract_verification_link`. Those transports +are driven by the agent through native tools; this module stays network-free so +the hermetic tests pass. +""" +from __future__ import annotations + +import re +from pathlib import Path + +import legal +import paths + +_LINK_RE = re.compile(r"https?://[^\s\"'<>)\]]+", re.IGNORECASE) +_VERIFY_HINTS = ("opt", "remov", "verif", "confirm", "unsubscrib", "suppress", "delete", "privacy") + + +def render_draft(broker: dict, fields: dict, out_dir: Path | None = None) -> Path: + """Mode A: write a ready-to-send opt-out email for the operator to send.""" + body = legal.render_optout_email(broker, fields) + out_dir = out_dir or (paths.data_dir() / "drafts") + out_dir.mkdir(parents=True, exist_ok=True) + fp = out_dir / f"{broker.get('id', 'broker')}.txt" + fp.write_text(body, encoding="utf-8") + return fp + + +def render_request_draft(broker: dict, fields: dict, kind: str = "generic", + out_dir: Path | None = None) -> Path: + """Mode A: write a ready-to-send request of a specific KIND. + + kind: generic | ccpa | ccpa_agent | ccpa_indirect | gdpr. Used for indirect-exposure + (ccpa_indirect) and explicit legal requests, where the generic opt-out wording is wrong. + The filename is suffixed with the kind so an indirect request does not overwrite an opt-out draft. + """ + body = legal.render_request(kind, broker, fields) + out_dir = out_dir or (paths.data_dir() / "drafts") + out_dir.mkdir(parents=True, exist_ok=True) + suffix = "" if kind == "generic" else f"-{kind}" + fp = out_dir / f"{broker.get('id', 'broker')}{suffix}.txt" + fp.write_text(body, encoding="utf-8") + return fp + + +def extract_verification_link(email_body: str, broker: dict | None = None) -> str | None: + """Return the most likely opt-out/verification link from an email body. + + Anti-phishing: a link is only returned if its URL matches an opt-out hint + and/or the broker's own domain; arbitrary links score 0 and are ignored. + """ + candidates = _LINK_RE.findall(email_body or "") + if not candidates: + return None + + domain = "" + if broker: + url = (broker.get("optout") or {}).get("url") or (broker.get("search") or {}).get("url") or "" + m = re.search(r"https?://([^/]+)", url) + if m: + domain = m.group(1).replace("www.", "") + + best_score, best_link = 0, None + for link in candidates: + low = link.lower() + score = 0 + if any(h in low for h in _VERIFY_HINTS): + score += 2 + if domain and domain in low: + score += 3 + if score > best_score: + best_score, best_link = score, link + return best_link diff --git a/optional-skills/security/unbroker/scripts/emailer.py b/optional-skills/security/unbroker/scripts/emailer.py new file mode 100644 index 000000000..927bc1535 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/emailer.py @@ -0,0 +1,342 @@ +"""Programmatic email (Mode B) via stdlib smtplib/imaplib - no human in the loop. + +This is what turns email opt-outs autonomous: `send()` delivers the rendered +request straight to the broker's known opt-out address, and `find_verification_link()` +polls the inbox for the broker's confirmation email and extracts the link (scored +by email_modes.extract_verification_link, so arbitrary/phishing links are ignored). +The agent still OPENS the link with its own browser - several brokers bind the +verification session to the browser that opens it (see the intelius record). + +Configuration comes from the same env vars the Hermes email gateway uses: + EMAIL_ADDRESS / EMAIL_PASSWORD (required for Mode B) + EMAIL_SMTP_HOST / EMAIL_SMTP_PORT (optional; inferred for common providers) + EMAIL_IMAP_HOST / EMAIL_IMAP_PORT (optional; inferred for common providers) + +Anti-misuse: `send()` refuses a recipient that is not the broker record's own +opt-out/privacy address - this module cannot be repurposed to email arbitrary people. +All network calls live behind small functions that the hermetic tests monkeypatch. +""" +from __future__ import annotations + +import email as _email +import email.utils +import imaplib +import json +import os +import re +import smtplib +import time +from email.message import EmailMessage +from pathlib import Path + +import email_modes +import paths + +# provider domain -> (smtp_host, smtp_port, imap_host, imap_port) +PROVIDERS = { + "gmail.com": ("smtp.gmail.com", 587, "imap.gmail.com", 993), + "googlemail.com": ("smtp.gmail.com", 587, "imap.gmail.com", 993), + "outlook.com": ("smtp-mail.outlook.com", 587, "outlook.office365.com", 993), + "hotmail.com": ("smtp-mail.outlook.com", 587, "outlook.office365.com", 993), + "live.com": ("smtp-mail.outlook.com", 587, "outlook.office365.com", 993), + "yahoo.com": ("smtp.mail.yahoo.com", 587, "imap.mail.yahoo.com", 993), + "icloud.com": ("smtp.mail.me.com", 587, "imap.mail.me.com", 993), + "me.com": ("smtp.mail.me.com", 587, "imap.mail.me.com", 993), + "fastmail.com": ("smtp.fastmail.com", 587, "imap.fastmail.com", 993), +} + + +def _domain(address: str) -> str: + return address.rsplit("@", 1)[-1].lower() if "@" in address else "" + + +def smtp_settings(env: dict | None = None) -> dict | None: + """SMTP connection settings, or None when sending is not configured.""" + env = os.environ if env is None else env + address, password = env.get("EMAIL_ADDRESS"), env.get("EMAIL_PASSWORD") + if not (address and password): + return None + inferred = PROVIDERS.get(_domain(address)) + host = env.get("EMAIL_SMTP_HOST") or (inferred[0] if inferred else None) + if not host: + return None # unknown provider and no explicit host + port = int(env.get("EMAIL_SMTP_PORT") or (inferred[1] if inferred else 587)) + return {"host": host, "port": port, "address": address, "password": password} + + +def imap_settings(env: dict | None = None) -> dict | None: + """IMAP connection settings, or None when inbox reading is not configured.""" + env = os.environ if env is None else env + address, password = env.get("EMAIL_ADDRESS"), env.get("EMAIL_PASSWORD") + if not (address and password): + return None + inferred = PROVIDERS.get(_domain(address)) + host = env.get("EMAIL_IMAP_HOST") or (inferred[2] if inferred else None) + if not host: + return None + port = int(env.get("EMAIL_IMAP_PORT") or (inferred[3] if inferred else 993)) + return {"host": host, "port": port, "address": address, "password": password} + + +def available(env: dict | None = None) -> dict: + return {"smtp": smtp_settings(env) is not None, "imap": imap_settings(env) is not None} + + +# --- sending ------------------------------------------------------------------ + +def broker_addresses(broker: dict) -> list[str]: + """Every address the broker record itself declares (the ONLY valid recipients). + + Includes the primary opt-out email, the right-to-delete lane's email + (optout.deletion.email), and any mailto: links parsed from BADBOOL. + """ + opt = broker.get("optout") or {} + out = [a for a in [opt.get("email"), (opt.get("deletion") or {}).get("email")] if a] + for link in opt.get("links") or []: + url = (link.get("url") or "") + if url.lower().startswith("mailto:"): + out.append(url[7:].split("?")[0]) + seen: set[str] = set() + deduped = [] + for a in out: + if a.lower() not in seen: + seen.add(a.lower()) + deduped.append(a) + return deduped + + +def _split_subject_body(text: str) -> tuple[str, str]: + """Templates start with a 'Subject: ...' line; split it out for the MIME header.""" + lines = text.splitlines() + if lines and lines[0].lower().startswith("subject:"): + return lines[0].split(":", 1)[1].strip(), "\n".join(lines[1:]).lstrip("\n") + return "Data removal request", text + + +def browser_send_payload(broker: dict, body_text: str, to: str | None = None) -> dict: + """Build a recipient-locked {to, subject, body} for the agent to send via browser webmail. + + No network and no credentials: the deterministic part (recipient-lock to the broker's own + declared address, subject/body split) happens here; the agent then composes and sends it in + the operator's logged-in webmail with browser_* tools. Same recipient guard as `send()`, so + the browser lane cannot be pointed at an arbitrary person either. + """ + allowed = broker_addresses(broker) + if not allowed: + raise RuntimeError(f"broker {broker.get('id')!r} declares no opt-out email address") + recipient = to or allowed[0] + if recipient.lower() not in {a.lower() for a in allowed}: + raise PermissionError( + f"refusing to target {recipient!r}: not an address the broker record declares " + f"(allowed: {allowed})" + ) + subject, body = _split_subject_body(body_text) + return {"to": recipient, "subject": subject, "body": body} + + +def _rate_limit_path() -> Path: + return paths.data_dir() / "email-rate.json" + + +def _respect_rate_limit(min_interval: float, sleep, now, state_path=None) -> None: + """Pace sends across CLI invocations so a run can't torch the sending account. + + Persists the last-send wall-clock time; if the next send is too soon, sleep the + remainder. Cross-process because each `send-email` is a separate invocation. + """ + if min_interval <= 0: + return + p = state_path or _rate_limit_path() + last = 0.0 + try: + last = float(json.loads(p.read_text(encoding="utf-8")).get("last", 0.0)) + except (OSError, ValueError, TypeError): + last = 0.0 + wait = min_interval - (now() - last) + if wait > 0: + sleep(min(wait, min_interval)) + try: + p.parent.mkdir(parents=True, exist_ok=True) + p.write_text(json.dumps({"last": now()}), encoding="utf-8") + except OSError: + pass + + +# SMTP errors that are permanent (don't retry) vs transient (retry with backoff). +_SMTP_PERMANENT = (smtplib.SMTPAuthenticationError, smtplib.SMTPRecipientsRefused, + smtplib.SMTPSenderRefused, smtplib.SMTPDataError) + + +def send(broker: dict, body_text: str, to: str | None = None, + env: dict | None = None, _smtp_factory=None, + min_interval: float = 0.0, max_retries: int = 3, + _sleep=time.sleep, _now=time.time, _rate_state=None) -> dict: + """Send an opt-out/legal request to the broker's own opt-out address. + + Recipient is locked to an address the broker record declares (PermissionError + otherwise). `min_interval` paces sends across invocations (deliverability / + account-safety); transient SMTP/socket failures retry with exponential backoff, + permanent ones (auth, recipient refused) raise immediately. NOTE: a successful + SMTP handoff is NOT proof of delivery - real bounces arrive later as inbound mail; + in programmatic mode `poll-verification`/inbox review surfaces them, and the + due-queue re-scan is the true confirmation. Returns send metadata. + """ + settings = smtp_settings(env) + if not settings: + raise RuntimeError( + "programmatic email not configured (need EMAIL_ADDRESS + EMAIL_PASSWORD, and " + "EMAIL_SMTP_HOST for non-mainstream providers); fall back to `render-email` drafts" + ) + allowed = broker_addresses(broker) + if not allowed: + raise RuntimeError(f"broker {broker.get('id')!r} declares no opt-out email address") + recipient = to or allowed[0] + if recipient.lower() not in {a.lower() for a in allowed}: + raise PermissionError( + f"refusing to send to {recipient!r}: not an address the broker record declares " + f"(allowed: {allowed})" + ) + + subject, body = _split_subject_body(body_text) + msg = EmailMessage() + msg["From"] = settings["address"] + msg["To"] = recipient + msg["Subject"] = subject + msg["Date"] = email.utils.formatdate(localtime=True) + msg["Message-ID"] = email.utils.make_msgid() + msg.set_content(body) + + _respect_rate_limit(min_interval, _sleep, _now, _rate_state) + + factory = _smtp_factory or smtplib.SMTP + attempts = 0 + while True: + attempts += 1 + try: + with factory(settings["host"], settings["port"], timeout=30) as smtp: + smtp.ehlo() + try: + smtp.starttls() + smtp.ehlo() + except smtplib.SMTPNotSupportedError: + pass # already-TLS ports / test doubles + smtp.login(settings["address"], settings["password"]) + smtp.send_message(msg) + break + except _SMTP_PERMANENT: + raise # auth / recipient refused: retrying won't help + except (smtplib.SMTPException, OSError) as exc: + if attempts > max_retries: + raise RuntimeError(f"SMTP send failed after {attempts} attempts: {exc}") from exc + _sleep(min(2 ** (attempts - 1), 30)) # 1s, 2s, 4s... capped + return {"to": recipient, "subject": subject, "message_id": msg["Message-ID"], + "from": settings["address"], "attempts": attempts, + "delivery_note": "SMTP accepted; not proof of delivery - a bounce would arrive as " + "inbound mail. The due-queue re-scan is the real confirmation."} + + +# --- inbox polling ------------------------------------------------------------ + +def _decode_part(part) -> str: + try: + payload = part.get_payload(decode=True) + if payload is None: + return "" + charset = part.get_content_charset() or "utf-8" + return payload.decode(charset, errors="replace") + except Exception: # noqa: BLE001 - malformed MIME must not kill the poll + return "" + + +def message_text(msg) -> str: + """All text/plain + text/html content of a parsed email message.""" + chunks: list[str] = [] + if msg.is_multipart(): + for part in msg.walk(): + if part.get_content_type() in ("text/plain", "text/html"): + chunks.append(_decode_part(part)) + else: + chunks.append(_decode_part(msg)) + return "\n".join(c for c in chunks if c) + + +def _broker_domains(broker: dict) -> list[str]: + """Domains this broker legitimately mails from (site domains + optout email domain).""" + domains: list[str] = [] + for section in ("optout", "search"): + url = ((broker.get(section) or {}).get("url")) or "" + m = re.search(r"https?://([^/]+)", url) + if m: + domains.append(m.group(1).lower().removeprefix("www.")) + opt_email = (broker.get("optout") or {}).get("email") + if opt_email and "@" in opt_email: + domains.append(_domain(opt_email)) + # strip subdomains to the registrable-ish tail (mailer.intelius.com -> intelius.com) + tails = {".".join(d.split(".")[-2:]) for d in domains if d} + return sorted(tails) + + +def fetch_recent(env: dict | None = None, since_days: int = 3, limit: int = 30, + _imap_factory=None) -> list[dict]: + """Fetch recent inbox messages: [{from, subject, date, text}], newest first.""" + settings = imap_settings(env) + if not settings: + raise RuntimeError("IMAP not configured (need EMAIL_ADDRESS + EMAIL_PASSWORD, and " + "EMAIL_IMAP_HOST for non-mainstream providers)") + import datetime as _dt + since = (_dt.date.today() - _dt.timedelta(days=max(0, since_days))).strftime("%d-%b-%Y") + + factory = _imap_factory or imaplib.IMAP4_SSL + conn = factory(settings["host"], settings["port"]) + try: + conn.login(settings["address"], settings["password"]) + conn.select("INBOX", readonly=True) + _typ, data = conn.search(None, "SINCE", since) + ids = (data[0].split() if data and data[0] else [])[-limit:] + out: list[dict] = [] + for mid in reversed(ids): # newest first + _typ, msg_data = conn.fetch(mid, "(RFC822)") + raw = next((p[1] for p in msg_data or [] if isinstance(p, tuple)), None) + if not raw: + continue + msg = _email.message_from_bytes(raw) + out.append({ + "from": msg.get("From", ""), + "subject": msg.get("Subject", ""), + "date": msg.get("Date", ""), + "text": message_text(msg), + }) + return out + finally: + try: + conn.logout() + except Exception: # noqa: BLE001 + pass + + +def link_from_messages(messages: list[dict], broker: dict) -> dict | None: + """Pure: find the broker's verification link in already-fetched messages. + + A message is only considered if its From domain OR any contained link matches + the broker's own domains; the link itself must pass the anti-phishing scorer. + """ + domains = _broker_domains(broker) + for m in messages: + sender = (m.get("from") or "").lower() + text = m.get("text") or "" + sender_match = any(d in sender for d in domains) + body_match = any(d in text.lower() for d in domains) + if not (sender_match or body_match): + continue + link = email_modes.extract_verification_link(text, broker) + if link: + return {"link": link, "from": m.get("from"), "subject": m.get("subject"), + "date": m.get("date")} + return None + + +def find_verification_link(broker: dict, env: dict | None = None, since_days: int = 3, + _imap_factory=None) -> dict | None: + """Poll the inbox and return the broker's verification link (or None yet).""" + messages = fetch_recent(env, since_days=since_days, _imap_factory=_imap_factory) + return link_from_messages(messages, broker) diff --git a/optional-skills/security/unbroker/scripts/ledger.py b/optional-skills/security/unbroker/scripts/ledger.py new file mode 100644 index 000000000..e5ec331a1 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/ledger.py @@ -0,0 +1,164 @@ +"""Case ledger: opt-out state machine + append-only audit log. + +A "case" is one (subject x broker) record. State changes are validated against +TRANSITIONS and mirrored into audit.jsonl so every action is auditable. +""" +from __future__ import annotations + +import datetime as _dt +from pathlib import Path + +import paths +import storage + +STATES = [ + "new", "searching", "not_found", "found", "indirect_exposure", "action_selected", "submitted", + "verification_pending", "awaiting_processing", "confirmed_removed", "reappeared", + "human_task_queued", "blocked", +] + +TRANSITIONS: dict[str, set[str]] = { + "new": {"searching", "found", "not_found", "indirect_exposure", "blocked"}, + "searching": {"not_found", "found", "indirect_exposure", "blocked"}, + "not_found": {"searching", "found", "indirect_exposure", "blocked"}, + "found": {"action_selected", "submitted", "human_task_queued", "indirect_exposure", "blocked"}, + # indirect_exposure: subject's PII (email/phone/name) sits on a THIRD PARTY's record. The + # self-service opt-out form does not apply; the lever is a targeted CCPA/GDPR delete-my-PII + # request (-> submitted) or a human task. Re-scan can clear it (-> not_found) or upgrade it to a + # direct listing (-> found). + "indirect_exposure": {"submitted", "human_task_queued", "not_found", "found", "blocked"}, + "action_selected": {"submitted", "human_task_queued", "blocked"}, + "submitted": {"verification_pending", "awaiting_processing", "human_task_queued", "blocked"}, + # verification_pending -> awaiting_processing: the verify link was opened/acknowledged and the + # broker is now processing the removal (their stated window). confirmed_removed still requires a + # verifying re-scan, never the submission flow's own say-so. + "verification_pending": {"awaiting_processing", "confirmed_removed", "human_task_queued", "blocked"}, + "awaiting_processing": {"confirmed_removed", "human_task_queued", "blocked"}, + "confirmed_removed": {"reappeared", "confirmed_removed"}, + "reappeared": {"found", "indirect_exposure"}, + "human_task_queued": { + "found", "indirect_exposure", "action_selected", "submitted", "verification_pending", + "awaiting_processing", "confirmed_removed", "blocked", + }, + # blocked: automated tools (web_extract/proxyless browser) couldn't read the site. A later pass + # -- a stealth/cloud browser OR guiding the operator's own (residential) browser -- can resolve it + # to any real scan verdict, so blocked reaches not_found / indirect_exposure too, not just found. + "blocked": {"searching", "found", "not_found", "indirect_exposure", "action_selected"}, +} + + +def now() -> str: + return _dt.datetime.now(_dt.timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") + + +def load(subject_id: str) -> dict: + return storage.read_json(paths.ledger_path(subject_id), {}) or {} + + +def save(subject_id: str, ledger: dict) -> Path: + return storage.write_json(paths.ledger_path(subject_id), ledger) + + +def new_case(subject_id: str, broker_id: str) -> dict: + return { + "case_id": f"case_{subject_id}_{broker_id}", + "subject_id": subject_id, + "broker_id": broker_id, + "state": "new", + "found": None, + "evidence": {}, + "disclosure_log": [], + "history": [], + } + + +def get_case(subject_id: str, broker_id: str) -> dict: + return load(subject_id).get(broker_id) or new_case(subject_id, broker_id) + + +def can_transition(old: str, new: str) -> bool: + return new == old or new in TRANSITIONS.get(old, set()) + + +def transition(subject_id: str, broker_id: str, new_state: str, **fields) -> dict: + if new_state not in STATES: + raise ValueError(f"unknown state {new_state!r}") + # Lock the whole load-modify-save so a concurrent cron re-scan / other tenant + # can't read a stale ledger and clobber this transition. + with storage.locked(paths.ledger_path(subject_id)): + ledger = load(subject_id) + case = ledger.get(broker_id) or new_case(subject_id, broker_id) + old = case.get("state", "new") + if not can_transition(old, new_state): + raise ValueError(f"illegal transition {old!r} -> {new_state!r} for broker {broker_id!r}") + case["state"] = new_state + for key, value in fields.items(): + case[key] = value + stamp = now() + case.setdefault("history", []).append({"at": stamp, "from": old, "to": new_state}) + ledger[broker_id] = case + save(subject_id, ledger) + storage.append_jsonl( + paths.audit_path(subject_id), + {"at": stamp, "broker_id": broker_id, "event": "transition", "from": old, "to": new_state}, + ) + return case + + +DEFAULT_PROCESSING_DAYS = 14 # when a broker record doesn't state est_processing_days +VERIFICATION_POLL_DAYS = 1 # how soon to re-poll for an unarrived verification email + + +def _plus_days(days: int, start: str | None = None) -> str: + base = _dt.datetime.strptime(start, "%Y-%m-%dT%H:%M:%SZ").replace(tzinfo=_dt.timezone.utc) \ + if start else _dt.datetime.now(_dt.timezone.utc) + return (base + _dt.timedelta(days=days)).strftime("%Y-%m-%dT%H:%M:%SZ") + + +def followup_fields(new_state: str, broker: dict | None = None, + dossier: dict | None = None) -> dict: + """Auto-scheduling stamps for a transition, so nobody has to remember follow-ups. + + submitted / awaiting_processing -> recheck after the broker's stated processing window; + verification_pending -> re-poll the inbox quickly; + confirmed_removed -> periodic reappearance re-scan per subject preference. + """ + if new_state in ("submitted", "awaiting_processing"): + days = ((broker or {}).get("optout") or {}).get("est_processing_days") or DEFAULT_PROCESSING_DAYS + return {"next_recheck_at": _plus_days(int(days))} + if new_state == "verification_pending": + return {"next_recheck_at": _plus_days(VERIFICATION_POLL_DAYS)} + if new_state == "confirmed_removed": + interval = ((dossier or {}).get("preferences") or {}).get("rescan_interval_days") or 120 + return {"removal_confirmed_at": now(), "next_recheck_at": _plus_days(int(interval))} + return {} + + +def due(subject_id: str, at: str | None = None, ledger: dict | None = None) -> list[dict]: + """Cases whose next_recheck_at has arrived - the autonomous follow-up queue.""" + stamp = at or now() + out = [] + for case in (ledger if ledger is not None else load(subject_id)).values(): + when = case.get("next_recheck_at") + if when and when <= stamp: + out.append(case) + out.sort(key=lambda c: c.get("next_recheck_at") or "") + return out + + +def log_disclosure(subject_id: str, broker_id: str, fields: list[str], channel: str) -> dict: + """Record exactly which PII field *names* were disclosed to a broker.""" + with storage.locked(paths.ledger_path(subject_id)): + ledger = load(subject_id) + case = ledger.get(broker_id) or new_case(subject_id, broker_id) + stamp = now() + record = {"at": stamp, "fields": sorted(fields), "channel": channel} + case.setdefault("disclosure_log", []).append(record) + ledger[broker_id] = case + save(subject_id, ledger) + storage.append_jsonl( + paths.audit_path(subject_id), + {"at": stamp, "broker_id": broker_id, "event": "disclosure", + "fields": record["fields"], "channel": channel}, + ) + return record diff --git a/optional-skills/security/unbroker/scripts/legal.py b/optional-skills/security/unbroker/scripts/legal.py new file mode 100644 index 000000000..325687b27 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/legal.py @@ -0,0 +1,63 @@ +"""Render opt-out / legal request text from templates/ with safe substitution. + +Templates use {field} placeholders. Missing fields are left literal (never crash, +never inject blanks that look like real data). Field values come from the +least-disclosure selection in dossier.select_disclosure. +""" +from __future__ import annotations + +from pathlib import Path + +import paths + + +class _SafeDict(dict): + def __missing__(self, key): # leave unknown placeholders untouched + return "{" + key + "}" + + +def template_path(name: str) -> Path: + return paths.templates_dir() / name + + +def render(template_name: str, fields: dict) -> str: + text = template_path(template_name).read_text(encoding="utf-8") + return text.format_map(_SafeDict(fields)) + + +def _join_listings(value) -> str: + if isinstance(value, (list, tuple)): + return "\n".join(str(v) for v in value) + return str(value or "") + + +def _join_identifiers(value) -> str: + """Render the subject's OWN identifiers as a bullet list for an indirect-exposure request.""" + if isinstance(value, (list, tuple)): + return "\n".join(f" - {v}" for v in value if v) + return f" - {value}" if value else "" + + +def render_optout_email(broker: dict, fields: dict) -> str: + ctx = dict(fields) + ctx.setdefault("broker_name", broker.get("name", "the data broker")) + ctx["listing_urls"] = _join_listings(fields.get("listing_urls")) + ctx.setdefault("full_name", fields.get("full_name", "[your name]")) + ctx.setdefault("contact_email", fields.get("contact_email", "[your email]")) + return render("emails/generic-optout.txt", ctx) + + +def render_request(kind: str, broker: dict, fields: dict) -> str: + """kind: generic | ccpa | ccpa_agent | ccpa_indirect | gdpr""" + template = { + "generic": "emails/generic-optout.txt", + "ccpa": "emails/ccpa-deletion.txt", + "ccpa_agent": "emails/ccpa-authorized-agent.txt", + "ccpa_indirect": "emails/ccpa-indirect-deletion.txt", + "gdpr": "emails/gdpr-erasure.txt", + }.get(kind, "emails/generic-optout.txt") + ctx = dict(fields) + ctx.setdefault("broker_name", broker.get("name", "the data broker")) + ctx["listing_urls"] = _join_listings(fields.get("listing_urls")) + ctx["my_identifiers"] = _join_identifiers(fields.get("my_identifiers")) + return render(template, ctx) diff --git a/optional-skills/security/unbroker/scripts/paths.py b/optional-skills/security/unbroker/scripts/paths.py new file mode 100644 index 000000000..887748f41 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/paths.py @@ -0,0 +1,79 @@ +"""Filesystem paths for the unbroker skill (stdlib only). + +All per-subject data lives under PDD_DATA_DIR (default: $HERMES_HOME/unbroker), +which is the same trust boundary Hermes uses for .env and OAuth tokens. +""" +from __future__ import annotations + +import os +from pathlib import Path + + +def hermes_home() -> Path: + return Path(os.environ.get("HERMES_HOME") or (Path.home() / ".hermes")) + + +def data_dir() -> Path: + override = os.environ.get("PDD_DATA_DIR") + return Path(override) if override else hermes_home() / "unbroker" + + +def config_path() -> Path: + return data_dir() / "config.json" + + +def subjects_dir() -> Path: + return data_dir() / "subjects" + + +def subject_dir(subject_id: str) -> Path: + return subjects_dir() / subject_id + + +def dossier_path(subject_id: str) -> Path: + return subject_dir(subject_id) / "dossier.json" + + +def ledger_path(subject_id: str) -> Path: + return subject_dir(subject_id) / "ledger.json" + + +def audit_path(subject_id: str) -> Path: + return subject_dir(subject_id) / "audit.jsonl" + + +def evidence_dir(subject_id: str) -> Path: + return subject_dir(subject_id) / "evidence" + + +def skill_root() -> Path: + """The skill directory (parent of scripts/).""" + return Path(__file__).resolve().parent.parent + + +def brokers_dir() -> Path: + return skill_root() / "references" / "brokers" + + +def brokers_cache_path() -> Path: + """Live broker snapshot pulled from BADBOOL (merged under the curated DB).""" + return data_dir() / "brokers-cache" / "badbool.json" + + +def registry_cache_path() -> Path: + """CA Data Broker Registry snapshot (separate coverage lane; DROP/email, not scanned).""" + return data_dir() / "brokers-cache" / "ca-registry.json" + + +def age_identity_path() -> Path: + """age identity (private key) used for at-rest encryption when enabled. + + Defaults beside the data; point PDD_AGE_IDENTITY at a separate volume/token + for real key separation from the encrypted data. + """ + override = os.environ.get("PDD_AGE_IDENTITY") + return Path(override) if override else data_dir() / "age-identity.txt" + + +def templates_dir() -> Path: + return skill_root() / "templates" diff --git a/optional-skills/security/unbroker/scripts/pdd.py b/optional-skills/security/unbroker/scripts/pdd.py new file mode 100644 index 000000000..09039ab47 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/pdd.py @@ -0,0 +1,810 @@ +#!/usr/bin/env python3 +"""unbroker - deterministic CLI helper. + +The Hermes agent orchestrates scanning and opt-out submission with native tools +(`web_extract`, `browser_navigate`, email mechanisms). THIS CLI owns the +deterministic state: config, dossiers + consent, the broker DB, tier planning, +the ledger + audit log, draft/template rendering, and reports. + +Run it through the `terminal` tool (it can read PII files under HERMES_HOME); +do NOT run it through `execute_code` (that sandbox scrubs env and redacts output). + +Examples: + python pdd.py setup + python pdd.py intake --full-name "Jane Q. Public" --email jane@example.com \ + --city Oakland --state CA --residency US-CA --consent --consent-method self + python pdd.py plan sub_xxxx --priority crucial + python pdd.py record sub_xxxx spokeo found --found true \ + --evidence '{"listing_urls":["https://www.spokeo.com/..."]}' + python pdd.py render-email sub_xxxx spokeo --listing https://www.spokeo.com/... + python pdd.py status sub_xxxx +""" +from __future__ import annotations + +import argparse +import json +import os +import sys +from pathlib import Path + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + +import autopilot # noqa: E402 +import badbool # noqa: E402 +import brokers as brokers_mod # noqa: E402 +import config as config_mod # noqa: E402 +import crypto # noqa: E402 +import dossier as dossier_mod # noqa: E402 +import email_modes # noqa: E402 +import emailer # noqa: E402 +import ledger as ledger_mod # noqa: E402 +import legal # noqa: E402 +import paths as paths_mod # noqa: E402 +import registry # noqa: E402 +import report as report_mod # noqa: E402 +import tiers # noqa: E402 + + +def _out(obj) -> None: + print(json.dumps(obj, indent=2, ensure_ascii=False)) + + +def _require_subject(subject_id: str) -> dict: + d = dossier_mod.load(subject_id) + if not d: + sys.exit(f"error: unknown subject {subject_id!r} (run `intake` first)") + return d + + +def cmd_setup(args) -> None: + if getattr(args, "auto", False): + # Autonomous path: detect capabilities and pick the most autonomous valid + # config without asking anyone. Explicit flags still win below. + cfg = config_mod.auto_configure() + else: + cfg = config_mod.load_config() + for key in ("autonomy", "email_mode", "browser_backend", "tracker_backend", "encryption"): + val = getattr(args, key) + if val: + cfg[key] = val + if cfg.get("encryption") == "age": + if not crypto.age_available(): + sys.exit("error: encryption=age requested but `age`/`age-keygen` not found. " + "Install age (e.g. `brew install age`) or use `--encryption none`.") + crypto.ensure_identity() # generate the key now so encryption is actually engaged + path = config_mod.save_config(cfg) + migrated = _migrate_subjects() # rewrite existing dossiers/ledgers into the new at-rest format + out = { + "config_path": str(path), + "config": cfg, + "encryption_engaged": crypto.is_engaged(), + "detected_upgrades": config_mod.detect_capabilities(), + "migrated_subjects": migrated, + "note": "Defaults are easiest-first (draft email, auto browser, local tracker, no encryption). " + "Pass flags to opt into upgrades, then run `doctor` for a readiness summary.", + } + if cfg.get("encryption") == "age": + out["age_identity"] = str(crypto.identity_path()) + _out(out) + + +def _migrate_subjects() -> int: + """Re-save each subject's dossier + ledger so they match the current at-rest format.""" + sd = paths_mod.subjects_dir() + if not sd.exists(): + return 0 + n = 0 + for child in sorted(sd.iterdir()): + if not child.is_dir(): + continue + sid = child.name + d = dossier_mod.load(sid) + if d is not None: + dossier_mod.save(d) + n += 1 + led = ledger_mod.load(sid) + if led: + ledger_mod.save(sid, led) + return n + + +def _check_writable(path) -> bool: + try: + path.mkdir(parents=True, exist_ok=True) + probe = path / ".write_test" + probe.write_text("x", encoding="utf-8") + probe.unlink() + return True + except OSError: + return False + + +def cmd_doctor(args) -> None: + import platform + + cfg = config_mod.load_config() + caps = config_mod.detect_capabilities() + data = paths_mod.data_dir() + writable = _check_writable(data) + curated = len(brokers_mod._load_curated()) + live = len(brokers_mod.load_live_cache()) + total = len(brokers_mod.load_all()) + + L = ["unbroker - readiness check", "=" * 42, + f"Python : {platform.python_version()}", + f"Data dir : {data} ({'writable' if writable else 'NOT writable'})", + f"Config : autonomy={cfg.get('autonomy', 'full')} email={cfg['email_mode']} " + f"browser={cfg['browser_backend']} " + f"tracker={cfg['tracker_backend']} encryption={cfg['encryption']}", + f"Brokers : {total} available ({curated} curated + {live} live" + + ("" if live else ", run `refresh-brokers` to expand to ~50") + ")", + "", "Opt-in upgrades:"] + rows = [ + ("Cloud browser (Browserbase) *RECOMMENDED*", caps["browserbase"], + "default backend: clears soft CAPTCHAs (Turnstile/hCaptcha) -> more T1", "set BROWSERBASE_API_KEY"), + ("Email auto (AgentMail)", caps["agentmail"], + "send + auto-verify, per-broker aliases (Mode B/C)", "install agentmail skill / set AGENTMAIL_API_KEY"), + ("Email send (CLI SMTP)", caps["smtp_send"], + "`send-email` delivers opt-outs itself (Mode B)", "set EMAIL_ADDRESS / EMAIL_PASSWORD (+ EMAIL_SMTP_HOST)"), + ("Verify-link poll (CLI IMAP)", caps["imap_read"], + "`poll-verification` reads confirmation links itself", "set EMAIL_ADDRESS / EMAIL_PASSWORD (+ EMAIL_IMAP_HOST)"), + ("Google Sheets tracker", caps["google_workspace"], + "shared status dashboard", "set up the google-workspace skill"), + ] + for name, ok, enables, how in rows: + L.append(f" [{'ON ' if ok else 'off'}] {name:<28} {enables}") + if not ok: + L.append(f" enable: {how}") + + # At-rest encryption: report TRUE engagement (configured + key present), not just binary presence. + engaged = crypto.is_engaged() + L.append(f" [{'ON ' if engaged else 'off'}] {'At-rest encryption (age)':<28} " + "encrypts dossiers + ledgers on disk") + if engaged: + L.append(f" key: {crypto.identity_path()} (0600) - guards casual/backup/commit " + "exposure, NOT a full-HERMES_HOME read") + elif cfg["encryption"] == "age": + L.append(" WARNING: encryption=age is SET but NOT engaged (age binary or key missing);" + " dossiers would be PLAINTEXT") + elif caps["age"]: + L.append(" off - dossiers are plaintext (0600). enable: `setup --encryption age`") + else: + L.append(" off - dossiers are plaintext (0600). install `age` first to enable") + + L += ["", "Verdict:", " Ready now in DRAFT mode (no setup needed): scan brokers, draft opt-out", + " emails for you to send, and track everything in the ledger."] + if caps["browserbase"]: + L.append(" Cloud browser ON (recommended default): soft/managed CAPTCHAs " + "(Turnstile/hCaptcha) clear automatically -> those brokers stay T1.") + else: + L.append(" No cloud browser: set BROWSERBASE_API_KEY (the recommended default) so soft " + "CAPTCHAs clear automatically; without it those brokers drop to T2 (human tasks).") + if cfg["email_mode"] == "draft_only": + L.append(" Email is draft-only: you send drafts + click verify links. For hands-off email " + "WITHOUT storing a password, run `setup --email-mode browser` (agent sends + opens " + "verify links via your logged-in webmail); or set EMAIL_* for SMTP/IMAP.") + elif cfg["email_mode"] == "browser": + L.append(" Email mode: browser (no password) - the agent sends opt-outs and opens verify " + "links via the operator's logged-in webmail. Ensure that inbox is signed in in the " + "browser Hermes uses (a cloud browser won't hold the session); else it falls back to drafts.") + if not crypto.is_engaged(): + L.append(" Storage: dossiers are PLAINTEXT JSON (0600 under HERMES_HOME). " + "Run `setup --encryption age` for at-rest encryption.") + if not live: + L.append(" Next: run `refresh-brokers` to load the full broker list.") + + # Freshness: warn when cached lists / curated mechanics are going stale (silent broker rot). + import time as _time + STALE_CACHE_DAYS, STALE_VERIFY_DAYS = 30, 180 + + def _age_days(p) -> float | None: + try: + return (_time.time() - p.stat().st_mtime) / 86400.0 + except OSError: + return None + + fresh = [] + for label, p in [("BADBOOL", paths_mod.brokers_cache_path()), + ("CA registry", paths_mod.registry_cache_path())]: + age = _age_days(p) + if age is None: + fresh.append(f"{label}: not pulled") + elif age > STALE_CACHE_DAYS: + fresh.append(f"{label}: {age:.0f}d old (stale, re-pull)") + stale_curated = documented = 0 + for b in brokers_mod._load_curated(): + conf = b.get("confidence") + lv = b.get("last_verified") + if conf == "documented" or not lv: + documented += 1 + continue + try: + if (_time.time() - _time.mktime(_time.strptime(lv, "%Y-%m-%d"))) / 86400.0 > STALE_VERIFY_DAYS: + stale_curated += 1 + except (ValueError, TypeError): + pass + if fresh: + L.append(" Freshness: " + "; ".join(fresh) + " (run `refresh-brokers`).") + if stale_curated or documented: + L.append(f" Freshness: {stale_curated} curated broker(s) last-verified >{STALE_VERIFY_DAYS}d ago; " + f"{documented} documented broker(s) awaiting first-use verification.") + print("\n".join(L)) + + +def cmd_intake(args) -> None: + if args.json: + data = json.loads(Path(args.json).read_text(encoding="utf-8")) + identity = data["identity"] + consent = data.get("consent", {}) + residency = data.get("residency_jurisdiction", "US") + prefs = data.get("preferences") + else: + if not args.full_name: + sys.exit("error: --full-name (or --json) is required") + identity = {"full_name": args.full_name, "emails": args.email or [], "phones": args.phone or []} + if args.alias: + identity["also_known_as"] = args.alias + if args.dob: + identity["date_of_birth"] = args.dob + addr = {k: v for k, v in {"line1": args.street, "city": args.city, + "state": args.state, "postal": args.postal}.items() if v} + if addr: + identity["current_address"] = addr + priors = [] + for loc in args.prior_location or []: + parts = [p.strip() for p in loc.split(",") if p.strip()] + if not parts: + continue + entry = {"city": parts[0]} + if len(parts) > 1: + entry["state"] = parts[1] + if len(parts) > 2: + entry["postal"] = parts[2] + priors.append(entry) + if priors: + identity["prior_addresses"] = priors + cfg = config_mod.load_config() + consent = {"authorized": bool(args.consent), "method": args.consent_method, "recorded_at": dossier_mod.now()} + residency = args.residency or "US" + prefs = { + "email_mode": args.email_mode or cfg["email_mode"], + "rescan_interval_days": cfg["default_rescan_interval_days"], + } + if args.contact_email: + prefs["contact_email_for_optouts"] = args.contact_email + d = dossier_mod.create(identity, consent, residency, prefs) + _out({"subject_id": d["subject_id"], "authorized": dossier_mod.is_authorized(d), + "residency": residency, "email_mode": (prefs or {}).get("email_mode"), + "names": dossier_mod.all_names(d), + "emails": len(d["identity"].get("emails") or []), + "phones": len(d["identity"].get("phones") or []), + "addresses": len(dossier_mod.all_addresses(d))}) + + +def cmd_brokers(args) -> None: + bl = brokers_mod.by_priority(*(args.priority or [])) if args.priority else brokers_mod.load_all() + _out([ + {"id": b.get("id"), "name": b.get("name"), "priority": b.get("priority"), + "method": (b.get("optout") or {}).get("method"), "owns": b.get("owns") or [], + "source": b.get("source"), "confidence": b.get("confidence", "curated")} + for b in bl + ]) + + +def cmd_refresh_brokers(args) -> None: + res = badbool.refresh(paths_mod.brokers_cache_path()) + curated_ids = {b["id"] for b in brokers_mod._load_curated()} + new = [b["id"] for b in brokers_mod.load_live_cache() if b["id"] not in curated_ids] + out = {**res, "curated": len(curated_ids), "new_from_live": len(new), + "people_search_total": len(brokers_mod.load_all()), + "note": "Live records have confidence=auto; verify their opt-out URL before acting."} + if not getattr(args, "no_registry", False): + try: + reg = registry.refresh_all(paths_mod.registry_cache_path()) + out["registry"] = {"total": reg["total"], "sources": reg["sources"], + "portals": reg["portals"], + "note": "Coverage lane worked via the CA DROP one-shot + CCPA email, " + "not the people-search scan. VT/OR/TX are search portals (no " + "bulk export); CA is the superset. See `drop` and `registry`."} + except Exception as exc: # noqa: BLE001 - registry pull is best-effort + out["registry_error"] = str(exc) + _out(out) + + +def cmd_registry(args) -> None: + recs = brokers_mod.load_registry_cache() + if not recs: + _out({"registered_brokers": 0, + "note": "registry empty - run `refresh-brokers` (pulls the CA Data Broker Registry)"}) + return + fcra = sum(1 for r in recs if (r.get("optout") or {}).get("fcra")) + out = {"registered_brokers": len(recs), "fcra_regulated": fcra, + "source": "CA Data Broker Registry (CPPA, 2025)", "drop_url": registry.DROP_URL, + "other_state_portals": registry.portals()} + if args.search: + q = args.search.lower() + hits = [r for r in recs if q in (r.get("name") or "").lower() + or q in (r.get("id") or "") or q in ((r.get("optout") or {}).get("email") or "").lower()] + out["matches"] = [{"id": r["id"], "name": r["name"], + "email": (r.get("optout") or {}).get("email"), + "url": (r.get("optout") or {}).get("url"), + "fcra": (r.get("optout") or {}).get("fcra")} for r in hits[:args.limit]] + out["match_count"] = len(hits) + _out(out) + + +def cmd_drop(args) -> None: + """The one-shot legal lever: CA DROP deletes from ALL registered brokers at once.""" + d = _require_subject(args.subject) + dossier_mod.require_authorized(d) + reg = brokers_mod.load_registry_cache() + res = (d.get("residency_jurisdiction") or "US").upper() + eligible = res.startswith("US-CA") + if args.filed: + prefs = d.setdefault("preferences", {}) + prefs["drop_filed_at"] = dossier_mod.now() + dossier_mod.save(d) + _out({"subject": args.subject, "drop_filed_at": prefs["drop_filed_at"], + "note": "recorded; `next` will stop surfacing the DROP one-shot"}) + return + _out({ + "subject": args.subject, + "eligible": eligible, + "residency": res, + "drop_url": registry.DROP_URL, + "covers_registered_brokers": len(reg), + "steps": ([ + "Go to privacy.ca.gov/drop and create/verify a DROP account (CA resident).", + "Submit ONE deletion request; it applies to EVERY registered data broker " + f"({len(reg)} in the current registry). Brokers must process starting 2026-08-01.", + "After filing, run `drop --filed` so the loop stops re-surfacing it.", + ] if eligible else [ + "DROP is a California mechanism; this subject's residency is not US-CA.", + "Parity path for non-CA: work the people-search sites via `next`, and send targeted " + "CCPA/GDPR deletion emails to registry brokers that hold this person's data " + "(`registry --search`, then `send-email`).", + ]), + "note": "DROP is the highest-leverage removal: one request covers the whole registry.", + }) + + +def cmd_plan(args) -> None: + d = _require_subject(args.subject) + dossier_mod.require_authorized(d) + cfg = config_mod.load_config() + bl = brokers_mod.by_priority(*(args.priority or [])) if args.priority else brokers_mod.load_all() + bcc = config_mod.browser_clears_captcha(cfg) + if getattr(args, "batch", False): + _out(tiers.batch_plan(d, bl, cfg, ledger_mod.load(args.subject), bcc)) + else: + _out(tiers.plan(d, bl, cfg, bcc)) + + +def cmd_fanout(args) -> None: + d = _require_subject(args.subject) + dossier_mod.require_authorized(d) + bl = brokers_mod.by_priority(*(args.priority or [])) if args.priority else brokers_mod.load_all() + grouping = tiers.fanout(bl, batch_size=args.size) + mode = "scan AND opt-out (operator authorized submissions)" if args.optout \ + else "READ-ONLY scan (submit nothing; reconnaissance only)" + batches = [] + for i, ids in enumerate(grouping["batches"], 1): + brief = ( + f"You are scan worker {i} of {len(grouping['batches'])} for the `unbroker` " + f"skill. First load the `unbroker` skill and read its references/methods.md. " + f"Subject id: {args.subject}. Handle ONLY these brokers: {', '.join(ids)}. " + f"For EACH broker: read references/brokers/.json; run EVERY search vector from " + f"`pdd.py plan {args.subject}` (filtered to your brokers); build URLs from search.url_patterns " + f"and heed url_format_quirks; a 404 is INCONCLUSIVE (rebuild/try the on-site search box), not " + f"not_found; confirm the SUBJECT vs namesakes/relatives before recording; if search.antibot is " + f"set and no stealth/cloud browser is available, record `blocked`. Record each outcome via " + f"`pdd.py record {args.subject} " + f"--found --evidence '{{\"listing_urls\":[...]}}'`. Mode: {mode}. " + f"Log any newly-discovered URL/format quirks into the broker JSON. " + f"Return a concise structured per-broker report." + ) + batches.append({"batch": i, "brokers": ids, "brief": brief}) + _out({ + "subject": args.subject, + "broker_count": grouping["broker_count"], + "batch_size": grouping["batch_size"], + "should_fanout": grouping["should_fanout"], + "batch_count": len(batches), + "batches": batches, + "instruction": ( + "If should_fanout is true you MUST spawn ONE delegate_task subagent per batch IN PARALLEL, " + "passing each batch's `brief`; do not scan all brokers yourself sequentially. Wait for every " + "report, consolidate, then proceed to opt-outs. If false, just scan the brokers inline." + ), + }) + + +def cmd_record(args) -> None: + d = _require_subject(args.subject) + dossier_mod.require_authorized(d) + broker = brokers_mod.get(args.broker) + # Auto-stamp follow-up scheduling (next_recheck_at / removal_confirmed_at) so the + # autonomous loop knows when to come back without anyone remembering to set it. + fields = ledger_mod.followup_fields(args.state, broker, d) + if args.found is not None: + fields["found"] = args.found + if args.evidence: + fields["evidence"] = json.loads(args.evidence) + if args.reason: + fields["human_task_reason"] = args.reason + case = ledger_mod.transition(args.subject, args.broker, args.state, **fields) + if args.disclosed: + ledger_mod.log_disclosure(args.subject, args.broker, args.disclosed, args.channel or "unknown") + _out({"broker": args.broker, "state": case["state"], + "next_recheck_at": case.get("next_recheck_at")}) + + +def _email_request(d: dict, b: dict, kind: str, listings, identifiers) -> tuple[dict, list[str]]: + """Least-disclosure (fields, disclosed_names) for an opt-out/legal email of KIND. + + A removal letter must self-identify. Name + a contact email are already known to the + broker (the name is displayed on the very listing being removed), so not extra exposure. + """ + fields = dossier_mod.select_disclosure(d, (b.get("optout") or {}).get("inputs", [])) + ident = d.get("identity", {}) + if ident.get("full_name"): + fields.setdefault("full_name", ident["full_name"]) + fields.setdefault("contact_email", dossier_mod.contact_email(d) or "") + if listings: + fields["listing_urls"] = listings + if kind == "ccpa_indirect": + # Indirect exposure: name ONLY the subject's own identifiers to scrub from a third party's + # record. Default to the contact email + the subject's name-as-relative if none specified. + # The indirect template renders ONLY these placeholders; do not over-report disclosure with + # unrelated dossier fields (phone/street/postal) that select_disclosure happened to populate. + ids = list(identifiers or []) + if not ids: + ids = [contact for contact in [dossier_mod.contact_email(d)] if contact] + ids.append(f'the name "{ident.get("full_name")}" where it appears as a relative/associated person') + fields = { + "full_name": fields.get("full_name"), + "contact_email": fields.get("contact_email"), + "listing_urls": fields.get("listing_urls"), + "my_identifiers": ids, + } + return fields, ["contact_email", "full_name", "my_identifiers"] + return fields, sorted(fields.keys()) + + +def cmd_render_email(args) -> None: + d = _require_subject(args.subject) + dossier_mod.require_authorized(d) + b = brokers_mod.get(args.broker) + if not b: + sys.exit(f"error: unknown broker {args.broker!r}") + kind = getattr(args, "kind", "generic") or "generic" + fields, disclosed = _email_request(d, b, kind, args.listing, getattr(args, "identifier", None)) + if kind == "generic": + draft = email_modes.render_draft(b, fields) + else: + draft = email_modes.render_request_draft(b, fields, kind=kind) + ledger_mod.log_disclosure(args.subject, args.broker, list(disclosed), f"email_draft:{kind}") + _out({"draft": str(draft), "kind": kind, "disclosed_fields": disclosed}) + + +def cmd_send_email(args) -> None: + """Mode B: render AND deliver the opt-out/legal request - no human in the loop. + + Sends ONLY to an address the broker record itself declares (emailer enforces it), + then records the ledger transition + disclosure and auto-stamps the recheck date. + """ + d = _require_subject(args.subject) + dossier_mod.require_authorized(d) + b = brokers_mod.get(args.broker) + if not b: + sys.exit(f"error: unknown broker {args.broker!r}") + cfg = config_mod.load_config() + mode = cfg.get("email_mode") + if mode not in ("programmatic", "alias", "browser"): + sys.exit("error: email_mode is draft_only; run `setup --email-mode browser` (no password; " + "sends via your logged-in webmail) or `--email-mode programmatic`, or use " + "`render-email` and send it yourself") + if not args.listing: + sys.exit("error: --listing is required (verify-before-disclose: never " + "email a broker about an unconfirmed listing)") + # Idempotency: don't re-send if this case is already submitted/beyond (prevents duplicate + # requests when an action is retried). --force overrides. + _POST_SUBMIT = {"submitted", "verification_pending", "awaiting_processing", "confirmed_removed"} + current = ledger_mod.get_case(args.subject, args.broker).get("state") + if current in _POST_SUBMIT and not getattr(args, "force", False): + _out({"skipped": True, "broker": args.broker, "state": current, + "note": "already submitted; not re-sending (idempotent). Use --force to re-send."}) + return + kind = getattr(args, "kind", "generic") or "generic" + fields, disclosed = _email_request(d, b, kind, args.listing, getattr(args, "identifier", None)) + body = legal.render_optout_email(b, fields) if kind == "generic" else legal.render_request(kind, b, fields) + + if mode == "browser": + # No network / no credentials: hand the agent a recipient-locked payload to send in the + # operator's webmail via browser_* tools. State still records deterministically here. + payload = emailer.browser_send_payload(b, body, to=args.to) + ledger_mod.log_disclosure(args.subject, args.broker, list(disclosed), f"email_browser:{kind}") + case = ledger_mod.transition(args.subject, args.broker, "submitted", + **ledger_mod.followup_fields("submitted", b, d)) + _out({"send_via": "browser", "compose": payload, "kind": kind, "disclosed_fields": disclosed, + "state": case["state"], "next_recheck_at": case.get("next_recheck_at"), + "instruction": "In the operator's logged-in webmail, compose a NEW email to compose.to " + "with compose.subject/body EXACTLY (disclose nothing beyond it) and send " + "it via browser_* tools. Then use `verify-link` on any confirmation reply.", + "note": "recipient is locked to the broker's declared address"}) + return + + result = emailer.send(b, body, to=args.to, + min_interval=float(cfg.get("email_min_interval_seconds", 0) or 0)) + ledger_mod.log_disclosure(args.subject, args.broker, list(disclosed), f"email_sent:{kind}") + case = ledger_mod.transition(args.subject, args.broker, "submitted", + **ledger_mod.followup_fields("submitted", b, d)) + _out({"sent": result, "send_via": "smtp", "kind": kind, "disclosed_fields": disclosed, + "state": case["state"], "next_recheck_at": case.get("next_recheck_at"), + "note": "if this broker verifies by email, `poll-verification` will pick up the link"}) + + +def cmd_verify_link(args) -> None: + """Extract a broker's verification link from email text the agent read in webmail (browser mode). + + IMAP-free counterpart to `poll-verification`: the agent opens the broker's confirmation email + in the operator's webmail, pastes the body here, and gets the anti-phishing-scored link back. + """ + _require_subject(args.subject) + b = brokers_mod.get(args.broker) + if not b: + sys.exit(f"error: unknown broker {args.broker!r}") + text = args.text + if args.file: + text = Path(args.file).read_text(encoding="utf-8", errors="replace") + if not text: + sys.exit("error: provide --text '' (or --file) from the broker's confirmation email") + link = email_modes.extract_verification_link(text, b) + _out({"broker": args.broker, "verification_link": link, + "next": ("browser_navigate the link IN THE SAME browser (sessions are browser-bound), " + f"complete the flow, then `record {args.subject} {args.broker} awaiting_processing`" + if link else + "no broker/opt-out-scoped link found in that text; confirm you opened the right email")}) + + +def cmd_poll_verification(args) -> None: + """Poll the inbox for brokers' verification links (Mode B) - replaces the human click-chase. + + For each in-flight case (submitted / verification_pending with email_verification), + extract the broker's link (anti-phishing scored). A found link auto-advances + submitted -> verification_pending (the email HAS arrived); the agent must then OPEN + the link in its own browser (sessions are browser-bound) and record the next state. + """ + d = _require_subject(args.subject) + dossier_mod.require_authorized(d) + led = ledger_mod.load(args.subject) + targets = [] + for bid, case in sorted(led.items()): + if args.broker and bid != args.broker: + continue + if case.get("state") not in ("submitted", "verification_pending"): + continue + b = brokers_mod.get(bid) + if b and (((b.get("optout") or {}).get("requires")) or {}).get("email_verification"): + targets.append((bid, case, b)) + if not targets: + _out({"subject": args.subject, "results": [], + "note": "no in-flight cases awaiting email verification"}) + return + results = [] + for bid, case, b in targets: + hit = emailer.find_verification_link(b, since_days=args.since_days) + if hit: + if case.get("state") == "submitted": + ledger_mod.transition(args.subject, bid, "verification_pending", + **ledger_mod.followup_fields("verification_pending", b, d)) + results.append({"broker": bid, "verification_link": hit["link"], + "email_from": hit.get("from"), "email_subject": hit.get("subject"), + "next": f"browser_navigate the link IN THE AGENT'S OWN BROWSER, complete " + f"the flow, then `record {args.subject} {bid} awaiting_processing` " + f"(or confirmed_removed only after a verifying re-scan)"}) + else: + results.append({"broker": bid, "verification_link": None, + "next": "no matching email yet; poll again later (next_recheck_at is set)"}) + _out({"subject": args.subject, "results": results}) + + +def cmd_next(args) -> None: + d = _require_subject(args.subject) + dossier_mod.require_authorized(d) + cfg = config_mod.load_config() + bl = brokers_mod.by_priority(*(args.priority or [])) if args.priority else brokers_mod.load_all() + _out(autopilot.next_actions(d, bl, cfg, ledger_mod.load(args.subject))) + + +def cmd_tasks(args) -> None: + _require_subject(args.subject) + print(report_mod.human_tasks_markdown(args.subject)) + + +def cmd_due(args) -> None: + _require_subject(args.subject) + cases = ledger_mod.due(args.subject) + _out({"subject": args.subject, "due_count": len(cases), + "cases": [{"broker_id": c.get("broker_id"), "state": c.get("state"), + "next_recheck_at": c.get("next_recheck_at")} for c in cases], + "note": "run `next` for the concrete follow-up action per case"}) + + +def cmd_status(args) -> None: + _require_subject(args.subject) + print(report_mod.render_markdown(args.subject)) + + +def cmd_report(args) -> None: + _require_subject(args.subject) + if args.sheets: + _out(report_mod.sheets_rows(args.subject)) + else: + print(report_mod.render_markdown(args.subject)) + + +def build_parser() -> argparse.ArgumentParser: + p = argparse.ArgumentParser(prog="pdd", description="unbroker helper CLI") + sub = p.add_subparsers(dest="cmd", required=True) + + s = sub.add_parser("setup", help="write install config (easiest-first defaults; --auto = most autonomous)") + s.add_argument("--auto", action="store_true", + help="detect capabilities and pick the most autonomous valid config (no questions)") + s.add_argument("--autonomy", dest="autonomy", choices=sorted(config_mod.VALID["autonomy"])) + s.add_argument("--email-mode", dest="email_mode", choices=sorted(config_mod.VALID["email_mode"])) + s.add_argument("--browser-backend", dest="browser_backend", choices=sorted(config_mod.VALID["browser_backend"])) + s.add_argument("--tracker-backend", dest="tracker_backend", choices=sorted(config_mod.VALID["tracker_backend"])) + s.add_argument("--encryption", dest="encryption", choices=sorted(config_mod.VALID["encryption"])) + s.set_defaults(func=cmd_setup) + + s = sub.add_parser("doctor", help="readiness check: config, brokers, available upgrades") + s.set_defaults(func=cmd_doctor) + + s = sub.add_parser("intake", help="create a subject dossier (records consent)") + s.add_argument("--json", help="path to a dossier JSON file (overrides flags)") + s.add_argument("--full-name") + s.add_argument("--alias", action="append", metavar="NAME", + help="other name the subject is listed under (maiden/married/nickname); repeatable") + s.add_argument("--email", action="append", metavar="EMAIL", help="repeatable") + s.add_argument("--phone", action="append", metavar="PHONE", help="repeatable") + s.add_argument("--street", help="current street line1 (enables reverse-address search)") + s.add_argument("--city") + s.add_argument("--state") + s.add_argument("--postal") + s.add_argument("--prior-location", dest="prior_location", action="append", metavar="City,ST", + help="a past city/state (or City,ST,ZIP); repeatable") + s.add_argument("--dob", help="date of birth YYYY-MM-DD (only used if a broker requires it)") + s.add_argument("--contact-email", dest="contact_email", + help="which email to use for opt-out correspondence (default: first)") + s.add_argument("--residency", help="e.g. US, US-CA") + s.add_argument("--consent", action="store_true", help="subject authorizes removal on their behalf") + s.add_argument("--consent-method", default="self", choices=["self", "written_authorization", "poa"]) + s.add_argument("--email-mode", dest="email_mode", choices=sorted(config_mod.VALID["email_mode"])) + s.set_defaults(func=cmd_intake) + + s = sub.add_parser("brokers", help="list the broker database (curated + live)") + s.add_argument("--priority", action="append", choices=["crucial", "high", "standard", "long_tail"]) + s.set_defaults(func=cmd_brokers) + + s = sub.add_parser("refresh-brokers", + help="pull the latest BADBOOL people-search list + the CA data broker registry") + s.add_argument("--no-registry", dest="no_registry", action="store_true", + help="skip the CA registry pull (BADBOOL people-search only)") + s.set_defaults(func=cmd_refresh_brokers) + + s = sub.add_parser("registry", + help="CA Data Broker Registry coverage (hundreds of brokers; DROP/email lane)") + s.add_argument("--search", help="find registered brokers by name / id / email substring") + s.add_argument("--limit", type=int, default=25, help="max matches to print (default 25)") + s.set_defaults(func=cmd_registry) + + s = sub.add_parser("drop", + help="CA DROP one-shot: delete from ALL registered brokers in one request") + s.add_argument("subject") + s.add_argument("--filed", action="store_true", help="mark DROP as filed (stops `next` surfacing it)") + s.set_defaults(func=cmd_drop) + + s = sub.add_parser("plan", help="compute per-broker tier + next action for a subject") + s.add_argument("subject") + s.add_argument("--priority", action="append", choices=["crucial", "high", "standard", "long_tail"]) + s.add_argument("--batch", action="store_true", + help="phase-oriented batch view: overlays ledger state, groups by next action " + "(unscanned/found/indirect/blocked/in_progress/done), collapses ownership clusters") + s.set_defaults(func=cmd_plan) + + s = sub.add_parser("fanout", help="batch brokers into parallel delegate_task subagents (large runs)") + s.add_argument("subject") + s.add_argument("--priority", action="append", choices=["crucial", "high", "standard", "long_tail"]) + s.add_argument("--size", type=int, default=8, help="brokers per subagent batch (default 8)") + s.add_argument("--optout", action="store_true", + help="brief authorizes opt-out submission (default: read-only scan)") + s.set_defaults(func=cmd_fanout) + + s = sub.add_parser("record", help="record a ledger state transition after an agent action") + s.add_argument("subject") + s.add_argument("broker") + s.add_argument("state", choices=ledger_mod.STATES) + s.add_argument("--found", type=lambda v: v.strip().lower() in ("1", "true", "yes", "y")) + s.add_argument("--evidence", help="JSON object stored as case.evidence") + s.add_argument("--disclosed", action="append", metavar="FIELD", help="field name disclosed") + s.add_argument("--channel", help="disclosure channel, e.g. web_form / email") + s.add_argument("--reason", help="for human_task_queued: why a human is needed (shown in `tasks`)") + s.set_defaults(func=cmd_record) + + s = sub.add_parser("next", help="autonomous action queue: exactly what to do right now") + s.add_argument("subject") + s.add_argument("--priority", action="append", choices=["crucial", "high", "standard", "long_tail"]) + s.set_defaults(func=cmd_next) + + s = sub.add_parser("send-email", help="Mode B: render AND send the opt-out/legal request (records it)") + s.add_argument("subject") + s.add_argument("broker") + s.add_argument("--listing", action="append", metavar="URL", required=False, + help="confirmed listing URL (required: verify-before-disclose)") + s.add_argument("--kind", choices=["generic", "ccpa", "ccpa_agent", "ccpa_indirect", "gdpr"], + default="generic") + s.add_argument("--identifier", action="append", metavar="ID", + help="(ccpa_indirect only) a specific own-identifier to remove; repeatable") + s.add_argument("--to", help="override recipient (must be an address the broker record declares)") + s.add_argument("--force", action="store_true", help="re-send even if already submitted (default: idempotent skip)") + s.set_defaults(func=cmd_send_email) + + s = sub.add_parser("poll-verification", + help="Mode B (IMAP): poll the inbox for brokers' verification links (anti-phishing scored)") + s.add_argument("subject") + s.add_argument("--broker", help="only this broker (default: every in-flight verification case)") + s.add_argument("--since-days", dest="since_days", type=int, default=3) + s.set_defaults(func=cmd_poll_verification) + + s = sub.add_parser("verify-link", + help="browser mode: extract a broker's verification link from pasted webmail text") + s.add_argument("subject") + s.add_argument("broker") + s.add_argument("--text", help="the confirmation email body (read from the operator's webmail)") + s.add_argument("--file", help="path to a file with the email body (alternative to --text)") + s.set_defaults(func=cmd_verify_link) + + s = sub.add_parser("tasks", help="ONE consolidated human-task digest (present at end of run)") + s.add_argument("subject") + s.set_defaults(func=cmd_tasks) + + s = sub.add_parser("due", help="cases whose recheck window has arrived (cron re-scan queue)") + s.add_argument("subject") + s.set_defaults(func=cmd_due) + + s = sub.add_parser("render-email", help="render a Mode-A opt-out / legal-request draft (least-disclosure)") + s.add_argument("subject") + s.add_argument("broker") + s.add_argument("--listing", action="append", metavar="URL", help="confirmed listing URL") + s.add_argument("--kind", choices=["generic", "ccpa", "ccpa_agent", "ccpa_indirect", "gdpr"], + default="generic", + help="request type. 'ccpa_indirect' = delete MY identifiers from a third party's " + "record (indirect exposure); default 'generic' opt-out.") + s.add_argument("--identifier", action="append", metavar="ID", + help="(ccpa_indirect only) a specific own-identifier to request removal of " + "(e.g. an email or phone). Repeatable. Defaults to the contact email + " + "name-as-relative if omitted.") + s.set_defaults(func=cmd_render_email) + + s = sub.add_parser("status", help="print a Markdown status report") + s.add_argument("subject") + s.set_defaults(func=cmd_status) + + s = sub.add_parser("report", help="status report (default) or --sheets rows") + s.add_argument("subject") + s.add_argument("--sheets", action="store_true", help="emit Google Sheets rows as JSON") + s.set_defaults(func=cmd_report) + return p + + +def main(argv=None) -> None: + args = build_parser().parse_args(argv) + try: + args.func(args) + except (PermissionError, ValueError, RuntimeError, FileNotFoundError) as exc: + sys.exit(f"error: {exc}") + + +if __name__ == "__main__": + main() diff --git a/optional-skills/security/unbroker/scripts/registry.py b/optional-skills/security/unbroker/scripts/registry.py new file mode 100644 index 000000000..5e42356de --- /dev/null +++ b/optional-skills/security/unbroker/scripts/registry.py @@ -0,0 +1,293 @@ +"""Ingest the California Data Broker Registry into broker records (coverage breadth). + +The CA registry (CPPA, under the Delete Act) is the authoritative universe of data +brokers doing business with California residents -- ~545 businesses in 2025, each +required to publish a name, website, contact email, and a CCPA-rights/deletion URL. +This is the same universe commercial services (DeleteMe/Incogni/Optery) draw from, +plus the FCRA/GLBA-regulated and marketing/risk brokers most lists omit. + +These are NOT people-search sites you scan with a name -- most have no per-person +lookup UI. They are worked through the LEGAL lane: the CA DROP portal +(privacy.ca.gov/drop) is a single request that deletes from ALL registered brokers +at once (CA residents), and per-broker CCPA deletion emails to the contact address +are the fallback / non-CA path. So registry records are kept in their own lane +(loaded only when asked) and never dumped into the people-search scan pipeline. + +`parse()` is pure (CSV text in, records out) so it is tested offline; `fetch()` is +the only network call and can be bypassed by passing csv_text directly to refresh(). +""" +from __future__ import annotations + +import csv +import datetime +import io +import re +import urllib.request +from pathlib import Path + +import storage + +# CA CPPA registry CSVs are published per year (registry2024.csv, registry2025.csv, ...). +# 2025 is the latest COMPLETE dataset; the current year's file is empty until the Jan +# registration window closes. DEFAULT_URL is the known-good fallback; `ca_candidate_urls` +# probes newer years first so coverage auto-advances when the next year is published. +_CA_CSV = "https://cppa.ca.gov/data_broker_registry/registry{year}.csv" +_CA_FLOOR_YEAR = 2025 +DEFAULT_URL = _CA_CSV.format(year=_CA_FLOOR_YEAR) +DROP_URL = "https://privacy.ca.gov/drop" +USER_AGENT = "Mozilla/5.0 (compatible; unbroker/1.0; data opt-out)" + + +def ca_candidate_urls(today: datetime.date | None = None) -> list[str]: + """Newest-year-first CA registry URLs to try (auto-advances; never below the 2025 floor).""" + year = (today or datetime.date.today()).year + years = list(range(max(year, _CA_FLOOR_YEAR), _CA_FLOOR_YEAR - 1, -1)) + return [_CA_CSV.format(year=y) for y in years] + +# Multi-source registry lane. Only California publishes a clean bulk CSV (with contact email + +# CCPA-rights URL per broker) AND offers a one-shot deletion portal (DROP). Vermont, Oregon, and +# Texas maintain registries too, but only as searchable PORTALS (no reliable bulk export) and with +# no DROP-equivalent -- and they overlap CA heavily (CA is effectively the superset). So they are +# wired as first-class portal sources (official URL surfaced to the operator) rather than scraped. +# Adding any state that later publishes a CSV is a one-line "format: csv" entry (the parser is +# column-detection based, not CA-specific). +SOURCES = { + "ca": {"jurisdiction": "US-CA", "format": "csv", "url": DEFAULT_URL, "has_drop": True, + "name": "California Data Broker Registry (CPPA)"}, + "vt": {"jurisdiction": "US-VT", "format": "portal", "has_drop": False, + "url": "https://bizfilings.vermont.gov/online/DatabrokerInquire/", + "name": "Vermont Data Broker Registry (Secretary of State)"}, + "or": {"jurisdiction": "US-OR", "format": "portal", "has_drop": False, + "url": "https://dfr.oregon.gov/business/licensing/data-broker-registry/Pages/index.aspx", + "name": "Oregon Data Broker Registry (DCBS)"}, + "tx": {"jurisdiction": "US-TX", "format": "portal", "has_drop": False, + "url": "https://texas-sos.appianportalsgov.com/data-broker-registry", + "name": "Texas Data Broker Registry (Secretary of State)"}, +} + + +def portals() -> list[dict]: + """Registry sources that are searchable portals (no bulk export) -- surfaced to the operator.""" + return [{"key": k, "jurisdiction": s["jurisdiction"], "name": s["name"], "url": s["url"]} + for k, s in SOURCES.items() if s["format"] == "portal"] + +# Field label -> substring to locate its column on the header row (robust to +# year-to-year column shifts; the registry re-orders/adds columns between years). +_LABELS = { + "name": "data broker name:", + "dba": "doing business as", + "website": "data broker primary website:", + "email": "primary contact email", + "rights_url": "exercise their ca consumer privacy act rights", + "fcra": "regulated by the federal fair credit reporting act (fcra):", +} + + +def _norm(s: str) -> str: + """Registry CSVs use NBSPs and a BOM; normalize for matching + clean values.""" + return re.sub(r"\s+", " ", (s or "").replace("\ufeff", "").replace("\xa0", " ")).strip() + + +def slug(name: str, website: str = "") -> str: + base = re.sub(r"\.(com|org|net|io|ai|inc|co|us|info|llc)\b", "", (name or "").strip(), flags=re.I) + s = re.sub(r"[^a-z0-9]+", "", base.lower()) + if s: + return s + dom = re.sub(r"^https?://(www\.)?", "", (website or "").lower()) + return re.sub(r"[^a-z0-9]+", "", dom.split("/")[0]) or "broker" + + +def _domain(website: str) -> str: + dom = re.sub(r"^https?://(www\.)?", "", (website or "").strip().lower()) + return dom.split("/")[0] + + +def _find_colmap(rows: list[list[str]]) -> tuple[int, dict[str, int]]: + """Locate the label row (col0 == 'Data broker name:') and map fields to columns.""" + for i, row in enumerate(rows[:5]): + if row and _norm(row[0]).lower().startswith("data broker name:"): + colmap: dict[str, int] = {} + for field, needle in _LABELS.items(): + for j, cell in enumerate(row): + c = _norm(cell).lower() + if needle in c and not c.startswith("if the data broker"): + colmap[field] = j + break + return i, colmap + raise ValueError("CA registry: could not locate the header row") + + +def _get(row: list[str], idx: int | None) -> str: + return _norm(row[idx]) if idx is not None and idx < len(row) else "" + + +def _build(row: list[str], cm: dict[str, int], jurisdiction: str = "US-CA", + has_drop: bool = True) -> dict | None: + name = _get(row, cm.get("name")) + website = _get(row, cm.get("website")) + if not (name or website): + return None + email = _get(row, cm.get("email")) + rights = _get(row, cm.get("rights_url")) + dba = _get(row, cm.get("dba")) + fcra = _get(row, cm.get("fcra")).lower().startswith("y") + state = jurisdiction.split("-")[-1] + + method = "email" if email else ("web_form" if rights else "drop") + if has_drop: + notes = ("Registered CA data broker. One CA DROP request (privacy.ca.gov/drop) deletes from " + "this and every registered broker at once; or send a CCPA deletion request to the " + "contact email.") + else: + notes = (f"Registered {state} data broker (no one-shot delete portal in {state}). Send a " + "CCPA/state-law deletion request to the contact email.") + if fcra: + notes += (" FCRA-regulated: some data is credit-reporting data with separate rules -- deletion " + "may be limited; a consumer report dispute/security-freeze may apply instead.") + return { + "id": slug(name, website), + "name": name or _domain(website), + "dba": dba or None, + "category": "data_broker", + "priority": "long_tail", + "jurisdictions": [jurisdiction], + "search": {"method": "none", "url": website, "fetch": "none", "by": ["registry"]}, + "optout": { + "method": method, + "url": rights or website or None, + "email": email or None, + "requires": {"profile_url": False, "email_verification": False, "captcha": False, + "gov_id": False, "account": False, "phone_callback": False, "payment": False}, + "inputs": ["full_name", "contact_email"], + "deletion": { + "via": "drop" if has_drop else "email", + "email": email or None, + "url": rights or None, + "kinds": ["ccpa", "generic"], + "notes": ("Covered by the CA DROP one-shot (privacy.ca.gov/drop); CCPA email fallback." + if has_drop else "CCPA/state-law deletion email (no one-shot portal)."), + }, + "fcra": fcra, + "est_processing_days": 45, + "notes": notes, + }, + "source": f"{state}-registry", + "confidence": "registry", + "last_verified": None, + } + + +def parse(csv_text: str, jurisdiction: str = "US-CA", has_drop: bool = True) -> list[dict]: + """Parse a data-broker-registry CSV into broker records (deduped by id). + + Column detection is by header label, not fixed position, so any state that publishes a + registry CSV with name/website/email/rights columns parses without new code. + """ + rows = list(csv.reader(io.StringIO(csv_text))) + if not rows: + return [] + header_i, cm = _find_colmap(rows) + out: list[dict] = [] + seen: dict[str, int] = {} + for row in rows[header_i + 1:]: + if not any(c.strip() for c in row): + continue + rec = _build(row, cm, jurisdiction, has_drop) + if not rec: + continue + bid = rec["id"] + if bid in seen: # disambiguate id collisions by domain, then a counter + dom = re.sub(r"[^a-z0-9]+", "", _domain(rec["search"]["url"])) + cand = f"{bid}-{dom}" if dom and dom != bid else bid + while cand in seen: + seen[bid] += 1 + cand = f"{bid}-{seen[bid]}" + rec["id"] = cand + seen.setdefault(rec["id"], 0) + seen.setdefault(bid, 0) + out.append(rec) + return out + + +MIN_EXPECTED_CA = 100 # CA registry has ~500+; far fewer => wrong/empty file, warn + + +def fetch(url: str = DEFAULT_URL, timeout: int = 60) -> str: + req = urllib.request.Request(url, headers={"User-Agent": USER_AGENT}) + with urllib.request.urlopen(req, timeout=timeout) as resp: # noqa: S310 + return resp.read().decode("utf-8", errors="replace") + + +def _fetch_ca_latest() -> tuple[str, list[dict]]: + """Try newest CA registry year first; return (url, records) for the first non-empty.""" + last: tuple[str, list[dict]] = (DEFAULT_URL, []) + for url in ca_candidate_urls(): + try: + recs = parse(fetch(url), jurisdiction="US-CA", has_drop=True) + except Exception: # noqa: BLE001 - a missing year 404s; fall through to older years + continue + if recs: + return url, recs + last = (url, recs) + return last + + +def refresh(cache_path: Path, url: str = DEFAULT_URL, csv_text: str | None = None) -> dict: + """CA single-source refresh: fetch (or accept) the CA CSV and write the cache.""" + text = csv_text if csv_text is not None else fetch(url) + records = parse(text) + storage.write_json(cache_path, records) + fcra = sum(1 for r in records if (r.get("optout") or {}).get("fcra")) + return {"parsed": len(records), "fcra_regulated": fcra, + "cache_path": str(cache_path), "source_url": url} + + +def refresh_all(cache_path: Path, fetched: dict[str, str] | None = None) -> dict: + """Multi-source refresh: pull every CSV source, dedupe across states by domain, cache. + + `fetched` optionally supplies {source_key: csv_text} to bypass the network (tests). CSV + sources are ingested as broker records; portal sources contribute their URL for the operator + (no bulk export exists) but no records. CA is processed first so it wins domain collisions. + """ + all_recs: list[dict] = [] + seen_domains: set[str] = set() + per_source: dict[str, dict] = {} + for key, src in SOURCES.items(): + if src["format"] != "csv": + per_source[key] = {"jurisdiction": src["jurisdiction"], "format": "portal", + "url": src["url"], "records": 0, + "note": "searchable portal (no bulk export); operator/agent searches by name"} + continue + used_url = src["url"] + try: + if fetched is not None: + text = fetched.get(key) + if text is None: + raise RuntimeError("no CSV text supplied") + recs = parse(text, jurisdiction=src["jurisdiction"], has_drop=src["has_drop"]) + elif key == "ca": + used_url, recs = _fetch_ca_latest() # newest-year-first with fallback + else: + recs = parse(fetch(src["url"]), jurisdiction=src["jurisdiction"], has_drop=src["has_drop"]) + except Exception as exc: # noqa: BLE001 - one source failing must not sink the rest + per_source[key] = {"jurisdiction": src["jurisdiction"], "format": "csv", "error": str(exc)} + continue + added = 0 + for r in recs: + dom = _domain(r["search"]["url"]) + if dom and dom in seen_domains: + continue + if dom: + seen_domains.add(dom) + all_recs.append(r) + added += 1 + entry = {"jurisdiction": src["jurisdiction"], "format": "csv", "url": used_url, + "parsed": len(recs), "added_after_dedupe": added, + "fcra": sum(1 for r in recs if (r.get("optout") or {}).get("fcra"))} + if key == "ca" and len(recs) < MIN_EXPECTED_CA: + entry["warning"] = (f"only {len(recs)} parsed (expected >{MIN_EXPECTED_CA}); the CA " + "registry file may be empty/moved - verify the source URL") + per_source[key] = entry + storage.write_json(cache_path, all_recs) + return {"total": len(all_recs), "sources": per_source, "portals": portals(), + "cache_path": str(cache_path)} diff --git a/optional-skills/security/unbroker/scripts/report.py b/optional-skills/security/unbroker/scripts/report.py new file mode 100644 index 000000000..1c38164a2 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/report.py @@ -0,0 +1,161 @@ +"""Status dashboards, Markdown reports, human-task digest, and Google Sheets row export.""" +from __future__ import annotations + +import brokers as brokers_mod +import ledger as ledger_mod + +STATE_LABELS = { + "new": "Not started", + "searching": "Searching", + "not_found": "Not found", + "found": "Found (action needed)", + "indirect_exposure": "Indirect exposure (PII on a relative's record)", + "action_selected": "Action selected", + "submitted": "Submitted", + "verification_pending": "Awaiting verification", + "awaiting_processing": "Processing", + "confirmed_removed": "Removed", + "reappeared": "Reappeared", + "human_task_queued": "Human task", + "blocked": "Blocked", +} + + +def status_counts(subject_id: str) -> dict: + counts: dict[str, int] = {} + for case in ledger_mod.load(subject_id).values(): + state = case.get("state", "new") + counts[state] = counts.get(state, 0) + 1 + return counts + + +def metrics(subject_id: str) -> dict: + """Outcome metrics: what's actually confirmed vs merely claimed, and what's overdue. + + removal_rate is confirmed_removed over cases we actually acted on (found/submitted/... ), + NOT over the whole broker DB, so it reflects real progress on real exposure. `in_flight` + is 'claimed' (submitted/verifying/processing) but not yet re-scan-confirmed. `overdue` + counts cases whose recheck window has already passed (the cron backlog). + """ + c = status_counts(subject_id) + removed = c.get("confirmed_removed", 0) + in_flight = c.get("submitted", 0) + c.get("verification_pending", 0) + c.get("awaiting_processing", 0) + open_found = c.get("found", 0) + c.get("reappeared", 0) + c.get("action_selected", 0) \ + + c.get("indirect_exposure", 0) + acted = removed + in_flight + open_found + c.get("human_task_queued", 0) + c.get("blocked", 0) + return { + "confirmed_removed": removed, + "in_flight_claimed": in_flight, # submitted but NOT yet verified gone + "open_needs_action": open_found, + "blocked": c.get("blocked", 0), + "human_tasks": c.get("human_task_queued", 0), + "acted_total": acted, + "removal_rate": round(removed / acted, 3) if acted else 0.0, + "overdue_rechecks": len(ledger_mod.due(subject_id)), + } + + +def render_markdown(subject_id: str) -> str: + ledger = ledger_mod.load(subject_id) + counts = status_counts(subject_id) + total = sum(counts.values()) + removed = counts.get("confirmed_removed", 0) + + m = metrics(subject_id) + lines = [ + f"# unbroker - status for `{subject_id}`", + "", + f"**{removed} / {total} confirmed removed** · removal rate (of acted-on cases): " + f"{int(m['removal_rate'] * 100)}%", + "", + f"- Confirmed removed: {m['confirmed_removed']}", + f"- In flight (submitted, not yet re-scan-confirmed): {m['in_flight_claimed']}", + f"- Open / needs action: {m['open_needs_action']}", + f"- Blocked (anti-bot): {m['blocked']} · Human tasks: {m['human_tasks']}", + f"- Overdue rechecks (cron backlog): {m['overdue_rechecks']}", + "", + "| State | Count |", + "|---|---|", + ] + for state in ledger_mod.STATES: + if counts.get(state): + lines.append(f"| {STATE_LABELS.get(state, state)} | {counts[state]} |") + + tasks = [c for c in ledger.values() if c.get("state") == "human_task_queued"] + if tasks: + lines += ["", "## Outstanding human tasks"] + for c in tasks: + reason = c.get("human_task_reason", "manual step required") + lines.append(f"- **{c.get('broker_id')}** - {reason}") + + indirect = [c for c in ledger.values() if c.get("state") == "indirect_exposure"] + if indirect: + lines += ["", "## Indirect exposure (your PII on third-party records)", + "Not removable via the broker's self-service opt-out (the record is about someone " + "else). Lever: a targeted CCPA/GDPR delete-my-PII request naming only your own " + "identifiers."] + for c in indirect: + ev = c.get("evidence") or {} + note = ev.get("summary") or "subject's identifiers appear on another person's listing" + lines.append(f"- **{c.get('broker_id')}** - {note}") + return "\n".join(lines) + "\n" + + +def human_tasks_markdown(subject_id: str) -> str: + """ONE consolidated digest of everything that genuinely needs a human. + + The autonomous run accumulates human-only work silently (never interrupting); + this digest is presented once, at the end, so the operator clears it in a + single sitting. Includes queued tasks and blocked-site operator-browser checks. + """ + ledger = ledger_mod.load(subject_id) + tasks = [(bid, c) for bid, c in sorted(ledger.items()) if c.get("state") == "human_task_queued"] + blocked = [(bid, c) for bid, c in sorted(ledger.items()) if c.get("state") == "blocked"] + + lines = [f"# Human tasks for `{subject_id}`", ""] + if not tasks and not blocked: + lines.append("Nothing needs a human right now.") + return "\n".join(lines) + "\n" + + lines.append(f"{len(tasks)} manual step(s) + {len(blocked)} blocked site(s). " + "Everything else ran (or will run) autonomously.") + if tasks: + lines += ["", "## Manual steps"] + for bid, c in tasks: + b = brokers_mod.get(bid) or {} + opt = b.get("optout") or {} + lines.append(f"### {b.get('name', bid)}") + lines.append(f"- Why: {c.get('human_task_reason', 'manual step required')}") + where = opt.get("url") or opt.get("email") or "(see broker record)" + lines.append(f"- Where: {where}") + for q in (opt.get("quirks") or [])[:2]: + lines.append(f"- Note: {q}") + lines.append("- Withhold: SSN and full ID numbers - always.") + lines.append(f"- When done, tell the agent so it records the outcome for `{bid}`.") + if blocked: + lines += ["", "## Blocked sites (open in YOUR browser - it gets through where bots don't)"] + for bid, c in blocked: + b = brokers_mod.get(bid) or {} + url = ((b.get("search") or {}).get("url")) or "(see broker record)" + lines.append(f"- **{b.get('name', bid)}** - open {url}, search the subject, and report " + "the verdict (or a screenshot) back to the agent.") + return "\n".join(lines) + "\n" + + +def sheets_rows(subject_id: str) -> list[list[str]]: + """Header + one row per case for the optional Google Sheets tracker. + + The agent appends these via the `google-workspace` skill, e.g.: + google_api.py sheets append "Sheet1!A:F" --values + """ + rows = [["broker_id", "state", "found", "tier", "removed_at", "next_recheck"]] + for bid, c in sorted(ledger_mod.load(subject_id).items()): + rows.append([ + bid, + c.get("state", ""), + str(c.get("found", "")), + (c.get("automation") or {}).get("tier_used", ""), + c.get("removal_confirmed_at") or "", + c.get("next_recheck_at") or "", + ]) + return rows diff --git a/optional-skills/security/unbroker/scripts/scan.py b/optional-skills/security/unbroker/scripts/scan.py new file mode 100644 index 000000000..3c91c30e7 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/scan.py @@ -0,0 +1,32 @@ +"""Stdlib fetch helper for simple url_pattern brokers (osint-style). + +For JS-rendered or anti-bot pages the agent should use the `web_extract` or +`browser_navigate` tools (and the `scrapling` skill for stealth/Cloudflare). +This helper only covers plain static pages and is intentionally network-light so +it can be mocked in tests. +""" +from __future__ import annotations + +import urllib.error +import urllib.request + +USER_AGENT = "Mozilla/5.0 (compatible; unbroker/1.0; data opt-out)" + + +def fetch(url: str, timeout: int = 20) -> tuple[int, str]: + req = urllib.request.Request(url, headers={"User-Agent": USER_AGENT}) + try: + with urllib.request.urlopen(req, timeout=timeout) as resp: # noqa: S310 (https only by convention) + charset = resp.headers.get_content_charset() or "utf-8" + return getattr(resp, "status", 200), resp.read().decode(charset, errors="replace") + except urllib.error.HTTPError as exc: + return exc.code, "" + except (urllib.error.URLError, TimeoutError, ValueError): + return 0, "" + + +def looks_listed(html: str, match_signal: str | None) -> bool: + """Naive confirmation heuristic for static pages: does the match signal appear?""" + if not html or not match_signal: + return False + return match_signal.lower() in html.lower() diff --git a/optional-skills/security/unbroker/scripts/storage.py b/optional-skills/security/unbroker/scripts/storage.py new file mode 100644 index 000000000..29a66bb80 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/storage.py @@ -0,0 +1,138 @@ +"""Storage helpers (stdlib only): atomic JSON, append-only JSONL, strict perms. + +Default backend is local-json. The optional google-sheets tracker is handled in +report.py by emitting rows for the `google-workspace` skill; this module stays +dependency-free so the hermetic tests never touch the network. +""" +from __future__ import annotations + +import contextlib +import json +import os +import time +from pathlib import Path +from typing import Any + +import crypto +import paths + + +@contextlib.contextmanager +def locked(target: Path, timeout: float = 10.0, stale: float = 30.0): + """Portable advisory lock via an O_EXCL lockfile next to `target`. + + Serializes read-modify-write on shared JSON (the ledger) across concurrent + processes - a cron re-scan overlapping a manual run, or multiple tenants - + so one writer can't clobber another's update. A lock older than `stale` + seconds is treated as abandoned (crashed writer) and broken, so a dead + process can never deadlock the queue. Works on macOS/Linux/Windows (O_EXCL). + """ + ensure_dir(target.parent) + lock = target.with_name(target.name + ".lock") + deadline = time.monotonic() + timeout + while True: + try: + fd = os.open(str(lock), os.O_CREAT | os.O_EXCL | os.O_WRONLY, 0o600) + try: + os.write(fd, str(os.getpid()).encode()) + finally: + os.close(fd) + break + except FileExistsError: + try: + if time.time() - lock.stat().st_mtime > stale: + lock.unlink(missing_ok=True) + continue + except OSError: + pass + if time.monotonic() >= deadline: + raise TimeoutError(f"could not acquire lock {lock} within {timeout}s") + time.sleep(0.05) + try: + yield + finally: + with contextlib.suppress(OSError): + lock.unlink(missing_ok=True) + + +def _secure(path: Path, mode: int) -> None: + try: + os.chmod(path, mode) + except OSError: + pass # non-POSIX / unsupported FS; HERMES_HOME directory perms still apply + + +def ensure_dir(path: Path) -> Path: + path.mkdir(parents=True, exist_ok=True) + _secure(path, 0o700) + return path + + +def _is_sensitive(path: Path) -> bool: + """Per-subject docs (dossier, ledger) are sensitive; config/cache are not.""" + try: + Path(path).resolve().relative_to(paths.subjects_dir().resolve()) + return True + except (ValueError, OSError): + return False + + +def _age_path(path: Path) -> Path: + return path.with_name(path.name + ".age") + + +def _atomic_write(path: Path, data: bytes) -> Path: + tmp = path.with_name(path.name + ".tmp") + tmp.write_bytes(data) + _secure(tmp, 0o600) + os.replace(tmp, path) + _secure(path, 0o600) + return path + + +def write_json(path: Path, obj: Any) -> Path: + ensure_dir(path.parent) + data = (json.dumps(obj, indent=2, ensure_ascii=False) + "\n").encode("utf-8") + if _is_sensitive(path) and crypto.encryption_setting() == "age": + if not crypto.age_available(): + raise RuntimeError( + "encryption=age is configured but `age` is not available; " + "refusing to write PII as plaintext. Install age or run `setup --encryption none`." + ) + target = _atomic_write(_age_path(path), crypto.encrypt(data)) + if path.exists(): + path.unlink() # migrate plaintext -> ciphertext + return target + target = _atomic_write(path, data) + ap = _age_path(path) + if ap.exists(): + ap.unlink() # encryption turned off -> drop stale ciphertext + return target + + +def read_json(path: Path, default: Any = None) -> Any: + ap = _age_path(path) + if ap.exists(): + return json.loads(crypto.decrypt(ap.read_bytes()).decode("utf-8")) + if path.exists(): + return json.loads(path.read_text(encoding="utf-8")) + return default + + +def append_jsonl(path: Path, record: dict) -> Path: + ensure_dir(path.parent) + with path.open("a", encoding="utf-8") as fh: + fh.write(json.dumps(record, ensure_ascii=False) + "\n") + _secure(path, 0o600) + return path + + +def read_jsonl(path: Path) -> list[dict]: + if not path.exists(): + return [] + out: list[dict] = [] + for line in path.read_text(encoding="utf-8").splitlines(): + line = line.strip() + if line: + out.append(json.loads(line)) + return out diff --git a/optional-skills/security/unbroker/scripts/tiers.py b/optional-skills/security/unbroker/scripts/tiers.py new file mode 100644 index 000000000..8d145b8ce --- /dev/null +++ b/optional-skills/security/unbroker/scripts/tiers.py @@ -0,0 +1,269 @@ +"""Automation-tier selection and per-subject action planning. + +Tiers: + T0 fully automated, no verification loop + T1 automated submit + automated verification (email mode B/C, or backend-cleared captcha) + T2 automated submit, verification needs a human (hard captcha / phone callback / account) + T3 human-required end-to-end (gov ID, fax, mail, voice-only phone) +""" +from __future__ import annotations + +import dossier as dossier_mod +import vectors as vectors_mod + +HARD_HUMAN = ("gov_id", "fax", "mail", "phone_voice") + + +def select_tier(broker: dict, email_mode: str = "draft_only", + browser_clears_captcha: bool = False) -> str: + req = ((broker.get("optout") or {}).get("requires")) or {} + + if any(req.get(k) for k in HARD_HUMAN): + return "T3" + if req.get("account"): + return "T2" + + captcha = bool(req.get("captcha")) + if (captcha and not browser_clears_captcha) or req.get("phone_callback"): + return "T2" + + if req.get("email_verification"): + return "T1" if email_mode in ("programmatic", "alias") else "T2" + + if captcha and browser_clears_captcha: + return "T1" + return "T0" + + +def plan(subject_dossier: dict, brokers_list: list[dict], cfg: dict, + browser_clears_captcha: bool = False) -> list[dict]: + email_mode = (subject_dossier.get("preferences") or {}).get("email_mode") \ + or cfg.get("email_mode", "draft_only") + actions: list[dict] = [] + for b in brokers_list: + opt = b.get("optout") or {} + search = b.get("search") or {} + tier = select_tier(b, email_mode, browser_clears_captcha) + disclosure = dossier_mod.select_disclosure(subject_dossier, opt.get("inputs", [])) + svectors = vectors_mod.search_vectors(subject_dossier, b) + actions.append({ + "broker_id": b.get("id"), + "broker_name": b.get("name"), + "priority": b.get("priority"), + "method": opt.get("method"), + "tier": tier, + "human_required": tier == "T3", + "search_url": search.get("url"), + "fetch": search.get("fetch", "web_extract"), + "antibot": search.get("antibot"), + "search_by": vectors_mod.supported_by(b), + "search_vectors": svectors, + "optout_url": opt.get("url"), + "optout_email": opt.get("email"), + "disclosure_fields": sorted(disclosure.keys()), + "owns": b.get("owns") or [], + "notes": opt.get("notes", ""), + "optout_quirks": opt.get("quirks") or [], + "optout_requires": opt.get("requires") or {}, + # The DELETION lane (right-to-delete), distinct from listing suppression. Structured so + # the autopilot can route to it: {via: email|in_flow|web_form, email?, url?, kinds?, notes?} + "deletion": opt.get("deletion") or {}, + # Exact ordered opt-out steps maintained IN the broker record (field-verified knowledge + # lives with the data, not in code). + "optout_playbook": opt.get("playbook") or [], + }) + return actions + + +def fanout(brokers_list: list[dict], batch_size: int = 8) -> dict: + """Group brokers into batches for parallel `delegate_task` scan subagents. + + Scanning many brokers serially is slow and burns context; above `batch_size` + the agent is expected to spawn one subagent per batch (see SKILL.md). + """ + ids = [b.get("id") for b in brokers_list if b.get("id")] + batches = [ids[i:i + batch_size] for i in range(0, len(ids), batch_size)] + return { + "broker_count": len(ids), + "batch_size": batch_size, + "should_fanout": len(ids) > batch_size, + "batches": batches, + } + + +# States that mean "the crawl reached a verdict for this broker". +_SCANNED_STATES = {"found", "not_found", "indirect_exposure", "blocked", "submitted", + "verification_pending", "awaiting_processing", "confirmed_removed", "reappeared", + "action_selected", "human_task_queued"} +# States that still need a deletion action taken. +_ACTIONABLE_STATES = {"found", "indirect_exposure", "reappeared", "action_selected"} + + +def batch_plan(subject_dossier: dict, brokers_list: list[dict], cfg: dict, + ledger: dict | None = None, browser_clears_captcha: bool = False) -> dict: + """Reduce the per-broker plan into a phase-oriented batch view. + + Overlays the current ledger state on each broker, groups by what the operator + should DO next, and collapses ownership clusters so a parent removal that clears + children is ONE action, not N. Read-only: computes, never mutates the ledger. + """ + ledger = ledger or {} + actions = plan(subject_dossier, brokers_list, cfg, browser_clears_captcha) + + # child id -> parent id (only for parents present in this plan set) + child_to_parent: dict[str, str] = {} + for a in actions: + for child in a.get("owns") or []: + child_to_parent[child] = a["broker_id"] + + def state_of(bid: str) -> str: + return (ledger.get(bid) or {}).get("state", "new") + + groups: dict[str, list[dict]] = { + "unscanned": [], # no verdict yet -> Phase 1 crawl + "found": [], # direct removable listing -> Phase 2 opt-out (incl. reappeared/action_selected) + "indirect_exposure": [],# PII on a third party's record -> CCPA/GDPR delete email + "blocked": [], # anti-bot / needs stealth browser -> requeue + "in_progress": [], # submitted / verification_pending / awaiting_processing + "human": [], # human_task_queued -> the end-of-run digest, NOT re-scanning + "done": [], # confirmed_removed + "not_found": [], + } + covered_by_parent: dict[str, list[str]] = {} + + for a in actions: + bid = a["broker_id"] + st = state_of(bid) + # cluster collapse: if a parent in this set is already actioned, the child is covered + parent = child_to_parent.get(bid) + if parent and state_of(parent) in ("found", "reappeared", "action_selected", "submitted", + "verification_pending", "awaiting_processing", + "confirmed_removed", "human_task_queued"): + covered_by_parent.setdefault(parent, []).append(bid) + continue + + row = {"broker_id": bid, "broker_name": a["broker_name"], "priority": a["priority"], + "tier": a["tier"], "method": a["method"], "state": st, + "optout_url": a["optout_url"], "optout_email": a.get("optout_email"), + "clears_children": a.get("owns") or [], + "optout_requires": a.get("optout_requires") or {}, + "optout_quirks": a.get("optout_quirks") or [], + "deletion": a.get("deletion") or {}, + "optout_playbook": a.get("optout_playbook") or [], + "notes": a.get("notes", "")} + if st in ("submitted", "verification_pending", "awaiting_processing"): + groups["in_progress"].append(row) + elif st == "confirmed_removed": + groups["done"].append(row) + elif st in ("reappeared", "action_selected"): + groups["found"].append(row) # still needs the opt-out action + elif st == "human_task_queued": + groups["human"].append(row) # parked for the digest; never re-queued as work + elif st in groups: + groups[st].append(row) + elif st not in _SCANNED_STATES: + groups["unscanned"].append(row) + else: + groups.setdefault(st, []).append(row) + + # PARENTS FIRST: within the actionable 'found' group, order cluster parents (a removal + # that clears children) ahead of standalone listings, most-children first. Working a + # parent before its children is what makes the cluster dedup real -- do them in this order. + groups["found"].sort(key=lambda r: (-len(r.get("clears_children") or []), + {"T0": 0, "T1": 1, "T2": 2, "T3": 3}.get(r.get("tier") or "", 9), + r["broker_id"])) + + return { + "subject": subject_dossier.get("subject_id"), + "phase": "discover" if groups["unscanned"] else "delete", + "counts": {k: len(v) for k, v in groups.items()}, + "groups": groups, + "cluster_savings": {p: kids for p, kids in covered_by_parent.items()}, + "parent_playbook": _parent_playbook(groups["found"]), + "next_actions": _batch_next(groups, covered_by_parent), + } + + +def synthesize_steps(r: dict) -> list[str]: + """Generic ordered opt-out steps derived from an optout record's structured fields. + + Used for any broker without a hand-verified `optout.playbook`. Bespoke, field-verified + step lists live IN the broker JSON (`optout.playbook`) - single source of truth that + accrues knowledge as live runs discover mechanics (see methods.md logging rule). + """ + steps = [f"Opt out at {r.get('optout_url') or r.get('optout_email') or '(see broker record)'}" + + (f" -- clears {', '.join(r['clears_children'])}." if r.get("clears_children") else ".")] + req = r.get("optout_requires") or {} + if req.get("profile_url"): + steps.append("Needs the confirmed profile_url (paste the listing URL you recorded).") + if req.get("email_verification"): + steps.append("Email verification: the same browser/inbox must open the confirmation link.") + if req.get("phone_callback"): + steps.append("Phone-callback code required; queue a human task if no operator is available.") + if req.get("gov_id"): + steps.append("Government ID demanded (T3): human task; never send SSN or a full ID number.") + d = r.get("deletion") or {} + if d.get("email"): + steps.append(f"DELETION lane: a right-to-delete request can be emailed to {d['email']}" + + (f" ({d['notes']})" if d.get("notes") else "") + + " -- prefer deletion over suppression.") + if r.get("notes"): + steps.append(str(r["notes"])) + for q in (r.get("optout_quirks") or [])[:3]: + steps.append(str(q)) + return steps + + +def _parent_playbook(found_rows: list[dict]) -> list[dict]: + """Tailored, ordered opt-out instructions for each cluster PARENT in the found group. + + Steps come from the broker record's own `optout.playbook` (field-verified, maintained with + the data) with a synthesised fallback so the guidance is never empty. Standalone listings + are intentionally omitted -- the playbook exists to make the parents-first order concrete. + """ + playbook: list[dict] = [] + for i, r in enumerate([x for x in found_rows if x.get("clears_children")], start=1): + steps = list(r.get("optout_playbook") or []) or synthesize_steps(r) + playbook.append({ + "order": i, + "broker_id": r["broker_id"], + "broker_name": r["broker_name"], + "tier": r["tier"], + "clears_children": r["clears_children"], + "optout_url": r.get("optout_url"), + "optout_email": r.get("optout_email"), + "deletion": r.get("deletion") or {}, + "steps": steps, + }) + return playbook + + +def _batch_next(groups: dict, covered: dict) -> list[str]: + tips: list[str] = [] + if groups["unscanned"]: + tips.append(f"PHASE 1 (crawl): {len(groups['unscanned'])} broker(s) unscanned -- run `fanout` and " + "scan read-only before any deletion.") + if groups["found"]: + parents = [r for r in groups["found"] if r.get("clears_children")] + if parents: + order = " -> ".join(r["broker_id"] for r in parents) + tips.append(f"PHASE 2 (opt-out): {len(groups['found'])} direct listing(s). DO CLUSTER PARENTS " + f"FIRST, in this order: {order} (see `parent_playbook` for tailored per-parent " + "steps), then the standalone listings.") + else: + tips.append(f"PHASE 2 (opt-out): {len(groups['found'])} direct listing(s) to remove.") + if groups["indirect_exposure"]: + tips.append(f"{len(groups['indirect_exposure'])} indirect-exposure case(s): send a targeted " + "CCPA/GDPR delete-my-PII email (render-email --kind ccpa_indirect), do NOT use the opt-out form.") + if groups["blocked"]: + tips.append(f"{len(groups['blocked'])} blocked (anti-bot): requeue for a stealth/cloud browser " + "pass; don't burn subagent time fighting CAPTCHAs.") + if covered: + n = sum(len(v) for v in covered.values()) + tips.append(f"Cluster dedup: {n} child site(s) covered by parent removals -- skip separate opt-outs.") + if groups["in_progress"]: + tips.append(f"{len(groups['in_progress'])} in progress: resolve verification links, then confirm removal.") + if groups.get("human"): + tips.append(f"{len(groups['human'])} parked human task(s): present via `tasks` at end of run " + "(do not re-scan or re-queue them).") + return tips diff --git a/optional-skills/security/unbroker/scripts/vectors.py b/optional-skills/security/unbroker/scripts/vectors.py new file mode 100644 index 000000000..4fcf006e1 --- /dev/null +++ b/optional-skills/security/unbroker/scripts/vectors.py @@ -0,0 +1,53 @@ +"""Enumerate the search queries to run per broker, across ALL of a subject's identifiers. + +People-search sites index a person under every name, phone, email, and address they +have. A subject with two names (maiden/married) and three past cities can have many +distinct listings on one broker, each found via a different search. `search_vectors` +expands the dossier into the concrete searches to run, filtered by what each broker +supports (`broker.search.by`, default ["name"]). +""" +from __future__ import annotations + +import dossier as dossier_mod + +# What a broker can be searched by; default if a record doesn't declare it. +DEFAULT_BY = ["name"] + + +def supported_by(broker: dict) -> list[str]: + return list((broker.get("search") or {}).get("by") or DEFAULT_BY) + + +def search_vectors(subject_dossier: dict, broker: dict) -> list[dict]: + """List of {by, query} searches to run for this subject on this broker.""" + by = set(supported_by(broker)) + ident = subject_dossier.get("identity", {}) + vectors: list[dict] = [] + + if "name" in by: + names = dossier_mod.all_names(subject_dossier) + locations = dossier_mod.all_locations(subject_dossier) + if locations: + for name in names: + for loc in locations: + vectors.append({"by": "name", + "query": {"full_name": name, "city": loc.get("city"), "state": loc.get("state")}}) + else: + for name in names: + vectors.append({"by": "name", "query": {"full_name": name}}) + + if "phone" in by: + for phone in ident.get("phones") or []: + vectors.append({"by": "phone", "query": {"phone": phone}}) + + if "email" in by: + for email in ident.get("emails") or []: + vectors.append({"by": "email", "query": {"email": email}}) + + if "address" in by: + for a in dossier_mod.all_addresses(subject_dossier): + if a.get("line1"): + vectors.append({"by": "address", + "query": {k: a.get(k) for k in ("line1", "city", "state", "postal")}}) + + return vectors diff --git a/optional-skills/security/unbroker/templates/consent/authorization.md b/optional-skills/security/unbroker/templates/consent/authorization.md new file mode 100644 index 000000000..981591672 --- /dev/null +++ b/optional-skills/security/unbroker/templates/consent/authorization.md @@ -0,0 +1,15 @@ +# Authorization to act on my behalf (data removal) + +I, **{full_name}**, authorize the operator of this tool to act as my agent for the limited purpose of +removing my personal information from data brokers and people-search websites, including submitting +opt-out, deletion, and do-not-sell/share requests under applicable privacy laws (e.g. CCPA/CPRA, +GDPR) on my behalf. + +This authorization is limited to data removal. It does not authorize any other use of my information. + +- Full name: {full_name} +- Date: {date} +- Signature: ______________________________ + +Store the signed copy at the path recorded in the dossier `consent.authorization_artifact`. Required +only when `consent.method` is `written_authorization` or `poa` (not for `self`). diff --git a/optional-skills/security/unbroker/templates/emails/ccpa-authorized-agent.txt b/optional-skills/security/unbroker/templates/emails/ccpa-authorized-agent.txt new file mode 100644 index 000000000..e5e4a09a1 --- /dev/null +++ b/optional-skills/security/unbroker/templates/emails/ccpa-authorized-agent.txt @@ -0,0 +1,24 @@ +Subject: CCPA/CPRA request submitted by authorized agent (delete and opt out) + +To the {broker_name} privacy team, + +I am an authorized agent acting on behalf of the consumer named below, under Cal. Civ. Code +1798.135 and the CCPA/CPRA. Written authorization is on file and available on request. + +On the consumer's behalf I request that you: + + 1. DELETE all personal information you hold about them, and + 2. OPT them OUT of the sale and sharing of their personal information. + +Their information appears at: +{listing_urls} + +Consumer: + Name: {full_name} + Email for confirmation: {contact_email} + +Please confirm completion in writing to the email above. Do not request more sensitive information +than necessary to verify and process this request. + +Sincerely, +Authorized agent for {full_name} diff --git a/optional-skills/security/unbroker/templates/emails/ccpa-deletion.txt b/optional-skills/security/unbroker/templates/emails/ccpa-deletion.txt new file mode 100644 index 000000000..db2d201c7 --- /dev/null +++ b/optional-skills/security/unbroker/templates/emails/ccpa-deletion.txt @@ -0,0 +1,22 @@ +Subject: CCPA/CPRA request to delete and opt out (do not sell or share) + +To the {broker_name} privacy team, + +Under the California Consumer Privacy Act as amended by the CPRA (Cal. Civ. Code 1798.105 and +1798.120), I request that you: + + 1. DELETE all personal information you hold about me, and + 2. OPT me OUT of the sale and sharing of my personal information. + +My information appears at: +{listing_urls} + +Identifying details for this request: + Name: {full_name} + Email: {contact_email} + +Please do not request more sensitive information than necessary to process this request. Confirm +completion in writing to the email above within the statutory timeframe. + +Sincerely, +{full_name} diff --git a/optional-skills/security/unbroker/templates/emails/ccpa-indirect-deletion.txt b/optional-skills/security/unbroker/templates/emails/ccpa-indirect-deletion.txt new file mode 100644 index 000000000..e561e8d6e --- /dev/null +++ b/optional-skills/security/unbroker/templates/emails/ccpa-indirect-deletion.txt @@ -0,0 +1,30 @@ +Subject: Request to delete my personal information from third-party listings (CCPA/CPRA where applicable) + +To the {broker_name} privacy team, + +I am not the primary subject of the listings below, but each one currently exposes MY personal +information as a secondary data point (my email address and/or my name shown as a relative or +associated person). I am writing only about my own personal information, not about the individuals +who are the primary subjects of these records, and I am not requesting any change to their data. + +Please delete and suppress the following personal information about me wherever it appears in your +database and on Spokeo-operated sites, including Thatsthem.com: +{my_identifiers} + +These items currently appear at: +{listing_urls} + +To the extent the California Consumer Privacy Act as amended by the CPRA (Cal. Civ. Code 1798.105) +applies to my personal information, please treat this as a request to delete it and to opt me out of +its sale or sharing (1798.120). Where CCPA does not apply by residency, I ask that you honor this as a +standard removal of my personal information consistent with the policy you apply to such requests. + +Please do not request more information than is necessary to locate and remove these items, and please +do not add any new identifiers to my data in the course of processing this request. Confirm completion +in writing to the email below. + +Name: {full_name} +Contact email: {contact_email} + +Sincerely, +{full_name} diff --git a/optional-skills/security/unbroker/templates/emails/gdpr-erasure.txt b/optional-skills/security/unbroker/templates/emails/gdpr-erasure.txt new file mode 100644 index 000000000..b1b7936af --- /dev/null +++ b/optional-skills/security/unbroker/templates/emails/gdpr-erasure.txt @@ -0,0 +1,19 @@ +Subject: Request for erasure under GDPR Article 17 + +To the {broker_name} data protection officer, + +Under Article 17 of the EU General Data Protection Regulation (and/or the UK GDPR), I request the +erasure of all personal data you hold about me, and under Article 21 I object to its processing. + +My personal data appears at: +{listing_urls} + +Identifying details: + Name: {full_name} + Email: {contact_email} + +Please confirm erasure in writing to the email above within one month, as required by Article 12(3). +Do not request more personal data than necessary to action this request. + +Sincerely, +{full_name} diff --git a/optional-skills/security/unbroker/templates/emails/generic-optout.txt b/optional-skills/security/unbroker/templates/emails/generic-optout.txt new file mode 100644 index 000000000..3fef1bf98 --- /dev/null +++ b/optional-skills/security/unbroker/templates/emails/generic-optout.txt @@ -0,0 +1,15 @@ +Subject: Opt-out and data removal request + +To the {broker_name} privacy team, + +I am writing to request the removal of my personal information from {broker_name} and any sites you +operate or supply. My information currently appears at: +{listing_urls} + +Please suppress and delete the record(s) associated with my name, {full_name}, and do not sell or +share my personal information. + +Please confirm completion to this email address: {contact_email} + +Thank you, +{full_name} diff --git a/tests/skills/test_unbroker_skill.py b/tests/skills/test_unbroker_skill.py new file mode 100644 index 000000000..920d0da79 --- /dev/null +++ b/tests/skills/test_unbroker_skill.py @@ -0,0 +1,1296 @@ +"""Hermetic tests for the unbroker skill. + +Stdlib + pytest only; NO live network, NO browser, NO email. Each test runs against +an isolated temp PDD_DATA_DIR. Runnable with pytest or directly: + + python3 -m pytest tests/test_unbroker_skill.py -q + python3 tests/test_unbroker_skill.py # portable fallback runner +""" +from __future__ import annotations + +import contextlib +import os +import shutil +import sys +import tempfile +from pathlib import Path + +# Resolve the skill's scripts dir across layouts: standalone dev repo (tests/) and hermes-agent +# (tests/skills/ -> optional-skills/security/unbroker/scripts). +_HERE = Path(__file__).resolve() +_REL = ("optional-skills", "security", "unbroker", "scripts") +_CANDIDATES = [ + _HERE.parent.parent / "skill" / "scripts", # standalone dev repo + _HERE.parent.parent.joinpath(*_REL), # standalone layout + _HERE.parent.parent.parent.joinpath(*_REL), # hermes-agent (tests/skills/) +] +SCRIPTS = next((c for c in _CANDIDATES if (c / "pdd.py").exists()), _CANDIDATES[0]) +sys.path.insert(0, str(SCRIPTS)) + +import autopilot # noqa: E402 +import contextlib as _ctx # noqa: E402 +import io as _io # noqa: E402 +import json as _json # noqa: E402 +import smtplib as _smtplib # noqa: E402 +import time as _time # noqa: E402 + +import badbool # noqa: E402 +import brokers # noqa: E402 +import config # noqa: E402 +import crypto # noqa: E402 +import dossier # noqa: E402 +import email_modes # noqa: E402 +import emailer # noqa: E402 +import pdd # noqa: E402 +import legal # noqa: E402 +import ledger # noqa: E402 +import paths # noqa: E402 +import registry # noqa: E402 +import report # noqa: E402 +import storage # noqa: E402 +import tiers # noqa: E402 +import vectors # noqa: E402 + +_AGE = bool(shutil.which("age") and shutil.which("age-keygen")) + + +@contextlib.contextmanager +def temp_env(): + """Isolate every test in a fresh PDD_DATA_DIR.""" + prev = os.environ.get("PDD_DATA_DIR") + with tempfile.TemporaryDirectory() as d: + os.environ["PDD_DATA_DIR"] = str(Path(d) / "pdd") + try: + yield Path(os.environ["PDD_DATA_DIR"]) + finally: + if prev is None: + os.environ.pop("PDD_DATA_DIR", None) + else: + os.environ["PDD_DATA_DIR"] = prev + + +def _consenting(full_name="Jane Q. Public"): + return { + "subject_id": "sub_test01", + "consent": {"authorized": True, "method": "self"}, + "identity": { + "full_name": full_name, + "emails": ["jane@example.com"], + "phones": ["+1-415-555-0137"], + "date_of_birth": "1987-04-12", + "current_address": {"city": "Oakland", "state": "CA", "postal": "94601"}, + }, + "preferences": {"email_mode": "draft_only"}, + } + + +# --- config ------------------------------------------------------------------- + +def test_config_defaults_are_easiest(): + with temp_env(): + cfg = config.load_config() + assert cfg["email_mode"] == "draft_only" + assert cfg["browser_backend"] == "auto" + assert cfg["tracker_backend"] == "local-json" + assert cfg["encryption"] == "none" + + +def test_config_roundtrip_and_validation(): + with temp_env(): + config.save_config({"email_mode": "programmatic"}) + assert config.load_config()["email_mode"] == "programmatic" + try: + config.save_config({"email_mode": "bogus"}) + except ValueError: + pass + else: + raise AssertionError("invalid email_mode should raise") + + +def test_browser_clears_captcha_logic(): + assert config.browser_clears_captcha({"browser_backend": "browserbase"}) is True + assert config.browser_clears_captcha({"browser_backend": "agent-browser"}) is False + assert config.browser_clears_captcha({"browser_backend": "auto"}, env={}) is False + assert config.browser_clears_captcha({"browser_backend": "auto"}, env={"BROWSERBASE_API_KEY": "x"}) is True + + +# --- storage ------------------------------------------------------------------ + +def test_storage_json_and_jsonl_roundtrip(): + with temp_env() as data: + p = data / "x.json" + storage.write_json(p, {"a": 1}) + assert storage.read_json(p) == {"a": 1} + assert storage.read_json(data / "missing.json", []) == [] + log = data / "audit.jsonl" + storage.append_jsonl(log, {"e": 1}) + storage.append_jsonl(log, {"e": 2}) + assert [r["e"] for r in storage.read_jsonl(log)] == [1, 2] + + +# --- at-rest encryption ------------------------------------------------------- + +def test_encryption_off_writes_plaintext(): + with temp_env(): + d = _consenting() + dossier.save(d) + p = paths.dossier_path(d["subject_id"]) + assert p.exists() and not Path(str(p) + ".age").exists() + + +def test_encryption_age_round_trip(): + if not _AGE: + return # age not installed -> effectively skipped (keeps hermetic CI green) + with temp_env(): + config.save_config({"encryption": "age"}) + crypto.ensure_identity() + assert crypto.is_engaged() + d = _consenting() + dossier.save(d) + plain = paths.dossier_path(d["subject_id"]) + enc = Path(str(plain) + ".age") + assert enc.exists() and not plain.exists() # only ciphertext on disk + assert not enc.read_bytes().lstrip().startswith(b"{") # not plaintext JSON + assert dossier.load(d["subject_id"])["identity"]["full_name"] == "Jane Q. Public" + + +def test_encryption_keeps_config_and_audit_plaintext(): + if not _AGE: + return + with temp_env(): + config.save_config({"encryption": "age"}) + crypto.ensure_identity() + # config.json must stay readable plaintext (crypto reads it to decide) + assert config.load_config()["encryption"] == "age" + assert not Path(str(paths.config_path()) + ".age").exists() + # audit log holds field NAMES only, kept plaintext by design + ledger.transition("sub_test01", "spokeo", "found", found=True) + assert paths.audit_path("sub_test01").exists() + + +# --- broker DB ---------------------------------------------------------------- + +def test_seed_broker_db_loads_and_is_well_formed(): + everyone = brokers.load_all() + assert len(everyone) >= 10 + ids = {b["id"] for b in everyone} + assert {"spokeo", "whitepages", "mylife"} <= ids + for b in everyone: + assert b.get("id") and b.get("name") and b.get("priority") in {"crucial", "high", "standard", "long_tail"} + assert (b.get("optout") or {}).get("method") + + +def test_clusters_expose_ownership(): + cl = brokers.clusters() + assert "freepeopledirectory" in cl.get("spokeo", []) + assert "peoplelooker" in cl.get("beenverified", []) + + +# --- tier selection ----------------------------------------------------------- + +def test_every_broker_resolves_to_valid_tier(): + for b in brokers.load_all(): + assert tiers.select_tier(b) in {"T0", "T1", "T2", "T3"} + + +def test_email_verification_tier_shifts_with_mode(): + spokeo = brokers.get("spokeo") + assert tiers.select_tier(spokeo, "draft_only") == "T2" + assert tiers.select_tier(spokeo, "programmatic") == "T1" + assert tiers.select_tier(spokeo, "alias") == "T1" + + +def test_captcha_tier_shifts_with_browser(): + tps = brokers.get("truepeoplesearch") + assert tiers.select_tier(tps, "programmatic", browser_clears_captcha=False) == "T2" + assert tiers.select_tier(tps, "programmatic", browser_clears_captcha=True) == "T1" + + +def test_hard_human_requirements_force_t3(): + assert tiers.select_tier(brokers.get("mylife")) == "T3" # gov_id + # thatsthem's opt-out is Cloudflare-Turnstile gated (captcha:true) -> T2 without a + # captcha-clearing browser backend, T1 with one. (Corrected 2026-06-30 after the + # live scan found the real form gated; the record previously mis-declared captcha:false.) + assert tiers.select_tier(brokers.get("thatsthem")) == "T2" + assert tiers.select_tier(brokers.get("thatsthem"), browser_clears_captcha=True) == "T1" + + +def test_plan_excludes_disallowed_fields(): + d = _consenting() + actions = tiers.plan(d, brokers.load_all(), config.DEFAULT_CONFIG) + for a in actions: + assert "ssn" not in a["disclosure_fields"] + assert "profile_url" not in a["disclosure_fields"] + + +def test_disclosure_maps_street_when_broker_requires_it(): + # thatsthem's opt-out form requires a street line; select_disclosure must surface it from + # current_address.line1 (regression: 'street' was in broker inputs but unmapped, silently dropped). + d = _consenting() + d["identity"]["current_address"]["line1"] = "123 Main St" + out = dossier.select_disclosure(d, ["full_name", "street", "city", "state", "postal"]) + assert out["street"] == "123 Main St" + # and when there is no street on file, it is simply omitted (never a blank/placeholder) + d2 = _consenting() + out2 = dossier.select_disclosure(d2, ["full_name", "street", "city"]) + assert "street" not in out2 + + +def _mini_broker(bid, owns=None, requires=None, notes="", quirks=None): + return {"id": bid, "name": bid.title(), "priority": "high", + "search": {"by": ["name"]}, + "optout": {"method": "web_form", "url": f"https://{bid}.example/optout", + "requires": requires or {}, "inputs": ["full_name"], "owns": owns or [], + "notes": notes, "quirks": quirks or []}, + "owns": owns or []} + + +def test_batch_plan_groups_by_ledger_state(): + d = _consenting() + bl = [_mini_broker("aaa"), _mini_broker("bbb"), _mini_broker("ccc"), _mini_broker("ddd")] + ledger = { + "aaa": {"state": "found"}, + "bbb": {"state": "not_found"}, + "ccc": {"state": "blocked"}, + # ddd absent -> unscanned/new + } + bp = tiers.batch_plan(d, bl, config.DEFAULT_CONFIG, ledger) + assert bp["phase"] == "discover" # ddd is unscanned + assert bp["counts"]["found"] == 1 + assert bp["counts"]["not_found"] == 1 + assert bp["counts"]["blocked"] == 1 + assert bp["counts"]["unscanned"] == 1 + assert any("PHASE 1" in t for t in bp["next_actions"]) + + +def test_batch_plan_collapses_ownership_clusters(): + # a parent that is being acted on (found/submitted/...) covers its children -> child dropped + d = _consenting() + bl = [_mini_broker("parent", owns=["kid"]), _mini_broker("kid")] + ledger = {"parent": {"state": "found"}, "kid": {"state": "found"}} + bp = tiers.batch_plan(d, bl, config.DEFAULT_CONFIG, ledger) + assert bp["cluster_savings"] == {"parent": ["kid"]} + # the child must NOT also appear as its own actionable 'found' row + found_ids = [r["broker_id"] for r in bp["groups"]["found"]] + assert "parent" in found_ids and "kid" not in found_ids + + +def test_batch_plan_orders_found_parents_first(): + # found group must be sorted parents-first, most-children-first, standalone last. + d = _consenting() + bl = [_mini_broker("standalone"), + _mini_broker("smallparent", owns=["c1"]), + _mini_broker("bigparent", owns=["c1b", "c2b", "c3b"])] + ledger = {"standalone": {"state": "found"}, "smallparent": {"state": "found"}, + "bigparent": {"state": "found"}} + bp = tiers.batch_plan(d, bl, config.DEFAULT_CONFIG, ledger) + order = [r["broker_id"] for r in bp["groups"]["found"]] + assert order == ["bigparent", "smallparent", "standalone"] + # PHASE 2 tip spells out the parents-first order and points at the playbook + phase2 = [t for t in bp["next_actions"] if "PHASE 2" in t] + assert phase2 and "PARENTS FIRST" in phase2[0] and "bigparent -> smallparent" in phase2[0] + + +def test_parent_playbook_has_bespoke_and_synthesised_steps(): + d = _consenting() + bespoke = _mini_broker("bespokeparent", owns=["truthfinder", "ussearch"]) + # bespoke steps live IN the broker record (optout.playbook), not in code + bespoke["optout"]["playbook"] = ["Step one from the record", "SUPPRESSION != DELETION warning"] + bl = [bespoke, + _mini_broker("newparent", owns=["k1", "k2"], + requires={"profile_url": True, "email_verification": True}, + notes="synth note", quirks=["q1"]), + _mini_broker("standalone")] + ledger = {b["id"]: {"state": "found"} for b in bl} + bp = tiers.batch_plan(d, bl, config.DEFAULT_CONFIG, ledger) + pb = {p["broker_id"]: p for p in bp["parent_playbook"]} + # standalone (no children) is NOT in the playbook + assert "standalone" not in pb + # bespoke recipe comes verbatim from the record's own playbook + assert pb["bespokeparent"]["steps"] == bespoke["optout"]["playbook"] + # synthesised recipe: newparent reflects its requires-flags + notes + quirks + steps = " ".join(pb["newparent"]["steps"]) + assert "profile_url" in steps and "verification" in steps.lower() + assert "synth note" in steps and "q1" in steps + # ordering is stamped on each entry, parents-first + assert [p["order"] for p in bp["parent_playbook"]] == [1, 2] + + +def test_batch_plan_phase_is_delete_when_all_scanned(): + d = _consenting() + bl = [_mini_broker("aaa"), _mini_broker("bbb")] + ledger = {"aaa": {"state": "confirmed_removed"}, "bbb": {"state": "not_found"}} + bp = tiers.batch_plan(d, bl, config.DEFAULT_CONFIG, ledger) + assert bp["phase"] == "delete" # nothing unscanned + assert bp["counts"]["unscanned"] == 0 + assert bp["counts"]["done"] == 1 + + +# --- ledger / state machine --------------------------------------------------- + +def test_ledger_valid_transition_and_audit(): + with temp_env(): + sid = "sub_test01" + ledger.transition(sid, "spokeo", "searching") + case = ledger.transition(sid, "spokeo", "found", found=True) + assert case["state"] == "found" and case["found"] is True + # found -> submitted must be allowed directly (action_selected is optional) + case = ledger.transition(sid, "spokeo", "submitted") + assert case["state"] == "submitted" + audit = storage.read_jsonl(__import__("paths").audit_path(sid)) + assert any(e["to"] == "found" for e in audit) + + +def test_new_can_record_scan_outcome_directly(): + with temp_env(): + assert ledger.transition("sub_test01", "thatsthem", "found", found=True)["state"] == "found" + assert ledger.transition("sub_test01", "radaris", "not_found")["state"] == "not_found" + # a scan that is bot-blocked on the very first hit must be recordable as blocked directly + # (no need to pass through 'searching' first) -- and not_found -> blocked when a re-scan is gated + assert ledger.transition("sub_test01", "spokeo", "blocked")["state"] == "blocked" + assert ledger.transition("sub_test01", "radaris", "blocked")["state"] == "blocked" + # a blocked site later scanned via the operator's own (residential) browser resolves to a + # real verdict, incl. not_found -- blocked -> not_found must be legal. + assert ledger.transition("sub_test01", "spokeo", "not_found")["state"] == "not_found" + + +def test_indirect_exposure_state_and_transitions(): + with temp_env(): + sid = "sub_test01" + # a scan can land directly on indirect_exposure (PII on a relative's record) + case = ledger.transition(sid, "thatsthem", "indirect_exposure", + evidence={"summary": "email on relative record"}) + assert case["state"] == "indirect_exposure" + # the lever from there is a targeted delete-my-PII request (-> submitted) + assert ledger.transition(sid, "thatsthem", "submitted")["state"] == "submitted" + # and a separate broker: not_found -> indirect_exposure is allowed (found on re-read) + ledger.transition(sid, "radaris", "not_found") + assert ledger.transition(sid, "radaris", "indirect_exposure")["state"] == "indirect_exposure" + # re-scan can clear it + assert ledger.transition(sid, "radaris", "not_found")["state"] == "not_found" + + +def test_ledger_illegal_transition_raises(): + with temp_env(): + try: + ledger.transition("sub_test01", "spokeo", "confirmed_removed") # new -> confirmed_removed + except ValueError: + pass + else: + raise AssertionError("illegal transition should raise") + + +def test_ledger_disclosure_log(): + with temp_env(): + ledger.log_disclosure("sub_test01", "spokeo", ["full_name", "contact_email"], "web_form") + case = ledger.get_case("sub_test01", "spokeo") + assert case["disclosure_log"][0]["fields"] == ["contact_email", "full_name"] + + +# --- dossier / consent / least-disclosure ------------------------------------ + +def test_consent_gate(): + assert dossier.is_authorized(_consenting()) is True + nope = _consenting() + nope["consent"] = {"authorized": False, "method": "self"} + assert dossier.is_authorized(nope) is False + try: + dossier.require_authorized(nope) + except PermissionError: + pass + else: + raise AssertionError("require_authorized should raise for non-consenting subject") + + +def test_least_disclosure_selection(): + d = _consenting() + got = dossier.select_disclosure(d, ["full_name", "contact_email", "profile_url", "ssn", "date_of_birth"]) + assert set(got) == {"full_name", "contact_email", "date_of_birth"} + assert "ssn" not in got and "profile_url" not in got + + +def test_designated_contact_email_overrides_first(): + d = _consenting() + d["identity"]["emails"] = ["first@x.com", "alias@x.com"] + assert dossier.contact_email(d) == "first@x.com" + d["preferences"]["contact_email_for_optouts"] = "alias@x.com" + assert dossier.contact_email(d) == "alias@x.com" + + +# --- alternates / search vectors --------------------------------------------- + +def test_all_names_and_locations_dedupe(): + d = _consenting() + d["identity"]["also_known_as"] = ["Jane Public", "Jane Q. Public"] # 2nd dups primary + d["identity"]["prior_addresses"] = [{"city": "Berkeley", "state": "CA"}, {"city": "Oakland", "state": "CA"}] + assert dossier.all_names(d) == ["Jane Q. Public", "Jane Public"] + assert [loc["city"] for loc in dossier.all_locations(d)] == ["Oakland", "Berkeley"] # current first, deduped + + +def test_search_vectors_fan_out_across_alternates(): + d = _consenting() + d["identity"]["also_known_as"] = ["Jane Smith"] + d["identity"]["prior_addresses"] = [{"city": "Berkeley", "state": "CA"}] + d["identity"]["emails"] = ["a@x.com", "b@y.com"] + d["identity"]["phones"] = ["+1-415-555-0137", "+1-510-555-0199"] + broker = {"id": "x", "search": {"by": ["name", "phone", "email", "address"]}} + v = vectors.search_vectors(d, broker) + assert len([x for x in v if x["by"] == "name"]) == 4 # 2 names x 2 locations + assert len([x for x in v if x["by"] == "phone"]) == 2 + assert len([x for x in v if x["by"] == "email"]) == 2 + assert len([x for x in v if x["by"] == "address"]) == 0 # no street line1 yet + + +def test_search_vectors_respect_broker_capabilities(): + d = _consenting() + d["identity"]["emails"] = ["a@x.com"] + v = vectors.search_vectors(d, {"id": "y", "search": {"by": ["name"]}}) + assert v and all(x["by"] == "name" for x in v) # broker can't search email -> no email vectors + + +def test_search_vectors_address_needs_line1(): + d = _consenting() + d["identity"]["current_address"] = {"line1": "123 Main St", "city": "Oakland", "state": "CA", "postal": "94601"} + v = vectors.search_vectors(d, {"id": "z", "search": {"by": ["address"]}}) + assert len(v) == 1 and v[0]["by"] == "address" and v[0]["query"]["line1"] == "123 Main St" + + +# --- opaque ids / fan-out / antibot ------------------------------------------ + +def test_subject_id_is_opaque_no_name_leak(): + sid = dossier.new_subject_id("Maiden Married Person") + assert sid.startswith("sub_") + assert "maiden" not in sid.lower() and "person" not in sid.lower() + assert dossier.new_subject_id("Maiden Married Person") != sid # not derived from the name + + +def test_fanout_batches_large_runs(): + g = tiers.fanout([{"id": f"b{i}"} for i in range(20)], batch_size=8) + assert g["broker_count"] == 20 and g["should_fanout"] is True + assert len(g["batches"]) == 3 and g["batches"][0] == [f"b{i}" for i in range(8)] + small = tiers.fanout([{"id": "x"}, {"id": "y"}], batch_size=8) + assert small["should_fanout"] is False and small["batches"] == [["x", "y"]] + + +def test_plan_surfaces_antibot(): + d = _consenting() + broker = {"id": "tps", "optout": {"requires": {}}, "search": {"antibot": "datadome", "by": ["name"]}} + actions = tiers.plan(d, [broker], config.DEFAULT_CONFIG) + assert actions[0]["antibot"] == "datadome" + + +def test_plan_surfaces_optout_quirks_and_email(): + d = _consenting() + broker = {"id": "radaris", "search": {"by": ["name"]}, + "optout": {"requires": {}, "email": "x@broker.test", "quirks": ["no profile URL -> email fallback"]}} + a = tiers.plan(d, [broker], config.DEFAULT_CONFIG)[0] + assert a["optout_email"] == "x@broker.test" + assert a["optout_quirks"] == ["no profile URL -> email fallback"] + + +# --- legal / templates -------------------------------------------------------- + +def test_legal_render_keeps_missing_placeholders_literal(): + out = legal.render("emails/generic-optout.txt", {"broker_name": "Spokeo"}) + assert "Spokeo" in out + assert "{full_name}" in out # missing field left literal, never blank-injected + + +def test_render_optout_email_includes_listing_and_name(): + b = brokers.get("spokeo") + out = legal.render_optout_email(b, {"full_name": "Jane Q. Public", + "contact_email": "jane@example.com", + "listing_urls": ["https://www.spokeo.com/jane"]}) + assert "Jane Q. Public" in out and "https://www.spokeo.com/jane" in out + + +def test_render_ccpa_indirect_request_names_only_own_identifiers(): + b = brokers.get("thatsthem") + out = legal.render_request("ccpa_indirect", b, { + "full_name": "Jane Q. Public", + "contact_email": "jane@example.com", + "my_identifiers": ["jane@example.com", 'the name "Jane Q. Public" where it appears as a relative'], + "listing_urls": ["https://thatsthem.com/email/jane@example.com"], + }) + # the request must frame this as the subject's OWN data on someone else's record + assert "not the primary subject" in out + assert "jane@example.com" in out + assert "https://thatsthem.com/email/jane@example.com" in out + # must NOT use the full-opt-out wording that claims the record is about the subject + assert "DELETE all personal information you hold about me" not in out + + +# --- email verification-link extraction -------------------------------------- + +def test_extract_verification_link_prefers_broker_optout_link(): + body = ("Hello,\nClick https://www.spokeo.com/optout/confirm?token=abc to confirm.\n" + "Unrelated: https://ads.example/promo\n") + link = email_modes.extract_verification_link(body, brokers.get("spokeo")) + assert link is not None and "spokeo.com" in link and "ads.example" not in link + + +def test_extract_verification_link_ignores_unrelated_only(): + assert email_modes.extract_verification_link("see https://example.com/news today") is None + + +# --- BADBOOL live-pull parser ------------------------------------------------- + +BADBOOL_FIXTURE = """ +## Search Engines +### Google +This is not a broker; ignore it. + +## People Search Sites + +### \U0001F490 BeenVerified +Find your information and opt out of [people search](https://www.beenverified.com/app/optout/search). + +### \U0001F490 \U0001F4DE MyLife +[Find your information](https://www.mylife.com), and then [opt out](https://www.mylife.com/privacyrequest). + +### \U0001F3AB PimEyes +To opt out, [upload an ID](https://pimeyes.com/en/opt-out-request-form). + +## Special Circumstances +### Not A Broker +Ignore this section entirely. +""" + + +def test_badbool_parses_people_search_section_only(): + recs = badbool.parse(BADBOOL_FIXTURE) + ids = {r["id"] for r in recs} + assert ids == {"beenverified", "mylife", "pimeyes"} # google + notabroker excluded + bv = next(r for r in recs if r["id"] == "beenverified") + assert bv["priority"] == "crucial" + assert "beenverified.com/app/optout" in (bv["optout"]["url"] or "") + assert bv["source"] == "BADBOOL-auto" and bv["confidence"] == "auto" + + +def test_badbool_symbols_map_to_requirements_and_tiers(): + recs = {r["id"]: r for r in badbool.parse(BADBOOL_FIXTURE)} + assert recs["mylife"]["optout"]["requires"]["phone_voice"] is True + assert recs["mylife"]["optout"]["method"] == "phone" + assert tiers.select_tier(recs["mylife"]) == "T3" + assert recs["pimeyes"]["optout"]["requires"]["gov_id"] is True + assert tiers.select_tier(recs["pimeyes"]) == "T3" + + +def test_badbool_merge_keeps_curated_and_adds_new(): + with temp_env(): + badbool.refresh(__import__("paths").brokers_cache_path(), markdown=BADBOOL_FIXTURE) + merged = {b["id"]: b for b in brokers.load_all()} + # curated record wins over the live one + assert merged["beenverified"]["source"] == "BADBOOL" + # a non-curated live record is added with auto confidence + assert "pimeyes" in merged and merged["pimeyes"]["confidence"] == "auto" + + +# --- report ------------------------------------------------------------------- + +def test_status_counts_and_markdown(): + with temp_env(): + sid = "sub_test01" + ledger.transition(sid, "spokeo", "searching") + ledger.transition(sid, "spokeo", "found") + ledger.transition(sid, "thatsthem", "searching") + ledger.transition(sid, "thatsthem", "not_found") + counts = report.status_counts(sid) + assert counts.get("found") == 1 and counts.get("not_found") == 1 + md = report.render_markdown(sid) + assert "status for" in md and "Count" in md + + +# --- autonomy: auto-configure --------------------------------------------------------------- + +def test_autonomy_default_is_full_and_valid(): + with temp_env(): + assert config.load_config()["autonomy"] == "full" + config.save_config({"autonomy": "assisted"}) + assert config.load_config()["autonomy"] == "assisted" + try: + config.save_config({"autonomy": "yolo"}) + except ValueError: + pass + else: + raise AssertionError("invalid autonomy should raise") + + +def test_auto_configure_picks_most_autonomous(): + with temp_env(): + # bare env -> draft_only floor, auto browser (still fully hands-off policy-wise) + cfg = config.auto_configure(env={}) + assert cfg["autonomy"] == "full" + assert cfg["email_mode"] == "draft_only" + assert cfg["browser_backend"] == "auto" + # SMTP creds -> programmatic email; Browserbase key -> cloud browser + cfg = config.auto_configure(env={"EMAIL_ADDRESS": "agent@gmail.com", + "EMAIL_PASSWORD": "app-pass", + "BROWSERBASE_API_KEY": "bb"}) + assert cfg["email_mode"] == "programmatic" + assert cfg["browser_backend"] == "browserbase" + # AgentMail only -> alias mode + assert config.auto_configure(env={"AGENTMAIL_API_KEY": "am"})["email_mode"] == "alias" + # encryption auto-on exactly when age is installed (free privacy, zero human cost) + assert config.auto_configure(env={})["encryption"] == ("age" if _AGE else "none") + + +# --- emailer: programmatic send + verification polling -------------------------------------- + +def test_emailer_settings_inference_and_floor(): + assert emailer.smtp_settings(env={}) is None + assert emailer.imap_settings(env={}) is None + env = {"EMAIL_ADDRESS": "a@gmail.com", "EMAIL_PASSWORD": "p"} + assert emailer.smtp_settings(env)["host"] == "smtp.gmail.com" + assert emailer.smtp_settings(env)["port"] == 587 + assert emailer.imap_settings(env)["host"] == "imap.gmail.com" + assert emailer.imap_settings(env)["port"] == 993 + # unknown provider without an explicit host -> NOT configured (never guess blind) + corp = {"EMAIL_ADDRESS": "a@corp.example", "EMAIL_PASSWORD": "p"} + assert emailer.smtp_settings(corp) is None + s = emailer.smtp_settings({**corp, "EMAIL_SMTP_HOST": "mail.corp.example", + "EMAIL_SMTP_PORT": "465"}) + assert (s["host"], s["port"]) == ("mail.corp.example", 465) + + +class _FakeSMTP: + sent: list = [] + + def __init__(self, host, port, timeout=None): + self.host, self.port = host, port + + def __enter__(self): + return self + + def __exit__(self, *a): + return False + + def ehlo(self): + pass + + def starttls(self): + pass + + def login(self, user, password): + self.user = user + + def send_message(self, msg): + _FakeSMTP.sent.append(msg) + + +def test_emailer_send_locks_recipient_to_broker(): + env = {"EMAIL_ADDRESS": "agent@gmail.com", "EMAIL_PASSWORD": "p"} + broker = {"id": "radaris", "optout": {"email": "privacy@radaris.example"}} + _FakeSMTP.sent = [] + out = emailer.send(broker, "Subject: Remove my listing\n\nBody here", env=env, + _smtp_factory=_FakeSMTP) + assert out["to"] == "privacy@radaris.example" + assert _FakeSMTP.sent[0]["Subject"] == "Remove my listing" + assert "Body here" in _FakeSMTP.sent[0].get_content() + # arbitrary recipients are refused -- this tool cannot be repurposed to email people + try: + emailer.send(broker, "Subject: x\n\nb", to="victim@example.com", env=env, + _smtp_factory=_FakeSMTP) + except PermissionError: + pass + else: + raise AssertionError("non-broker recipient must be refused") + + +def test_emailer_send_requires_config_and_broker_address(): + broker = {"id": "x", "optout": {"email": "privacy@x.example"}} + try: + emailer.send(broker, "Subject: s\n\nb", env={}) + except RuntimeError: + pass + else: + raise AssertionError("unconfigured SMTP must raise (draft fallback, not a crash)") + try: + emailer.send({"id": "y", "optout": {}}, "Subject: s\n\nb", + env={"EMAIL_ADDRESS": "a@gmail.com", "EMAIL_PASSWORD": "p"}) + except RuntimeError: + pass + else: + raise AssertionError("broker without a declared address must raise") + + +def test_browser_send_payload_is_recipient_locked(): + broker = {"id": "radaris", "optout": {"email": "privacy@radaris.example"}} + p = emailer.browser_send_payload(broker, "Subject: Remove my listing\n\nBody here") + assert p["to"] == "privacy@radaris.example" + assert p["subject"] == "Remove my listing" and "Body here" in p["body"] + # the browser lane refuses arbitrary recipients too (same guard as SMTP send) + try: + emailer.browser_send_payload(broker, "Subject: x\n\nb", to="victim@example.com") + except PermissionError: + pass + else: + raise AssertionError("browser lane must refuse a non-broker recipient") + + +def test_browser_email_mode_is_autonomous_without_smtp_or_imap(): + with temp_env(): + assert config.save_config({"email_mode": "browser"}) # mode is valid + persists + d = _consenting() + d["residency_jurisdiction"] = "US-CA" + mailer = _mini_broker("mailer") + mailer["optout"]["method"] = "email" + mailer["optout"]["email"] = "privacy@mailer.example" + verifier = _mini_broker("verifier", requires={"email_verification": True}) + led = {"mailer": {"state": "found"}, + "verifier": {"broker_id": "verifier", "state": "submitted"}} + # browser mode with NO EMAIL_* creds -> still fully autonomous (agent uses webmail) + q = autopilot.next_actions(d, [mailer, verifier], _auto_cfg(email_mode="browser"), led, env={}) + sends = [a for a in q["actions"] if a["type"] == "optout_email_send"] + assert sends and sends[0]["send_via"] == "browser" and sends[0]["to"] == "privacy@mailer.example" + polls = [a for a in q["actions"] if a["type"] == "poll_verification"] + assert polls and polls[0]["via"] == "browser" + assert not q["human_digest"] # browser mode needs no human for these + + +def test_verification_link_from_messages_is_domain_scoped(): + broker = {"id": "spokeo", "name": "Spokeo", + "search": {"url": "https://www.spokeo.com/"}, + "optout": {"url": "https://www.spokeo.com/optout"}} + phish = {"from": "phisher@evil.example", "subject": "verify now", + "text": "click https://evil.example/optout/verify?x=1"} + real = {"from": "no-reply@spokeo.com", "subject": "Confirm your opt out", + "text": "Confirm here: https://www.spokeo.com/optout/verify/abc123"} + hit = emailer.link_from_messages([phish, real], broker) + assert hit["link"] == "https://www.spokeo.com/optout/verify/abc123" + # a phishing-only inbox yields nothing (domain scoping + link scoring) + assert emailer.link_from_messages([phish], broker) is None + + +# --- ledger: follow-up scheduling + due queue ------------------------------------------------ + +def test_verification_pending_to_awaiting_processing_is_legal(): + with temp_env(): + sid = "sub_test01" + ledger.transition(sid, "intelius", "found", found=True) + ledger.transition(sid, "intelius", "submitted") + ledger.transition(sid, "intelius", "verification_pending") + assert ledger.transition(sid, "intelius", "awaiting_processing")["state"] == "awaiting_processing" + + +def test_followup_stamps_and_due_queue(): + broker = {"optout": {"est_processing_days": 10}} + d = {"preferences": {"rescan_interval_days": 30}} + f_sub = ledger.followup_fields("submitted", broker, d) + assert "next_recheck_at" in f_sub + f_done = ledger.followup_fields("confirmed_removed", broker, d) + assert "removal_confirmed_at" in f_done + assert f_done["next_recheck_at"] > f_sub["next_recheck_at"] # 30d rescan > 10d processing + assert ledger.followup_fields("found", broker, d) == {} # scan verdicts get no stamp + led = { + "a": {"broker_id": "a", "state": "awaiting_processing", "next_recheck_at": "2000-01-01T00:00:00Z"}, + "b": {"broker_id": "b", "state": "confirmed_removed", "next_recheck_at": "2999-01-01T00:00:00Z"}, + } + assert [c["broker_id"] for c in ledger.due("sub_x", ledger=led)] == ["a"] + + +def test_badbool_auto_records_have_processing_estimate(): + recs = badbool.parse("## People Search Sites\n### Example\n[opt out](https://example.com/optout)\n") + assert recs[0]["optout"]["est_processing_days"] == 14 # drives next_recheck_at for live records + + +# --- autopilot: the autonomous action queue -------------------------------------------------- + +def _auto_cfg(**over): + cfg = dict(config.DEFAULT_CONFIG) + cfg.update(over) + return cfg + + +def test_next_actions_scan_first_then_optouts_parents_first(): + with temp_env(): + d = _consenting() + bl = [_mini_broker("parent", owns=["kid"]), _mini_broker("kid"), _mini_broker("solo")] + q = autopilot.next_actions(d, bl, _auto_cfg(), {}, env={}) + types = [a["type"] for a in q["actions"]] + assert "scan_inline" in types + assert not any(t.startswith("optout") for t in types) # never act before the crawl + assert q["phase"] == "discover" + led = {"parent": {"state": "found"}, "kid": {"state": "found"}, "solo": {"state": "found"}} + q2 = autopilot.next_actions(d, bl, _auto_cfg(), led, env={}) + opt = [a for a in q2["actions"] if a["type"] == "optout_web_form"] + assert [a["broker_id"] for a in opt] == ["parent", "solo"] # kid covered by parent + assert q2["phase"] == "delete" + + +def test_next_actions_fanout_above_threshold(): + with temp_env(): + d = _consenting() + bl = [_mini_broker(f"b{i:02d}") for i in range(12)] + q = autopilot.next_actions(d, bl, _auto_cfg(), {}, env={}) + assert any(a["type"] == "fanout_scan" for a in q["actions"]) + + +def test_next_actions_routes_human_only_to_digest(): + with temp_env(): + d = _consenting() + t3 = _mini_broker("faxer", requires={"fax": True}) + cb = _mini_broker("callbacker", requires={"phone_callback": True}) + led = {"faxer": {"state": "found"}, "callbacker": {"state": "found"}} + q = autopilot.next_actions(d, [t3, cb], _auto_cfg(), led, env={}) + assert not any(a["type"].startswith("optout") for a in q["actions"]) + reasons = " ".join(t["reason"] for t in q["human_digest"]) + assert "human-only" in reasons and "phone-callback" in reasons + + +def test_next_actions_email_send_vs_draft_digest(): + with temp_env(): + d = _consenting() + b = _mini_broker("mailer") + b["optout"]["method"] = "email" + b["optout"]["email"] = "privacy@mailer.example" + led = {"mailer": {"state": "found"}} + env = {"EMAIL_ADDRESS": "agent@gmail.com", "EMAIL_PASSWORD": "p"} + q = autopilot.next_actions(d, [b], _auto_cfg(email_mode="programmatic"), led, env=env) + assert any(a["type"] == "optout_email_send" for a in q["actions"]) + # draft mode: same case becomes a digest entry with the render command as agent prep + q2 = autopilot.next_actions(d, [b], _auto_cfg(), led, env={}) + assert not any(a["type"] == "optout_email_send" for a in q2["actions"]) + assert any("render-email" in " ".join(t["agent_prep"]) for t in q2["human_digest"]) + + +def test_next_actions_poll_verification_and_due_rechecks(): + with temp_env(): + d = _consenting() + b = _mini_broker("verifier", requires={"email_verification": True}) + led = { + "verifier": {"broker_id": "verifier", "state": "submitted"}, + "done1": {"broker_id": "done1", "state": "confirmed_removed", + "next_recheck_at": "2000-01-01T00:00:00Z"}, + } + env = {"EMAIL_ADDRESS": "agent@gmail.com", "EMAIL_PASSWORD": "p"} + q = autopilot.next_actions(d, [b, _mini_broker("done1")], + _auto_cfg(email_mode="programmatic"), led, env=env) + types = [a["type"] for a in q["actions"]] + assert "poll_verification" in types and "verify_removal" in types + # without IMAP, the verification click becomes a human digest entry instead + q2 = autopilot.next_actions(d, [b], _auto_cfg(), + {"verifier": {"broker_id": "verifier", "state": "submitted"}}, env={}) + assert not any(a["type"] == "poll_verification" for a in q2["actions"]) + assert any("verification email" in t["reason"] for t in q2["human_digest"]) + + +def test_next_actions_blocked_stealth_or_operator_browser(): + with temp_env(): + d = _consenting() + b = _mini_broker("gated") + led = {"gated": {"state": "blocked"}} + q = autopilot.next_actions(d, [b], _auto_cfg(), led, env={"BROWSERBASE_API_KEY": "bb"}) + assert any(a["type"] == "stealth_rescan" for a in q["actions"]) + q2 = autopilot.next_actions(d, [b], _auto_cfg(), led, env={}) + assert any("anti-bot" in t["reason"] for t in q2["human_digest"]) + + +def test_assisted_mode_flags_confirm_first(): + with temp_env(): + d = _consenting() + b = _mini_broker("solo") + led = {"solo": {"state": "found"}} + q = autopilot.next_actions(d, [b], _auto_cfg(autonomy="assisted"), led, env={}) + opt = [a for a in q["actions"] if a["type"] == "optout_web_form"] + assert opt and all(a["confirm_first"] for a in opt) + q2 = autopilot.next_actions(d, [b], _auto_cfg(), led, env={}) + assert all(not a["confirm_first"] for a in q2["actions"] if a["type"] == "optout_web_form") + + +def test_next_actions_refresh_then_done_flags(): + with temp_env(): + d = _consenting() + bl = [_mini_broker("solo")] + led = {"solo": {"state": "not_found"}} + q = autopilot.next_actions(d, bl, _auto_cfg(), led, env={}) + assert any(a["type"] == "refresh_brokers" for a in q["actions"]) # no cache yet + assert q["done_for_now"] is False + storage.write_json(paths.brokers_cache_path(), []) # fresh cache + q2 = autopilot.next_actions(d, bl, _auto_cfg(), led, env={}) + assert q2["actions"] == [] + assert q2["done_for_now"] and q2["fully_done"] + + +def test_parked_and_reappeared_states_group_correctly(): + # Regression: human_task_queued / action_selected / reappeared used to fall into "unscanned", + # so the autonomous loop would try to re-scan parked or already-actioned cases forever. + with temp_env(): + d = _consenting() + bl = [_mini_broker("parked"), _mini_broker("chosen"), _mini_broker("back")] + led = {"parked": {"state": "human_task_queued"}, + "chosen": {"state": "action_selected"}, + "back": {"state": "reappeared"}} + bp = tiers.batch_plan(d, bl, config.DEFAULT_CONFIG, led) + assert bp["counts"]["unscanned"] == 0 + assert bp["phase"] == "delete" + assert [r["broker_id"] for r in bp["groups"]["human"]] == ["parked"] + assert {r["broker_id"] for r in bp["groups"]["found"]} == {"chosen", "back"} + q = autopilot.next_actions(d, bl, _auto_cfg(), led, env={}) + assert not any(a["type"] in ("scan_inline", "fanout_scan") for a in q["actions"]) + assert {a["broker_id"] for a in q["actions"] if a["type"] == "optout_web_form"} == {"chosen", "back"} + + +# --- cluster parents: verified deletion lanes + data-driven playbooks ------------------------ + +def test_cluster_parents_have_playbook_and_deletion_lane(): + """Contract: every curated cluster parent must know EXACTLY how to remove the data. + + A parent record (owns children) must carry a non-empty field-verified optout.playbook + and a structured deletion lane -- deletion beats suppression, and the knowledge lives + in the record, not in code. + """ + for b in brokers._load_curated(): + if not b.get("owns"): + continue + opt = b.get("optout") or {} + bid = b["id"] + assert opt.get("playbook"), f"{bid}: cluster parent missing optout.playbook" + d = opt.get("deletion") or {} + assert d.get("email") or d.get("via"), f"{bid}: cluster parent missing deletion lane" + # every declared email must be a legal send-email recipient + for addr in [opt.get("email"), d.get("email")]: + if addr: + assert addr in emailer.broker_addresses(b), f"{bid}: {addr} not sendable" + + +def test_curated_intelius_playbook_prefers_deletion(): + b = brokers.get("intelius") + steps = " ".join(b["optout"]["playbook"]) + assert "SUPPRESSION != DELETION" in steps # the trap, encoded in the data + assert "DELETE MY USER DATA" in steps # the actual deletion control + assert "privacy@peopleconnect.us" in steps # the email fallback lane + assert b["optout"]["deletion"]["via"] == "in_flow" + + +def test_curated_whitepages_email_lane_is_autonomous(): + """The verified Whitepages pattern: privacyrequest@ bypasses the phone-callback tool.""" + b = brokers.get("whitepages") + opt = b["optout"] + assert opt["method"] == "email" + assert opt["email"] == "privacyrequest@whitepages.com" + assert opt["requires"]["phone_callback"] is False # the callback is only the ALT tool + # programmatic email -> fully automated (T1); draft mode -> needs a human for the verify loop + assert tiers.select_tier(b, email_mode="programmatic") == "T1" + assert tiers.select_tier(b, email_mode="draft_only") == "T2" + + +def test_request_kind_is_residency_honest(): + ca = {"residency_jurisdiction": "US-CA"} + tx = {"residency_jurisdiction": "US-TX"} + de = {"residency_jurisdiction": "EU-DE"} + assert autopilot.request_kind(ca) == "ccpa" + assert autopilot.request_kind(tx) == "generic" # never claim CCPA for a non-CA resident + assert autopilot.request_kind(de) == "gdpr" + assert autopilot.request_kind({}) == "generic" + # broker restriction can force DOWN to generic but never upgrade + assert autopilot.request_kind(tx, allowed=["ccpa", "generic"]) == "generic" + assert autopilot.request_kind(ca, allowed=["generic"]) == "generic" + assert autopilot.request_kind(ca, allowed=["ccpa", "generic"]) == "ccpa" + + +def test_email_lane_routing_and_rescue(): + with temp_env(): + d = _consenting() + d["residency_jurisdiction"] = "US-CA" + env = {"EMAIL_ADDRESS": "agent@gmail.com", "EMAIL_PASSWORD": "p"} + + # (a) primary email method -> email send action with residency-correct kind + mailer = _mini_broker("mailer") + mailer["optout"]["method"] = "email" + mailer["optout"]["email"] = "privacy@mailer.example" + # (b) RESCUE: T3 (gov_id) form but a deletion email exists (no via preference) -> + # email lane instead of the human digest + hard = _mini_broker("hardsite", requires={"gov_id": True}) + hard["optout"]["deletion"] = {"email": "privacy@hardsite.example", + "kinds": ["ccpa", "generic"]} + # (c) phone-callback form with deletion email -> email lane too + cb = _mini_broker("callback2", requires={"phone_callback": True}) + cb["optout"]["deletion"] = {"email": "privacy@callback2.example"} + led = {b: {"state": "found"} for b in ("mailer", "hardsite", "callback2")} + q = autopilot.next_actions(d, [mailer, hard, cb], + _auto_cfg(email_mode="programmatic"), led, env=env) + sends = {a["broker_id"]: a for a in q["actions"] if a["type"] == "optout_email_send"} + assert set(sends) == {"mailer", "hardsite", "callback2"} + assert sends["mailer"]["kind"] == "ccpa" # CA resident + assert sends["hardsite"]["to"] == "privacy@hardsite.example" + assert "rescue" in sends["hardsite"]["why"] + assert not q["human_digest"] # nothing left for a human + + # without SMTP the same brokers fall back honestly: email draft digest / human digest + q2 = autopilot.next_actions(d, [mailer, hard, cb], _auto_cfg(), led, env={}) + assert not any(a["type"] == "optout_email_send" for a in q2["actions"]) + assert len(q2["human_digest"]) == 3 + + +def test_send_email_accepts_deletion_lane_recipient(): + env = {"EMAIL_ADDRESS": "agent@gmail.com", "EMAIL_PASSWORD": "p"} + broker = {"id": "hardsite", + "optout": {"deletion": {"email": "privacy@hardsite.example"}}} + _FakeSMTP.sent = [] + out = emailer.send(broker, "Subject: Delete my data\n\nBody", env=env, _smtp_factory=_FakeSMTP) + assert out["to"] == "privacy@hardsite.example" + + +# --- human-task digest ------------------------------------------------------------------------ + +def test_human_tasks_digest_markdown(): + with temp_env(): + sid = "sub_test01" + ledger.transition(sid, "mylife", "found", found=True) + ledger.transition(sid, "mylife", "human_task_queued", + human_task_reason="gov ID demanded") + ledger.transition(sid, "fastpeoplesearch", "blocked") + md = report.human_tasks_markdown(sid) + assert "gov ID demanded" in md + assert "Withhold" in md + assert "fastpeoplesearch" in md.lower() + # empty ledger -> explicitly says nothing is needed + assert "Nothing needs a human" in report.human_tasks_markdown("sub_other") + + +# --- CA data broker registry (coverage breadth: DROP + email lane) --------------------------- + +def _registry_csv(): + """Mimic the CA registry CSV: junk row 0, label row 1 (with the real NBSP), data rows.""" + import csv as _csv + import io as _io + buf = _io.StringIO() + w = _csv.writer(buf) + w.writerow(["", "junk header the site hides", "", "", "", ""]) + w.writerow(["Data broker\xa0name:", "Doing Business As (DBA), if applicable:", + "Data broker primary website:", "Data broker primary contact email address:", + "Data broker's primary website that contains details on how consumers can exercise " + "their CA Consumer Privacy Act rights, including how to delete their personal information:", + "The data broker or any of its subsidiaries is regulated by the federal Fair Credit " + "Reporting Act (FCRA):"]) + w.writerow(["Acme Data LLC", "AcmeDBA", "https://acme.example", + "privacy@acme.example", "https://acme.example/ccpa", "No"]) + w.writerow(["Credit Bureau Co", "", "https://cbc.example", + "privacy@cbc.example", "https://cbc.example/rights", "Yes"]) + return buf.getvalue() + + +def test_registry_parses_ca_csv(): + recs = registry.parse(_registry_csv()) + assert len(recs) == 2 + assert len({r["id"] for r in recs}) == 2 # unique ids + acme = next(r for r in recs if "acme" in r["id"]) + cbc = next(r for r in recs if "cbc" in r["id"] or "credit" in r["id"]) + assert acme["optout"]["method"] == "email" + assert acme["optout"]["email"] == "privacy@acme.example" + assert acme["optout"]["deletion"]["via"] == "drop" # worked via DROP, not scanning + assert acme["confidence"] == "registry" + assert acme["category"] == "data_broker" + assert acme["optout"]["fcra"] is False and cbc["optout"]["fcra"] is True + + +def test_registry_refresh_isolated_from_people_search(): + with temp_env(): + res = registry.refresh(paths.registry_cache_path(), csv_text=_registry_csv()) + assert res["parsed"] == 2 and res["fcra_regulated"] == 1 + reg_ids = {r["id"] for r in brokers.load_registry_cache()} + assert len(reg_ids) == 2 + # CRITICAL: registry brokers must NOT leak into the people-search scan pipeline + assert reg_ids.isdisjoint({b["id"] for b in brokers.load_all()}) + + +def test_registry_multi_source_framework(): + # generic parser works for a non-CA state (proving multi-source, not CA-hardcoded) + vt = registry.parse(_registry_csv(), jurisdiction="US-VT", has_drop=False) + assert vt[0]["jurisdictions"] == ["US-VT"] + assert vt[0]["source"] == "VT-registry" + assert vt[0]["optout"]["deletion"]["via"] == "email" # no DROP outside CA + assert "no one-shot" in vt[0]["optout"]["deletion"]["notes"].lower() + # VT/OR/TX are surfaced as portals with official URLs (not fabricated rows) + ports = {p["jurisdiction"]: p for p in registry.portals()} + assert set(ports) == {"US-VT", "US-OR", "US-TX"} + assert all(p["url"].startswith("http") for p in ports.values()) + + +def test_registry_refresh_all_ingests_csv_and_lists_portals(): + with temp_env(): + res = registry.refresh_all(paths.registry_cache_path(), fetched={"ca": _registry_csv()}) + assert res["total"] == 2 + assert res["sources"]["ca"]["parsed"] == 2 and res["sources"]["ca"]["added_after_dedupe"] == 2 + assert res["sources"]["vt"]["format"] == "portal" # no bulk export, surfaced as portal + assert len(res["portals"]) == 3 + assert len(brokers.load_registry_cache()) == 2 + + +def test_next_surfaces_drop_for_ca_resident_only(): + with temp_env(): + registry.refresh(paths.registry_cache_path(), csv_text=_registry_csv()) + bl = [_mini_broker("solo")] + + ca = _consenting() + ca["residency_jurisdiction"] = "US-CA" + q = autopilot.next_actions(ca, bl, _auto_cfg(), {}, env={}) + assert any(a["type"] == "drop_submit" for a in q["actions"]) + assert q["coverage"]["registered_data_brokers"] == 2 + assert q["coverage"]["worked_via"] == "CA DROP one-shot" + + tx = _consenting() + tx["residency_jurisdiction"] = "US-TX" + q2 = autopilot.next_actions(tx, bl, _auto_cfg(), {}, env={}) + assert not any(a["type"] == "drop_submit" for a in q2["actions"]) + assert q2["coverage"]["worked_via"] == "targeted CCPA/GDPR email" + + ca["preferences"]["drop_filed_at"] = "2026-01-01T00:00:00Z" + q3 = autopilot.next_actions(ca, bl, _auto_cfg(), {}, env={}) + assert not any(a["type"] == "drop_submit" for a in q3["actions"]) + + +# --- hardening: locking / rate-limit / retry / idempotency / freshness / metrics ------------ + +def test_storage_lock_mutual_exclusion_and_stale_break(): + with temp_env() as data: + target = data / "x.json" + with storage.locked(target): # hold the lock + try: + with storage.locked(target, timeout=0.2): # second acquire must time out + raise AssertionError("second acquire should have timed out") + except TimeoutError: + pass + with storage.locked(target, timeout=0.2): # released -> acquires fine + pass + # a stale lock (old mtime) from a crashed writer gets broken + lock = target.with_name(target.name + ".lock") + lock.write_text("999999") + old = _time.time() - 120 + os.utime(lock, (old, old)) + with storage.locked(target, timeout=0.2, stale=30): + pass + + +def test_email_rate_limit_paces_sends(): + with temp_env() as data: + state = data / "rate.json" + slept, now = [], [1000.0] + emailer._respect_rate_limit(20, lambda s: slept.append(s), lambda: now[0], state) + assert slept == [] # first send: nothing to wait for + now[0] = 1005.0 # only 5s later + emailer._respect_rate_limit(20, lambda s: slept.append(s), lambda: now[0], state) + assert slept and abs(slept[0] - 15) < 0.01 # waited the remaining 15s of the 20s window + + +class _FlakySMTP: + attempts = 0 + + def __init__(self, host, port, timeout=None): + pass + + def __enter__(self): + _FlakySMTP.attempts += 1 + if _FlakySMTP.attempts < 3: + raise _smtplib.SMTPServerDisconnected("transient") + return self + + def __exit__(self, *a): + return False + + def ehlo(self): + pass + + def starttls(self): + pass + + def login(self, u, p): + pass + + def send_message(self, m): + _FlakySMTP.sent = m + + +class _AuthFailSMTP(_FlakySMTP): + def __enter__(self): + return self + + def login(self, u, p): + raise _smtplib.SMTPAuthenticationError(535, b"bad creds") + + +def test_email_send_retries_transient_then_succeeds(): + _FlakySMTP.attempts = 0 + env = {"EMAIL_ADDRESS": "agent@gmail.com", "EMAIL_PASSWORD": "p"} + broker = {"id": "x", "optout": {"email": "privacy@x.example"}} + out = emailer.send(broker, "Subject: s\n\nb", env=env, _smtp_factory=_FlakySMTP, + _sleep=lambda *_: None) + assert out["attempts"] == 3 and "delivery_note" in out + + +def test_email_send_does_not_retry_permanent_error(): + env = {"EMAIL_ADDRESS": "agent@gmail.com", "EMAIL_PASSWORD": "p"} + broker = {"id": "x", "optout": {"email": "privacy@x.example"}} + try: + emailer.send(broker, "Subject: s\n\nb", env=env, _smtp_factory=_AuthFailSMTP, + _sleep=lambda *_: None) + except _smtplib.SMTPAuthenticationError: + pass + else: + raise AssertionError("auth failure must raise immediately, not retry") + + +def _run(argv) -> dict: + buf = _io.StringIO() + with _ctx.redirect_stdout(buf): + pdd.main(argv) + return _json.loads(buf.getvalue()) + + +def test_send_email_is_idempotent_browser_mode(): + with temp_env(): + config.save_config({"email_mode": "browser"}) + sid = _run(["intake", "--full-name", "Jane Q. Public", + "--email", "jane@example.com", "--consent"])["subject_id"] + _run(["record", sid, "radaris", "found", "--found", "true"]) + first = _run(["send-email", sid, "radaris", "--listing", "https://radaris.com/p/x"]) + assert first.get("state") == "submitted" and first.get("send_via") == "browser" + again = _run(["send-email", sid, "radaris", "--listing", "https://radaris.com/p/x"]) + assert again.get("skipped") is True # not re-sent + + +def test_registry_candidate_urls_newest_first_with_floor(): + urls = registry.ca_candidate_urls(__import__("datetime").date(2027, 3, 1)) + assert urls[0].endswith("registry2027.csv") and urls[-1].endswith("registry2025.csv") + assert registry.ca_candidate_urls(__import__("datetime").date(2024, 1, 1))[0].endswith("registry2025.csv") + + +def test_registry_and_badbool_warn_on_too_few(): + with temp_env(): + res = registry.refresh_all(paths.registry_cache_path(), fetched={"ca": _registry_csv()}) + assert "warning" in res["sources"]["ca"] # 2 parsed < MIN_EXPECTED_CA + md = "## People Search Sites\n### One\n[opt out](https://one.example/optout)\n" + bres = badbool.refresh(paths.brokers_cache_path(), markdown=md) + assert bres["parsed"] == 1 and "warning" in bres + + +def test_report_metrics_removal_rate_and_overdue(): + with temp_env(): + sid = "sub_test01" + for st in ("found", "submitted", "awaiting_processing", "confirmed_removed"): + ledger.transition(sid, "a", st, **({"found": True} if st == "found" else {})) + ledger.transition(sid, "b", "found", found=True) # open + for st in ("found", "submitted", "awaiting_processing"): + ledger.transition(sid, "c", st, **({"found": True} if st == "found" else {})) + led = ledger.load(sid) + led["c"]["next_recheck_at"] = "2000-01-01T00:00:00Z" # force overdue + ledger.save(sid, led) + m = report.metrics(sid) + assert m["confirmed_removed"] == 1 + assert m["open_needs_action"] >= 1 and m["in_flight_claimed"] >= 1 + assert m["overdue_rechecks"] >= 1 and 0 < m["removal_rate"] <= 1 + + +if __name__ == "__main__": + failures = [] + tests = [(n, f) for n, f in sorted(globals().items()) if n.startswith("test_") and callable(f)] + for name, fn in tests: + try: + fn() + print(f"PASS {name}") + except Exception as exc: # noqa: BLE001 + failures.append((name, exc)) + print(f"FAIL {name}: {exc!r}") + print(f"\n{len(tests) - len(failures)}/{len(tests)} passed") + sys.exit(1 if failures else 0) From 50db1d6f6d4d209b885cc2dcd2fff2aaa5b74a2f Mon Sep 17 00:00:00 2001 From: SHL0MS Date: Thu, 2 Jul 2026 21:22:25 -0400 Subject: [PATCH 02/46] docs(unbroker): point README image link at hermes-agent; sync test count (85) --- .../security/unbroker/assets/unbroker.png | Bin 455219 -> 358001 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/optional-skills/security/unbroker/assets/unbroker.png b/optional-skills/security/unbroker/assets/unbroker.png index 18f7e3d5193a9df3646e4a085c2e6f91eba7dd3f..3ad0c28d1bcbbb050f766cd6936d3610c9409646 100644 GIT binary patch literal 358001 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�C=F4m`SH_FIfj7p7qwohKJ+$-oIA65Ehr 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

KmkPBhl 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


(>;f&kb5u73H>z&5qQswrw7F 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
alUX>#z_!7Ha-*`AJI8tQX~+r4%akkyRB|Bg^? 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 z

8b<4LRFD-odKb3zPr#^|lwuOto+-#fF*6 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

ow_PZ6AWf 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

e#kzvt!$~ZQHhO+qP}n>A2%`eCs{u-Y@qrRMoD% z)_lesk4f__{D+acdUec@V-S|{V#q?gfKq9zc;b@0it7il;NN8U-S6}OXcPTVB{HB~ zc>NMDr1KTjE$!+cNLgk3gRl9Q=;R^P$#KQA!y>jz()39Pj_Rbw+jf&k>N-{;ymk?a zR;CLz;s3sePPf%ja?Y9NJQN62&_;$A4U11wgr9q7=14;K=|X;Ze#=BdeO$eCPZ~Gf z5j6r~L4`oZox*5@_?@DNTC)bwi<}FCkJl0N1)blj@^@cQ0V}nn=Q?)zL-*AcY^57@ z7`!d*5Fg3eu_}`MTGAKVl3!N-#%jX}yD31>t1X`Pf5-|rb`Xu`$qroW+tq$G{=KYx zuNRR<=^#`Y*;1veDsVYWwnRr71q;AftR~w#l)otICl?U*orp{->Z-Bm_#2cUI2-L5Ovj z=M7?@{btM0^z=ktrmMF-@3PL+vBG9cqWfE3?*Vn;7* zVNW}~mR9dc%eL_$eRsWH%hU~i^*z0s6>Rq}LF@Zd%%*G#`(o*ZLulI;0YMUnh1MHk z+C?$iYq~V=#ZFCi2YK-mYBw?u;3pAg=w!WrVP~9+Y+@Si1SNyU$bLh@s{`I{7s{WU#kuDF`LGilg-bKV9sZC+U?pNN8vhocR zoifNv4UD*1vODddg;T4~YEMTa^TKCe^O%~?E=HQI_h2dAV2&UdYxsrTDt7H&6j5bW zo{nQZe7Yz{yai!sL4n&+IFzY}+6xOxkZ<@+Ox6A&FxM>|#0sDoe_wcNs~=)?mkIwB zs^RuHUz5Fo`D?zEwv|lWatoR(!bmjP4(Qc+EV(``;s1D_1tY%B#r?aK}qXjFXZeZVZaix9f<1*kR(7?_OQs!bM~7 zq?Sgl#QBhmy55UMSsk@mX`TN)Y*gO@HX%XDqV-SC79{S#7iyAVVh>plHQ3sQ<1r3C z;{fn3_eVP;AIleD~=%|t4LAaV%Y>(M0ldf4D%C^3%{=lSLhO<&BV7$m}6P3RH|f}w`@$_@C#?A40_;* zulg=heROueNCm?JL|>%%sb0{0w(9r?Lvjkfr2-(dA2CQ+S^Sy4``R<6Zl*XxoI}5oW?OG2{^%cdg#K z5dD6F_)vG(J>N5NpajmQhs>TagX{xEK3A6X4Y~mm^et@2GUKi4v&oq}ZF;jQ4B)E7 zlImK6jplLjob_r>t7OA|_DYlQS+n4~+LEbwUvGxr0?TXM)%s1OI`87U*ncbl*hDux zO8Z0qQl6J$b4Q{VkEkhBYLSE{0yY2#!=lMzc|30n`fx}-o2hpN=XBiQ z&Gu@h=$#Jj{&DqSjoprdO->@=0!Pa#G}+mqOwV3rHX{klG;7=x5XVfx{3^#nX}T@K0u#h$dFYt!g}2)06RT;Yv+kwB5{-P3P^}7QXN&;R zQv66874R1lC+-^^@ETI=XSK_1{Hz?fLP0pt^pdzV0@AcWH_g7=!e@`R)V^DaQ&oE` zDRy#|%Ju~+FWw5&s8X!%W8$2Tv#>%|pFlHFI5KY5F4ml8Yhbe`+4O4OvpBKdG*bh0 zV%n9wMn@;EDBl{p9aw|p*^PoH9_lmS%g#@a_ycQ^9iXs(%+K7GMdUnR(f5bVpo;Mn-aAB=tR=Zw}=UlY&ZZX|j z1tVKqEK?w?)O1N|Mg7Mc16>u~o>P0q>=B^qF=MuJcly@mL9Tv~P8VmSd3kl;X+y6+ zfhvw=!C?Vz2^MI$+MRh^ip%za1-_Qm*g_v5?$UvfYp*F*ZHF<`bX7xANsc3k4V%Y$ z5Qq7~tq=ksH+$s=;>lblQh;Go+ZNiepvaX$_|mE@=!~a$xquYUWQ_wAucfO}sn2~k zcEW>`RN&l?N@sEo9=W~`7Rod2C2vzkxEyay9g7TI;{qk2V2$lCpVJO?;DSl!^XXfn zKcVYL=Tw0Oigxdl&wnvOv+Tshzbli3EU zL(>4-XA1^5m$d_~Xw*}@joHUEg5n1AH=-?m05YE{O(+v*(wyb(Xk(E@9N&inphL$V z^Z-_++VzuU%K>%-;kS3C)%AF|ROg#vt}2tRq%3yK#$3=SixizQf;+Yj2oerd^iy2W+ppz95E0OZ_MD`Ar4W9}ihueHW@BKHu7<;A z&Ds-si@|EdHp9zM{o7@$uE0@xsC+qM>-F7@4k53t4_O^ZN`xb2P zY2L>OZq{;>Vg^G(6D=L@bJ~nC$Co^*a@jg0(N?y|iPPUeB`VT={#@c;(~wx>rp@jw zV^u_bX(?Mv59(cunuto*HbNxheZ7UHsHp$P$ZB1%4iq4LtNMLK>~`tsutw@L^th(h zr7I?ALQV6KHCytq7!I}_^OT#A>YSW-h;Ad!f~=B8Q^UDjpfUJb6EntFaUI`K!5ymg z>&IbS#lN-+@!97RjaFVbqe1q4+Tc$CXPbnT)3-Lc(jV9?P0fCw@V-u#mA%lanaPVe ze)3|vK?A8R7>*e}tHy2gj#f)0{5IZ&F{UE5V-thlS(Sptqjvc+vdJJaMC&-1MI>yg znP-q!2e&$QJZcWaE!$nn8zn^w6+<4SIAWSJjis&Orwus1y2Gs-VMj8H>{m4$KsJlA z_(`I0jnTpn4V9*0V1}^faJm**FX`YMj5jBhURM3B>uYcVL;_uZLbbRJ`jgxkI+CHU zN5v~4V;zKLp;HN>W^gR<&u2T+LyfTKSy>|#;@pPBs%N)dsU*dhN~xx|bLxT=LetDt zL2BN1+3sBlC40L^CXEni3r@vqm5l2ZlHEZuovYQPdON-P)an*1&ZLep!(_LV$|#

PL=nI)i9;5RR*8@W)vawWZs*$lkll@!! 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 )K%VFS{pj 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 From aaea22f89cab8ce38189af65d629c7d50d112824 Mon Sep 17 00:00:00 2001 From: SHL0MS Date: Thu, 2 Jul 2026 22:29:10 -0400 Subject: [PATCH 03/46] fix(unbroker): suppress-first for PeopleConnect (deletion undoes suppression) PeopleConnect is the exception to deletion-beats-suppression: "DELETE MY USER DATA" also deletes suppressions on file, and deletion does not stop the people-search sites from showing you (public records re-list). Suppression is the effective lever and must be maintained. - intelius.json: deletion.prefer=false; playbook/quirks/notes rewritten with the verbatim privacy-center language; delete is the data-purge-only path. - autopilot: honor deletion.prefer -> prefer_suppression when false. - methods.md / SKILL.md / README: exception called out. - tests updated + prefer-flag routing test (86 tests). --- optional-skills/security/unbroker/README.md | 7 +++-- optional-skills/security/unbroker/SKILL.md | 16 ++++++---- .../unbroker/references/brokers/intelius.json | 18 ++++++----- .../security/unbroker/references/methods.md | 25 +++++++++------ .../security/unbroker/scripts/autopilot.py | 13 ++++++-- tests/skills/test_unbroker_skill.py | 31 +++++++++++++++---- 6 files changed, 74 insertions(+), 36 deletions(-) diff --git a/optional-skills/security/unbroker/README.md b/optional-skills/security/unbroker/README.md index e215e556e..d249293cd 100644 --- a/optional-skills/security/unbroker/README.md +++ b/optional-skills/security/unbroker/README.md @@ -92,9 +92,10 @@ The underlying CLI (run via `terminal`, as `python3 scripts/pdd.py `): viable tier and escalates to a human task only when genuinely blocked. - **Cluster parents first.** Many brokers are resold shells of a few parents, so one removal can clear a dozen child sites. The planner orders parents ahead of standalone listings and ships - field-verified, per-parent playbooks that prefer the **right-to-delete** lane over mere suppression - (for example PeopleConnect's "delete my user data", or Whitepages' privacy email, which sidesteps - the phone-callback tool entirely). + field-verified, per-parent playbooks that usually prefer the **right-to-delete** lane over mere + suppression (for example Whitepages' privacy email, which sidesteps the phone-callback tool), with + per-broker exceptions where the record says otherwise (PeopleConnect: deleting your user data wipes + your suppressions and does not stop public-records re-listing, so suppress-and-maintain instead). - **Multi-identifier fan-out.** A person is indexed under every name/alias, phone, email, and address. The planner expands all of them (filtered by what each broker supports) so listings under a maiden name or an old address are found, not just "primary name plus current city". diff --git a/optional-skills/security/unbroker/SKILL.md b/optional-skills/security/unbroker/SKILL.md index 3888e04d0..e4cf6be25 100644 --- a/optional-skills/security/unbroker/SKILL.md +++ b/optional-skills/security/unbroker/SKILL.md @@ -152,9 +152,11 @@ For anything past a couple of brokers, run this as **map → reduce → act**, n CCPA/GDPR delete-my-PII emails (`send-email --kind ccpa_indirect`), and defer `blocked` to the stealth-browser pass. Opt-outs hit CAPTCHAs, email-verification loops, and session binding - work them **one at a time, carefully** (this is the opposite of fan-out), but do NOT stop to ask - permission per submission in `autonomy=full`; in `assisted`, confirm each one. **Prefer deletion - over suppression** where a broker offers both (e.g. PeopleConnect's "Right to Delete / DELETE MY - USER DATA" actually removes data; the suppression flow only hides it). + permission per submission in `autonomy=full`; in `assisted`, confirm each one. **Usually prefer + deletion over suppression** where a broker offers both (Spokeo/BeenVerified) - but follow the + record's `deletion.prefer`: **PeopleConnect is the exception** (`prefer: false`), where deleting + your user data removes your suppressions and does not stop public-records re-listing, so you + suppress-and-maintain instead. Subagent reports are self-reports: the parent re-verifies key claims (listing URLs, match basis) before recording `found` and before any deletion. @@ -200,9 +202,11 @@ recording `found` and before any deletion. The parent re-verifies key `found` claims from subagents before trusting them. 5. **Opt-outs (when `next` says so).** Actions come pre-ordered parents-first with `steps` from each broker record's own `optout.playbook` (field-verified; cluster parents like PeopleConnect, - Whitepages, BeenVerified, Spokeo have exact, live-checked recipes). **Deletion beats - suppression**: when an action carries `prefer_deletion`, complete the record's DELETION lane (e.g. - PeopleConnect's "DELETE MY USER DATA"), never just the hide-my-listing flow. Per method: + Whitepages, BeenVerified, Spokeo have exact, live-checked recipes). **Deletion usually beats + suppression**: when an action carries `prefer_deletion`, complete the record's DELETION lane, not + just the hide-my-listing flow. When it carries `prefer_suppression` instead (**PeopleConnect** - + deleting removes your suppressions and does not stop re-listing), do the suppression flow and keep + it maintained; use their Delete button only for a deliberate data-purge. Per method: - **web_form** → drive `optout_url` with `browser_navigate`/`browser_type`/`browser_click`, submit only `disclosure_fields`, screenshot the confirmation, then the action's `after` record command. Playbooks may end with a right-to-delete `send-email` follow-up - do it (full erasure, not just diff --git a/optional-skills/security/unbroker/references/brokers/intelius.json b/optional-skills/security/unbroker/references/brokers/intelius.json index 1b3af8358..01e8b85a2 100644 --- a/optional-skills/security/unbroker/references/brokers/intelius.json +++ b/optional-skills/security/unbroker/references/brokers/intelius.json @@ -60,25 +60,27 @@ ], "deletion": { "via": "in_flow", + "prefer": false, "url": "https://suppression.peopleconnect.us/guided-mode", "email": "privacy@peopleconnect.us", "kinds": ["ccpa", "generic"], - "notes": "The portal's 'Right to Delete / DELETE MY USER DATA' (bottom of guided-mode) is the verified deletion path and covers the whole cluster. privacy@peopleconnect.us is the documented rights-request address (their 2025 CPRA metrics: 33,513 delete requests, median response < 1 day) - use it as the fallback if the portal breaks." + "notes": "INVERTED for PeopleConnect: do NOT use 'Right to Delete / DELETE MY USER DATA' if the goal is staying out of search results. Per their privacy-center, deleting your user data ALSO deletes any suppressions you have, and deletion does NOT stop the people-search sites from showing you (public-records-sourced data re-lists). Suppression is the do-not-display list, so it is the effective lever and must be maintained. Use deletion ONLY if the goal is purging the account data they hold, accepting that you will re-list and must re-suppress. privacy@peopleconnect.us is the rights-request address for that data-purge path." }, "playbook": [ - "PeopleConnect portal (suppression.peopleconnect.us/login, privacy-center entry at /privacy-center) -- ONE flow here clears Truthfinder, Instant Checkmate, US Search, ZabaSearch, Classmates and ~15 more. DO THIS PARENT FIRST.", + "PeopleConnect portal (suppression.peopleconnect.us/login, privacy-center entry at /privacy-center) -- ONE flow here covers Truthfinder, Instant Checkmate, US Search, ZabaSearch, Classmates and ~15 more. DO THIS PARENT FIRST.", "Step 1 asks ONLY for an email + consent checkbox (no name/DOB, no CAPTCHA) -> sends a verification email. Least-disclosure entry: just the contact email.", "poll-verification will pick up the verify link. The link authenticates a SESSION bound to the browser that OPENS it: the SAME agent browser must open the link and drive /guided-mode (a different browser is bounced to /login).", - "SUPPRESSION != DELETION -- guided-mode's default flow only HIDES the report (data retained, can re-list). Scroll to the BOTTOM of guided-mode and use 'Right to Delete / DELETE MY USER DATA' (CCPA/CPRA) -- this actually deletes across the cluster and emails its own confirmation link; poll and open that too.", - "If the portal breaks: email privacy@peopleconnect.us (rights-request address, median response < 1 day per their published metrics), or sister addresses privacy@intelius.com / privacy@truthfinder.com / privacy@instantcheckmate.com / support@ussearch.com / privacy@classmates.com; phone 1-888-245-1655.", - "After the deletion confirms, re-scan the covered children (they normally drop out) before submitting any duplicate child opt-out." + "SUPPRESS, do NOT delete (this cluster is the exception to 'deletion beats suppression'). In guided-mode, complete the SUPPRESSION flow -- it puts you on the do-not-display list, which is what actually removes you from Intelius/TruthFinder/etc. Their privacy-center states: deleting your user data 'must delete any and all suppressions associated with your user', and 'Deleting your user information will NOT prevent other users from searching for your information through the people search websites. To suppress your information ... you must maintain your user information on file with the Suppression Center.'", + "Therefore do NOT press 'Right to Delete / DELETE MY USER DATA' if the goal is search-visibility removal: it wipes your suppression and the public-records listing re-appears. Use the delete button ONLY if the operator's explicit goal is purging held account data (accept re-listing + re-suppression).", + "Keep the account/suppression on file; do not delete it later. If the portal breaks: sister addresses privacy@intelius.com / privacy@truthfinder.com / privacy@instantcheckmate.com / support@ussearch.com / privacy@classmates.com; phone 1-888-245-1655.", + "After suppression confirms, re-scan the covered children (they normally drop out) before submitting any duplicate child opt-out." ], - "notes": "PeopleConnect portal covers the cluster. Authorized-agent requests: signed written authorization (full name, address, phone, the email the consumer uses) or POA; for Right-to-Delete they verify agent authority with the consumer by email. Verified from the live privacy policy 2026-07-01 (policy dated 2026-06-30).", + "notes": "PeopleConnect portal covers the cluster via SUPPRESSION (maintained), not deletion (see the deletion lane note: delete removes suppressions and does not stop public-records re-listing). Authorized-agent requests: signed written authorization (full name, address, phone, the email the consumer uses) or POA; for Right-to-Delete they verify agent authority with the consumer by email. Verified from the live privacy policy + suppression privacy-center 2026-07-02.", "quirks": [ "Step 1 (suppression.peopleconnect.us/login) asks ONLY for an email + a consent checkbox, then 'Continue' -> a verification email with a link. No CAPTCHA, no name/DOB at step 1. Least-disclosure entry: just the contact email. Verified live 2026-06-30.", "The verification link authenticates a SESSION and lands on /guided-mode. That session is bound to the browser that OPENED it; a different browser hitting /guided-mode is redirected back to /login. So for hands-off automation the SAME agent browser must open the verify link (Mode B: read inbox -> agent browser navigates the link -> drive guided-mode).", - "SUPPRESSION != DELETION. The guided-mode/suppression flow only HIDES the background report (data retained, can re-list). At the BOTTOM of guided-mode there is a separate 'Right to Delete' section with a 'DELETE MY USER DATA' button (CCPA/CPRA) that removes the user data across the cluster - this is the stronger action and should be preferred. It also emails a confirmation link. (Confirmed via security.org Instant Checkmate guide + live flow 2026-06-30.)", - "Their published request metrics (2025, all US users regardless of state): 33,513 deletion requests, 26,603 complied, median response < 1 day - the deletion lane is real and fast. Verified from privacy policy 2026-07-01." + "INVERTED delete/suppress: SUPPRESSION is the do-not-display list and is what removes you from the people-search sites; it requires keeping your identifiers on file. 'DELETE MY USER DATA' deletes those suppressions and does NOT stop the sites showing you (public records re-list). Verbatim from the privacy-center: deleting user data 'must delete any and all suppressions associated with your user'; and 'Deleting your user information will NOT prevent other users from searching for your information ... To suppress your information ... you must maintain your user information on file with the Suppression Center.' So prefer suppression; use delete only for a deliberate data-purge. Verified live 2026-07-02.", + "Their published request metrics (2025): 33,513 deletion requests, median response < 1 day -- deletion is fast, but per above it is the wrong lever for search-visibility on this cluster." ], "est_processing_days": 7, "reappearance_risk": "medium" diff --git a/optional-skills/security/unbroker/references/methods.md b/optional-skills/security/unbroker/references/methods.md index 6e25f0a7b..ced0c8a80 100644 --- a/optional-skills/security/unbroker/references/methods.md +++ b/optional-skills/security/unbroker/references/methods.md @@ -192,12 +192,14 @@ covered. `pdd.py plan --batch` **orders the `found` group parents-firs source of truth, field-verified, updated as live runs discover mechanics. What follows is the operating doctrine; the exact steps are in `references/brokers/.json`. -**Deletion beats suppression, email lanes beat forms.** Each parent record carries a structured -`optout.deletion` lane (`via: in_flow | email | email_followup`, plus the privacy address). The -autopilot routes accordingly: +**Deletion USUALLY beats suppression, email lanes beat forms -- but check the record.** Each parent +record carries a structured `optout.deletion` lane (`via: in_flow | email | email_followup`, a +privacy address, and `prefer`). The autopilot routes accordingly, and when `deletion.prefer` is +false it emits `prefer_suppression` instead of `prefer_deletion`: -- **`in_flow`** (PeopleConnect): the deletion control lives INSIDE the web flow - complete the flow - and use the **Right to Delete / DELETE MY USER DATA** control, never just the suppression step. +- **`in_flow`** (PeopleConnect, `prefer: false`): the deletion control lives inside the web flow, but + for this cluster it is the WRONG lever for search-visibility (see the exception below). Complete the + **suppression** flow and maintain it; do not press Delete unless the goal is a data-purge. - **`via: email`** (Whitepages): the fully-autonomous lane - `send-email` the request (residency-picked kind: CCPA for US-CA, GDPR for EU/UK, generic otherwise), then `poll-verification` for their reply and answer identity questions with least-disclosure. This is also the **rescue lane**: any broker @@ -206,12 +208,15 @@ autopilot routes accordingly: - **`email_followup`** (BeenVerified, Spokeo): the opt-out form is the fast primary (it clears the listing), and the playbook then sends a right-to-delete email for full erasure beyond suppression. -Verified parent facts (live-checked 2026-07-01; details + steps in the records): +Verified parent facts (live-checked 2026-07-02; details + steps in the records): -- **Intelius/PeopleConnect** (~15+ sites in one flow): portal entry asks only email + consent → - verify link is **session-bound to the browser that opens it** → guided-mode → **DELETE MY USER - DATA** at the bottom (suppression alone re-lists). Fallback `privacy@peopleconnect.us` - their own - published metrics: 33.5k deletion requests, median response < 1 day. +- **Intelius/PeopleConnect** (~15+ sites in one flow) -- **EXCEPTION to deletion-beats-suppression.** + Portal entry asks only email + consent → verify link is **session-bound to the browser that opens + it** → guided-mode. Complete the **SUPPRESSION** flow and keep the account on file: suppression is + the do-not-display list that removes you. Per their privacy-center, **'DELETE MY USER DATA' deletes + your suppressions and does NOT stop the sites from showing you** (public records re-list), so use it + only for a deliberate data-purge. `privacy@peopleconnect.us` is the rights-request address for that + path; published metrics: 33.5k deletion requests, median response < 1 day. - **Whitepages**: `privacyrequest@whitepages.com` (or the Zendesk form) handles removal + CCPA deletion **without the phone-callback tool** - that phone call is only required by the automated tool. One removal also drops "all known connected listings". ≤15 days; check 411.com + Premium. diff --git a/optional-skills/security/unbroker/scripts/autopilot.py b/optional-skills/security/unbroker/scripts/autopilot.py index 0c900818a..76d6f9caa 100644 --- a/optional-skills/security/unbroker/scripts/autopilot.py +++ b/optional-skills/security/unbroker/scripts/autopilot.py @@ -185,9 +185,16 @@ def _optout_action(row: dict, playbook: dict[str, dict], subject_id: str, dossie f"--disclosed ... --channel web_form", } if deletion: - action["prefer_deletion"] = ("this record has a right-to-delete lane -- complete the DELETION " - "flow, not just suppression" + (f" ({deletion.get('notes')})" - if deletion.get("notes") else "")) + if deletion.get("prefer", True): + action["prefer_deletion"] = ("this record has a right-to-delete lane -- complete the " + "DELETION flow, not just suppression" + + (f" ({deletion.get('notes')})" if deletion.get("notes") else "")) + else: + # Some brokers invert the usual rule: deleting the account removes suppressions and + # does not stop public-records re-listing (e.g. PeopleConnect). Suppress and maintain. + action["prefer_suppression"] = (deletion.get("notes") + or "suppression (maintained) is what removes you here; " + "deleting undoes it and does not stop re-listing") if req.get("captcha"): action["note"] = ("CAPTCHA-gated: attempt with the configured browser backend once; if it " "does not clear, record blocked (do NOT retry-loop or bypass)") diff --git a/tests/skills/test_unbroker_skill.py b/tests/skills/test_unbroker_skill.py index 920d0da79..f4342d7e2 100644 --- a/tests/skills/test_unbroker_skill.py +++ b/tests/skills/test_unbroker_skill.py @@ -954,13 +954,32 @@ def test_cluster_parents_have_playbook_and_deletion_lane(): assert addr in emailer.broker_addresses(b), f"{bid}: {addr} not sendable" -def test_curated_intelius_playbook_prefers_deletion(): +def test_curated_intelius_suppress_first_not_delete(): + # PeopleConnect is the EXCEPTION to deletion-beats-suppression: deleting user data wipes + # your suppressions and does not stop public-records re-listing, so suppress-and-maintain. b = brokers.get("intelius") - steps = " ".join(b["optout"]["playbook"]) - assert "SUPPRESSION != DELETION" in steps # the trap, encoded in the data - assert "DELETE MY USER DATA" in steps # the actual deletion control - assert "privacy@peopleconnect.us" in steps # the email fallback lane - assert b["optout"]["deletion"]["via"] == "in_flow" + d = b["optout"]["deletion"] + assert d["prefer"] is False and d["via"] == "in_flow" + assert d["email"] == "privacy@peopleconnect.us" # rights-request address for the data-purge path + steps = " ".join(b["optout"]["playbook"]).upper() + assert "SUPPRESS" in steps # the recommended action + assert "DELETE MY USER DATA" in steps # names the trap to avoid + + +def test_deletion_prefer_flag_controls_autopilot_note(): + with temp_env(): + d = _consenting() + pc = _mini_broker("pc", owns=["kid"]) + pc["optout"]["deletion"] = {"via": "in_flow", "prefer": False, + "email": "privacy@pc.example", "notes": "delete undoes suppression"} + q = autopilot.next_actions(d, [pc, _mini_broker("kid")], _auto_cfg(), {"pc": {"state": "found"}}, env={}) + act = next(a for a in q["actions"] if a.get("broker_id") == "pc" and a["type"] == "optout_web_form") + assert "prefer_suppression" in act and "prefer_deletion" not in act + dd = _mini_broker("dd") + dd["optout"]["deletion"] = {"via": "email_followup", "email": "p@dd.example"} + q2 = autopilot.next_actions(d, [dd], _auto_cfg(), {"dd": {"state": "found"}}, env={}) + act2 = next(a for a in q2["actions"] if a["type"] == "optout_web_form") + assert "prefer_deletion" in act2 and "prefer_suppression" not in act2 def test_curated_whitepages_email_lane_is_autonomous(): From 359518beacf18f251cdad11af24d752639ab3a8d Mon Sep 17 00:00:00 2001 From: Brooklyn Nicholson Date: Fri, 3 Jul 2026 05:13:23 -0500 Subject: [PATCH 04/46] fix(desktop): guard link-title readTitle against destroyed windows Grace and timeout timers in runRenderTitleJob can call getTitle after finish() tears down the hidden BrowserWindow, throwing in the main process when the Artifacts page resolves many link titles concurrently. --- apps/desktop/electron/link-title-window.cjs | 21 +++++++- .../electron/link-title-window.test.cjs | 48 ++++++++++++++++++- apps/desktop/electron/main.cjs | 12 +++-- 3 files changed, 75 insertions(+), 6 deletions(-) diff --git a/apps/desktop/electron/link-title-window.cjs b/apps/desktop/electron/link-title-window.cjs index 3aeabcfe6..c6792bf98 100644 --- a/apps/desktop/electron/link-title-window.cjs +++ b/apps/desktop/electron/link-title-window.cjs @@ -49,4 +49,23 @@ function guardLinkTitleSession(partitionSession) { } } -module.exports = { createLinkTitleWindow, guardLinkTitleSession, linkTitleWindowOptions } +// Read the page title from a title-fetch window. Callers schedule this from +// timers that can fire after finish() destroys the window, so every access must +// guard isDestroyed and swallow Electron's "Object has been destroyed" throws. +function readLinkTitleWindowTitle(window) { + try { + if (!window || window.isDestroyed()) return '' + const contents = window.webContents + if (!contents || contents.isDestroyed()) return '' + return contents.getTitle() || '' + } catch { + return '' + } +} + +module.exports = { + createLinkTitleWindow, + guardLinkTitleSession, + linkTitleWindowOptions, + readLinkTitleWindowTitle +} diff --git a/apps/desktop/electron/link-title-window.test.cjs b/apps/desktop/electron/link-title-window.test.cjs index 64228ce4a..1682e5abb 100644 --- a/apps/desktop/electron/link-title-window.test.cjs +++ b/apps/desktop/electron/link-title-window.test.cjs @@ -1,7 +1,12 @@ const assert = require('node:assert/strict') const test = require('node:test') -const { createLinkTitleWindow, guardLinkTitleSession, linkTitleWindowOptions } = require('./link-title-window.cjs') +const { + createLinkTitleWindow, + guardLinkTitleSession, + linkTitleWindowOptions, + readLinkTitleWindowTitle +} = require('./link-title-window.cjs') function makeFakeBrowserWindow() { const calls = { audioMuted: [] } @@ -66,3 +71,44 @@ test('guardLinkTitleSession cancels downloads triggered by the title-fetch windo test('guardLinkTitleSession is a no-op when session.on throws', () => { assert.doesNotThrow(() => guardLinkTitleSession({ on() { throw new Error() } })) }) + +test('readLinkTitleWindowTitle returns empty for missing or destroyed windows', () => { + assert.equal(readLinkTitleWindowTitle(null), '') + assert.equal(readLinkTitleWindowTitle(undefined), '') + assert.equal(readLinkTitleWindowTitle({ isDestroyed: () => true }), '') +}) + +test('readLinkTitleWindowTitle returns empty when webContents is destroyed', () => { + const window = { + isDestroyed: () => false, + webContents: { isDestroyed: () => true, getTitle: () => 'Should Not Read' } + } + + assert.equal(readLinkTitleWindowTitle(window), '') +}) + +test('readLinkTitleWindowTitle swallows getTitle throws after teardown', () => { + const window = { + isDestroyed: () => false, + webContents: { + isDestroyed: () => false, + getTitle: () => { + throw new Error('Object has been destroyed') + } + } + } + + assert.equal(readLinkTitleWindowTitle(window), '') +}) + +test('readLinkTitleWindowTitle returns trimmed page title', () => { + const window = { + isDestroyed: () => false, + webContents: { + isDestroyed: () => false, + getTitle: () => 'Example Domain' + } + } + + assert.equal(readLinkTitleWindowTitle(window), 'Example Domain') +}) diff --git a/apps/desktop/electron/main.cjs b/apps/desktop/electron/main.cjs index 29b2891d7..da642b33a 100644 --- a/apps/desktop/electron/main.cjs +++ b/apps/desktop/electron/main.cjs @@ -36,7 +36,11 @@ const { SESSION_WINDOW_MIN_WIDTH } = require('./session-windows.cjs') const { canImportHermesCli, verifyHermesCli } = require('./backend-probes.cjs') -const { createLinkTitleWindow, guardLinkTitleSession } = require('./link-title-window.cjs') +const { + createLinkTitleWindow, + guardLinkTitleSession, + readLinkTitleWindowTitle +} = require('./link-title-window.cjs') const { probeGatewayWebSocket } = require('./gateway-ws-probe.cjs') const { adoptServedDashboardToken } = require('./dashboard-token.cjs') const { waitForDashboardPortAnnouncement } = require('./backend-ready.cjs') @@ -3557,13 +3561,13 @@ function runRenderTitleJob(rawUrl) { return finish('') } - const readTitle = () => window?.webContents?.getTitle?.() || '' + const finishWithTitle = () => finish(readLinkTitleWindowTitle(window)) const scheduleGrace = () => { if (graceTimer) clearTimeout(graceTimer) - graceTimer = setTimeout(() => finish(readTitle()), RENDER_TITLE_GRACE_MS) + graceTimer = setTimeout(finishWithTitle, RENDER_TITLE_GRACE_MS) } - hardTimer = setTimeout(() => finish(readTitle()), RENDER_TITLE_TIMEOUT_MS) + hardTimer = setTimeout(finishWithTitle, RENDER_TITLE_TIMEOUT_MS) window.webContents.setUserAgent(TITLE_USER_AGENT) window.webContents.on('page-title-updated', scheduleGrace) From e88039648813dadc42adf884e87d62cd877ff4fb Mon Sep 17 00:00:00 2001 From: tt-a1i <53142663+tt-a1i@users.noreply.github.com> Date: Fri, 19 Jun 2026 16:18:47 +0800 Subject: [PATCH 05/46] fix(gateway): key native image handoff by session --- gateway/run.py | 11 +++++++---- .../test_native_image_buffer_isolation.py | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/gateway/run.py b/gateway/run.py index d3992a760..17ccd4c1c 100644 --- a/gateway/run.py +++ b/gateway/run.py @@ -9962,6 +9962,7 @@ class GatewayRunner(GatewayAuthorizationMixin, GatewayKanbanWatchersMixin, Gatew event: MessageEvent, source: SessionSource, history: List[Dict[str, Any]], + session_key: Optional[str] = None, ) -> Optional[str]: """Prepare inbound event text for the agent. @@ -9980,10 +9981,10 @@ class GatewayRunner(GatewayAuthorizationMixin, GatewayKanbanWatchersMixin, Gatew message_text = event.text or "" _group_sessions_per_user = getattr(self.config, "group_sessions_per_user", True) _thread_sessions_per_user = getattr(self.config, "thread_sessions_per_user", False) - # Use the same helper every other call site uses so the write key here - # matches the consume key at the run_conversation site — even if the - # session store overrides build_session_key's default behavior. - session_key = self._session_key_for_source(source) + # Prefer the already resolved session key from the caller so this write + # key matches the consume key at the run_conversation site. Fall back + # to deriving it here for tests and legacy standalone callers. + session_key = session_key or self._session_key_for_source(source) # Reset only this session's per-call buffer; other sessions may be # concurrently preparing multimodal turns on the same runner. self._consume_pending_native_image_paths(session_key) @@ -10997,6 +10998,7 @@ class GatewayRunner(GatewayAuthorizationMixin, GatewayKanbanWatchersMixin, Gatew event=event, source=source, history=history, + session_key=session_key, ) if message_text is None: return @@ -19073,6 +19075,7 @@ class GatewayRunner(GatewayAuthorizationMixin, GatewayKanbanWatchersMixin, Gatew event=pending_event, source=next_source, history=updated_history, + session_key=session_key, ) if next_message is None: return result diff --git a/tests/gateway/test_native_image_buffer_isolation.py b/tests/gateway/test_native_image_buffer_isolation.py index f8fb2e65a..55f96730a 100644 --- a/tests/gateway/test_native_image_buffer_isolation.py +++ b/tests/gateway/test_native_image_buffer_isolation.py @@ -77,3 +77,20 @@ async def test_native_image_buffer_not_cleared_by_other_sessions_without_images( assert runner._consume_pending_native_image_paths(build_session_key(source_a)) == ["/tmp/a.png"] assert runner._consume_pending_native_image_paths(build_session_key(source_b)) == [] + + +@pytest.mark.asyncio +async def test_native_image_buffer_uses_resolved_session_key_when_provided(): + runner = _make_runner() + source = _source("chat-a") + runner._session_key_for_source = lambda _source: "source-derived-key" + + await runner._prepare_inbound_message_text( + event=_image_event(source, "/tmp/a.png"), + source=source, + history=[], + session_key="canonical-session-key", + ) + + assert runner._consume_pending_native_image_paths("source-derived-key") == [] + assert runner._consume_pending_native_image_paths("canonical-session-key") == ["/tmp/a.png"] From bb24ac6f20031383d3b1c289a2b49ef6311587ea Mon Sep 17 00:00:00 2001 From: LeonSGP43 Date: Fri, 19 Jun 2026 16:13:09 +0800 Subject: [PATCH 06/46] fix(gateway): preserve queued native image attachments --- gateway/run.py | 11 +- .../test_queued_native_image_session_key.py | 151 ++++++++++++++++++ 2 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 tests/gateway/test_queued_native_image_session_key.py diff --git a/gateway/run.py b/gateway/run.py index 17ccd4c1c..07a1c93d7 100644 --- a/gateway/run.py +++ b/gateway/run.py @@ -19063,6 +19063,7 @@ class GatewayRunner(GatewayAuthorizationMixin, GatewayKanbanWatchersMixin, Gatew next_message = pending next_message_id = None next_channel_prompt = None + next_session_key = session_key if pending_event is not None: next_source = getattr(pending_event, "source", None) or source if self._is_goal_continuation_event(pending_event) and not self._goal_still_active_for_session(session_id): @@ -19081,6 +19082,14 @@ class GatewayRunner(GatewayAuthorizationMixin, GatewayKanbanWatchersMixin, Gatew return result next_message_id = self._reply_anchor_for_event(pending_event) next_channel_prompt = getattr(pending_event, "channel_prompt", None) + try: + next_session_key = self._session_key_for_source(next_source) + except Exception: + logger.debug( + "Queued follow-up session-key resolution failed; reusing %s", + session_key or "?", + exc_info=True, + ) # Restart typing indicator so the user sees activity while # the follow-up turn runs. The outer _process_message_background @@ -19117,7 +19126,7 @@ class GatewayRunner(GatewayAuthorizationMixin, GatewayKanbanWatchersMixin, Gatew history=updated_history, source=next_source, session_id=session_id, - session_key=session_key, + session_key=next_session_key, run_generation=run_generation, _interrupt_depth=_interrupt_depth + 1, event_message_id=next_message_id, diff --git a/tests/gateway/test_queued_native_image_session_key.py b/tests/gateway/test_queued_native_image_session_key.py new file mode 100644 index 000000000..86ba1620a --- /dev/null +++ b/tests/gateway/test_queued_native_image_session_key.py @@ -0,0 +1,151 @@ +import base64 +import importlib +import sys +import types +from types import SimpleNamespace + +import pytest + +from gateway.config import Platform, PlatformConfig +from gateway.platforms.base import BasePlatformAdapter, MessageEvent, MessageType, SendResult +from gateway.session import SessionSource + + +_ONE_BY_ONE_PNG = base64.b64decode( + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO6L2ioAAAAASUVORK5CYII=" +) + + +class CaptureAdapter(BasePlatformAdapter): + def __init__(self): + super().__init__(PlatformConfig(enabled=True, token="***"), Platform.TELEGRAM) + self.sent = [] + self.typing = [] + + async def connect(self) -> bool: + return True + + async def disconnect(self) -> None: + return None + + async def send(self, chat_id, content, reply_to=None, metadata=None) -> SendResult: + self.sent.append( + { + "chat_id": chat_id, + "content": content, + "reply_to": reply_to, + "metadata": metadata, + } + ) + return SendResult(success=True, message_id="sent-1") + + async def send_typing(self, chat_id, metadata=None) -> None: + self.typing.append({"chat_id": chat_id, "metadata": metadata}) + + async def stop_typing(self, chat_id) -> None: + return None + + async def get_chat_info(self, chat_id: str): + return {"id": chat_id} + + +class CaptureQueuedNativeImageAgent: + calls = [] + + def __init__(self, **kwargs): + self.tools = [] + self.tool_progress_callback = kwargs.get("tool_progress_callback") + + def run_conversation(self, message, conversation_history=None, task_id=None): + type(self).calls.append(message) + return { + "final_response": f"done-{len(type(self).calls)}", + "messages": [], + "api_calls": 1, + } + + +def _make_runner(adapter): + gateway_run = importlib.import_module("gateway.run") + runner = object.__new__(gateway_run.GatewayRunner) + runner.adapters = {adapter.platform: adapter} + runner._voice_mode = {} + runner._prefill_messages = [] + runner._ephemeral_system_prompt = "" + runner._reasoning_config = None + runner._provider_routing = {} + runner._fallback_model = None + runner._session_db = None + runner._running_agents = {} + runner._session_run_generation = {} + runner.hooks = SimpleNamespace(loaded_hooks=False) + runner.config = SimpleNamespace( + thread_sessions_per_user=False, + group_sessions_per_user=False, + stt_enabled=False, + ) + runner._model = "openai/gpt-4.1-mini" + runner._base_url = None + runner._decide_image_input_mode = lambda: "native" + return runner + + +@pytest.mark.asyncio +async def test_queued_followup_uses_pending_event_session_key_for_native_images(monkeypatch, tmp_path): + CaptureQueuedNativeImageAgent.calls = [] + + fake_dotenv = types.ModuleType("dotenv") + fake_dotenv.load_dotenv = lambda *args, **kwargs: None + monkeypatch.setitem(sys.modules, "dotenv", fake_dotenv) + + fake_run_agent = types.ModuleType("run_agent") + fake_run_agent.AIAgent = CaptureQueuedNativeImageAgent + monkeypatch.setitem(sys.modules, "run_agent", fake_run_agent) + + gateway_run = importlib.import_module("gateway.run") + monkeypatch.setattr(gateway_run, "_hermes_home", tmp_path) + monkeypatch.setattr(gateway_run, "_resolve_runtime_agent_kwargs", lambda: {"api_key": "***"}) + + adapter = CaptureAdapter() + runner = _make_runner(adapter) + + image_path = tmp_path / "queued-image.png" + image_path.write_bytes(_ONE_BY_ONE_PNG) + + source = SessionSource( + platform=Platform.TELEGRAM, + chat_id="-1001", + chat_type="group", + ) + pending_source = SessionSource( + platform=Platform.TELEGRAM, + chat_id="-1001", + chat_type="group", + thread_id="17585", + ) + + adapter._pending_messages["agent:main:telegram:group:-1001"] = MessageEvent( + text="describe this", + message_type=MessageType.PHOTO, + source=pending_source, + media_urls=[str(image_path)], + media_types=["image/png"], + message_id="queued-1", + ) + + result = await runner._run_agent( + message="hello", + context_prompt="", + history=[], + source=source, + session_id="sess-native-image-followup", + session_key="agent:main:telegram:group:-1001", + ) + + assert result["final_response"] == "done-2" + assert len(CaptureQueuedNativeImageAgent.calls) == 2 + queued_message = CaptureQueuedNativeImageAgent.calls[1] + assert isinstance(queued_message, list) + assert queued_message[0]["type"] == "text" + assert queued_message[0]["text"].startswith("describe this") + assert any(part.get("type") == "image_url" for part in queued_message) From 741bd9ba426a3028692f549adf52007e3beb84aa Mon Sep 17 00:00:00 2001 From: teknium1 <127238744+teknium1@users.noreply.github.com> Date: Fri, 3 Jul 2026 02:42:34 -0700 Subject: [PATCH 07/46] fix(gateway): resolve queued follow-up session key before native-image buffering The cherry-picked #48919 fix resolved next_session_key AFTER _prepare_inbound_message_text had already buffered native image paths under the stale key. Reorder so the write key and the consume key are the same resolved key. --- gateway/run.py | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/gateway/run.py b/gateway/run.py index 07a1c93d7..e187ff8a3 100644 --- a/gateway/run.py +++ b/gateway/run.py @@ -19072,16 +19072,11 @@ class GatewayRunner(GatewayAuthorizationMixin, GatewayKanbanWatchersMixin, Gatew session_key or "?", ) return result - next_message = await self._prepare_inbound_message_text( - event=pending_event, - source=next_source, - history=updated_history, - session_key=session_key, - ) - if next_message is None: - return result - next_message_id = self._reply_anchor_for_event(pending_event) - next_channel_prompt = getattr(pending_event, "channel_prompt", None) + # Resolve the follow-up's session key BEFORE preparing the + # inbound text: _prepare_inbound_message_text buffers native + # image paths under the key it is given, and the recursive + # _run_agent below consumes them under next_session_key. + # The write and consume keys must match or the images drop. try: next_session_key = self._session_key_for_source(next_source) except Exception: @@ -19090,6 +19085,16 @@ class GatewayRunner(GatewayAuthorizationMixin, GatewayKanbanWatchersMixin, Gatew session_key or "?", exc_info=True, ) + next_message = await self._prepare_inbound_message_text( + event=pending_event, + source=next_source, + history=updated_history, + session_key=next_session_key, + ) + if next_message is None: + return result + next_message_id = self._reply_anchor_for_event(pending_event) + next_channel_prompt = getattr(pending_event, "channel_prompt", None) # Restart typing indicator so the user sees activity while # the follow-up turn runs. The outer _process_message_background From b14d75f8afdb624be03cbefd19494ccc850bf367 Mon Sep 17 00:00:00 2001 From: Teknium <127238744+teknium1@users.noreply.github.com> Date: Fri, 3 Jul 2026 03:24:08 -0700 Subject: [PATCH 08/46] fix(update): prevent and self-heal half-updated venvs on Windows (#57659) Root-causes the July 2026 Windows incident chain (locked _brotlicffi.pyd / _sodium.pyd during install, then 'No module named annotated_doc' with 'hermes update' insisting 'Already up to date!'): - hermes update: probe venv core imports even when the checkout is current; a half-updated venv (dep sync killed mid-flight by a locked .pyd) is now detected and repaired instead of being reported as up to date - hermes update (Windows): after pausing gateways, refuse to mutate the venv while other processes run from the venv interpreter (the Desktop backend runs as python.exe so the hermes.exe shim guard never saw it); --force keeps the old behavior - install.ps1 venv stage: disarm gateway autostart Scheduled Tasks before the kill sweep (they respawn the gateway inside the kill->delete window), make the sweep a bounded loop requiring 3 clean passes, and rename-then- delete the old venv (a rename succeeds even with mapped DLLs) with stale- dir cleanup on the next run - desktop updater: 'venv shim still locked after 15s' now ABORTS the update hand-off (restarting our backend, surfacing the holder to the user) instead of 'proceeding anyway (force)' into guaranteed venv corruption; the unlock wait also re-kills respawned backends each poll tick --- apps/desktop/electron/main.cjs | 33 +++- hermes_cli/main.py | 202 +++++++++++++++++++- scripts/install.ps1 | 107 +++++++++-- tests/hermes_cli/test_update_venv_health.py | 185 ++++++++++++++++++ 4 files changed, 507 insertions(+), 20 deletions(-) create mode 100644 tests/hermes_cli/test_update_venv_health.py diff --git a/apps/desktop/electron/main.cjs b/apps/desktop/electron/main.cjs index da642b33a..eac26c0af 100644 --- a/apps/desktop/electron/main.cjs +++ b/apps/desktop/electron/main.cjs @@ -2168,9 +2168,25 @@ async function releaseBackendLock(updateRoot, tag) { rememberLog(`[${tag}] venv shim unlocked; safe to proceed`) return { unlocked: true } } + // A supervised backend can respawn between kill and check (grandchildren, + // pool entries registered mid-teardown). Re-collect and re-kill each pass + // instead of trusting the initial sweep. + const stragglers = [] + if (hermesProcess && Number.isInteger(hermesProcess.pid)) stragglers.push(hermesProcess.pid) + for (const entry of backendPool.values()) { + if (entry.process && Number.isInteger(entry.process.pid)) stragglers.push(entry.process.pid) + } + for (const pid of stragglers) forceKillProcessTree(pid) await new Promise(r => setTimeout(r, 300)) } - rememberLog(`[${tag}] venv shim still locked after 15s; proceeding anyway (force)`) + // Do NOT proceed past a held lock: handing off to the updater while another + // process (a second desktop window, a user terminal, an unkillable child) + // still maps the venv's files guarantees a half-updated venv — the updater's + // dependency sync dies on access-denied partway through uninstalls, leaving + // imports broken (the July 2026 brotlicffi/_sodium.pyd incidents). Failing + // the update loudly and keeping the app running is strictly better than a + // bricked install that needs manual venv surgery. + rememberLog(`[${tag}] venv shim still locked after 15s; aborting hand-off (something outside this app holds the venv)`) return { unlocked: false } } @@ -2250,7 +2266,20 @@ async function applyUpdates(opts = {}) { // spawn the updater. Without this the updater races a still-locked // hermes.exe (held by the backend child / its grandchildren) and the update // bricks. See releaseBackendLockForUpdate for the full failure analysis. - await releaseBackendLockForUpdate(updateRoot) + const lock = await releaseBackendLockForUpdate(updateRoot) + if (!lock.unlocked) { + // Something OUTSIDE this app holds the venv (a second window, a user + // terminal running hermes, an unkillable child). Handing off anyway + // guarantees a half-updated venv — abort loudly instead and let the + // user close the holder and retry. Restart our own backend so the app + // keeps working after the failed attempt. + const message = + 'Update aborted: another process is holding the Hermes install open ' + + '(a second Hermes window or a terminal running hermes?). Close it and retry.' + emitUpdateProgress({ stage: 'error', message, percent: null }) + startHermes().catch(() => {}) + return { ok: false, error: message } + } // Detached so the updater outlives this process — it needs us GONE before // `hermes update` will run (the venv shim is locked while we live). diff --git a/hermes_cli/main.py b/hermes_cli/main.py index aedcb603e..29b1ac1de 100644 --- a/hermes_cli/main.py +++ b/hermes_cli/main.py @@ -8776,6 +8776,159 @@ def _wait_for_windows_update_gateway_exit( return survivors +def _venv_core_imports_healthy() -> tuple[bool, str]: + """Probe the project venv for the core imports the backend needs to boot. + + Runs a tiny import check inside the venv interpreter (NOT this process — + ``hermes update`` may be driven by a different Python). Catches the + half-updated-venv state: git checkout current but a dependency sync that + failed or was killed partway (e.g. Windows access-denied on a loaded + .pyd), leaving imports like ``fastapi``'s new transitive deps missing. + Without this probe, ``hermes update`` on a current checkout prints + "Already up to date!" and returns without ever re-syncing dependencies — + the user's install stays broken no matter how many times they update + (ryanc's incident, July 2026). + + Returns ``(healthy, detail)``. Never raises; unknown states report + healthy so a probe failure can't force needless reinstalls. + """ + venv_dir = PROJECT_ROOT / "venv" + python_name = "python.exe" if _is_windows() else "python" + bin_dir = "Scripts" if _is_windows() else "bin" + venv_python = venv_dir / bin_dir / python_name + if not venv_python.exists(): + return True, "" + + # Core web/serve imports plus their newest transitive deps. Import (not + # just metadata) — a package can have intact dist-info but a missing + # module after an interrupted uninstall/install cycle. + check = ( + "import importlib\n" + "mods = ['fastapi', 'uvicorn', 'pydantic', 'openai', 'yaml']\n" + "missing = []\n" + "for m in mods:\n" + " try: importlib.import_module(m)\n" + " except Exception as e: missing.append(f'{m}: {e}')\n" + "print('\\n'.join(missing))\n" + ) + try: + result = subprocess.run( + [str(venv_python), "-c", check], + capture_output=True, + text=True, + timeout=60, + cwd=PROJECT_ROOT, + ) + except Exception as exc: + logger.debug("venv health probe failed to run: %s", exc) + return True, "" + + missing = [line.strip() for line in (result.stdout or "").splitlines() if line.strip()] + if result.returncode != 0 and not missing: + # Interpreter itself is broken (e.g. deleted stdlib) — that IS unhealthy. + detail = (result.stderr or "").strip().splitlines() + return False, detail[0] if detail else "venv python failed to run" + if missing: + return False, "; ".join(missing[:4]) + return True, "" + + +def _detect_venv_python_processes( + *, exclude_pids: set[int] | None = None +) -> list[tuple[int, str, str]]: + """Find live processes running from the project venv's interpreter. + + The hermes.exe shim guard misses the biggest lock-holder class on + Windows: the Desktop app's backend (``python.exe -m hermes_cli.main + serve``) and anything else running straight off ``venv\\Scripts\\python + (w).exe``. Those processes keep native ``.pyd`` extensions mapped, so a + dependency sync mid-update dies with access-denied and strands the venv + half-updated (ryanc's brotlicffi/_sodium.pyd incidents, July 2026). + + Killing them from here is pointless — the Desktop app supervises its + backend and respawns it within seconds — so the caller should refuse and + tell the user to close the app instead. Returns ``(pid, name, cmdline)`` + tuples; empty off-Windows / without psutil / when nothing matches. The + calling process and its ancestors are always excluded (a CLI ``hermes + update`` itself runs from the venv python). Never raises. + """ + if not _is_windows(): + return [] + try: + import psutil + except Exception: + return [] + + venv_dir = PROJECT_ROOT / "venv" + try: + venv_prefix = str(venv_dir.resolve()).lower().rstrip(os.sep) + os.sep + except OSError: + venv_prefix = str(venv_dir).lower().rstrip(os.sep) + os.sep + + skip: set[int] = set(exclude_pids or set()) + skip.add(os.getpid()) + try: + for anc in psutil.Process().parents(): + skip.add(int(anc.pid)) + except Exception: + pass + + matches: list[tuple[int, str, str]] = [] + try: + proc_iter = psutil.process_iter(["pid", "exe", "name", "cmdline"]) + except Exception: + return [] + for proc in proc_iter: + try: + info = proc.info + except Exception: + continue + pid = info.get("pid") + exe = info.get("exe") + if not exe or pid is None or int(pid) in skip: + continue + try: + exe_norm = str(Path(exe).resolve()).lower() + except (OSError, ValueError): + exe_norm = str(exe).lower() + if not exe_norm.startswith(venv_prefix): + continue + name = info.get("name") or Path(exe).name + cmdline = " ".join(info.get("cmdline") or [])[:120] + matches.append((int(pid), str(name), cmdline)) + return matches + + +def _format_venv_python_holders_message(matches: list[tuple[int, str, str]]) -> str: + """Explain which venv processes block the update and how to clear them.""" + lines = [ + "✗ Other Hermes processes are running from this install's venv:", + ] + for pid, name, cmdline in matches[:6]: + hint = "" + low = cmdline.lower() + if "serve" in low or "dashboard" in low: + hint = " ← Hermes Desktop backend (close the desktop app)" + elif "gateway" in low: + hint = " ← gateway" + lines.append(f" PID {pid} {name} {cmdline}{hint}") + if len(matches) > 6: + lines.append(f" ... and {len(matches) - 6} more") + lines.append("") + lines.append( + " On Windows these keep native extension files (.pyd) locked, so the" + ) + lines.append( + " dependency update would fail partway and leave a broken install." + ) + lines.append( + " Close the Hermes desktop app / other Hermes terminals, then re-run:" + ) + lines.append(" hermes update") + lines.append(" (or use `hermes update --force` to proceed anyway at your own risk)") + return "\n".join(lines) + + def _pause_windows_gateways_for_update() -> dict | None: """Stop running Windows gateways before mutating the checkout or venv. @@ -9235,6 +9388,19 @@ def _cmd_update_impl(args, gateway_mode: bool): _windows_gateway_resume, ) + # With gateways paused, anything still running from the venv interpreter + # (most commonly the Desktop app's `hermes serve` backend) will keep .pyd + # files locked and corrupt the dependency sync below. Refuse rather than + # race: killing the desktop backend is futile (the app supervises and + # respawns it), so the user must close the app. --force preserves the old + # behavior for users who know what they're doing. + if _is_windows() and not getattr(args, "force", False): + _venv_holders = _detect_venv_python_processes() + if _venv_holders: + print(_format_venv_python_holders_message(_venv_holders)) + _resume_windows_gateways_after_update(_windows_gateway_resume) + sys.exit(2) + # Try git-based update first, fall back to ZIP download on Windows # when git file I/O is broken (antivirus, NTFS filter drivers, etc.) use_zip_update = False @@ -9436,7 +9602,41 @@ def _cmd_update_impl(args, gateway_mode: bool): text=True, check=False, ) - print("✓ Already up to date!") + + # A current checkout does NOT imply a healthy install: a previous + # dependency sync may have failed partway (classic on Windows, + # where a running gateway/desktop backend keeps .pyd files locked + # and uv/pip dies with access-denied, stranding the venv between + # versions). Probe the venv's core imports and repair if broken — + # otherwise "Already up to date!" gaslights the user while their + # install stays bricked. + healthy, detail = _venv_core_imports_healthy() + if not healthy: + print("⚠ Checkout is current, but the venv is unhealthy:") + print(f" {detail}") + print("→ Repairing Python dependencies...") + _write_update_incomplete_marker() + from hermes_cli.managed_uv import ensure_uv + + repair_uv = ensure_uv() + if repair_uv: + repair_env = {**os.environ, "VIRTUAL_ENV": str(PROJECT_ROOT / "venv")} + _install_python_dependencies_with_optional_fallback( + [repair_uv, "pip"], env=repair_env, group="all" + ) + else: + _install_python_dependencies_with_optional_fallback( + [sys.executable, "-m", "pip"], group="all" + ) + _clear_update_incomplete_marker() + healthy_after, detail_after = _venv_core_imports_healthy() + if healthy_after: + print("✓ Dependencies repaired!") + else: + print(f"⚠ Venv still unhealthy after repair: {detail_after}") + print(" Close all Hermes windows/gateways and re-run: hermes update") + else: + print("✓ Already up to date!") _resume_windows_gateways_after_update(_windows_gateway_resume) return diff --git a/scripts/install.ps1 b/scripts/install.ps1 index 15f98f4b4..e090dcb5c 100644 --- a/scripts/install.ps1 +++ b/scripts/install.ps1 @@ -1614,6 +1614,26 @@ function Install-Venv { if ($env:OS -eq "Windows_NT") { $myPid = $PID Write-Info "Stopping any running hermes processes before recreating venv..." + # Disarm respawners FIRST: the gateway autostart Scheduled Task and + # the Startup-folder entry both relaunch a killed gateway within + # seconds, and losing that race re-locks the venv's .pyd files + # between our kill sweep and Remove-Item (the July 2026 + # _brotlicffi.pyd incident). schtasks /End stops a running task + # instance; /Change /DISABLE stops it from re-firing mid-install. + # Re-enabled after the venv is recreated (below). Best-effort: a + # missing task just errors quietly. + $gatewayTasksDisabled = @() + try { + schtasks /Query /FO CSV 2>$null | ConvertFrom-Csv | Where-Object { $_.TaskName -like '*Hermes_Gateway*' } | ForEach-Object { + $tn = $_.TaskName + schtasks /End /TN $tn 2>$null | Out-Null + schtasks /Change /TN $tn /DISABLE 2>$null | Out-Null + $gatewayTasksDisabled += $tn + Write-Info " disabled gateway autostart task $tn for the duration of the install" + } + } catch { + Write-Warn "Could not enumerate gateway scheduled tasks: $($_.Exception.Message)" + } # The launcher CLI (hermes.exe) plus its child tree. & taskkill /F /T /IM hermes.exe /FI "PID ne $myPid" 2>$null | Out-Null # taskkill /IM hermes.exe is NOT enough: the gateway/agent that a @@ -1632,27 +1652,68 @@ function Install-Venv { # ExecutablePath for a process it cannot inspect (a different session) # instead of throwing, so an unreadable process is skipped rather than # aborting the whole sweep. + # + # The sweep is a bounded LOOP, not single-shot: supervised processes + # (the Desktop app's backend, a watchdog-managed gateway) respawn in + # the window between one kill pass and the delete. Each pass re- + # enumerates; three consecutive clean passes (or the attempt cap) + # ends the loop. $venvPrefix = [System.IO.Path]::GetFullPath((Join-Path $InstallDir "venv")).TrimEnd('\') + '\' - try { - Get-CimInstance Win32_Process -ErrorAction Stop | - Where-Object { $_.ProcessId -ne $myPid -and $_.ExecutablePath -and $_.ExecutablePath.StartsWith($venvPrefix, [System.StringComparison]::OrdinalIgnoreCase) } | - ForEach-Object { - Write-Info " stopping PID $($_.ProcessId) ($($_.Name)) running from venv" - Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue - } - } catch { - Write-Warn "Could not enumerate venv processes: $($_.Exception.Message)" + $cleanPasses = 0 + for ($sweep = 0; $sweep -lt 10 -and $cleanPasses -lt 3; $sweep++) { + $found = 0 + try { + Get-CimInstance Win32_Process -ErrorAction Stop | + Where-Object { $_.ProcessId -ne $myPid -and $_.ExecutablePath -and $_.ExecutablePath.StartsWith($venvPrefix, [System.StringComparison]::OrdinalIgnoreCase) } | + ForEach-Object { + $found++ + Write-Info " stopping PID $($_.ProcessId) ($($_.Name)) running from venv" + Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue + } + } catch { + Write-Warn "Could not enumerate venv processes: $($_.Exception.Message)" + break + } + if ($found -eq 0) { $cleanPasses++ } else { $cleanPasses = 0 } + Start-Sleep -Milliseconds 400 } - Start-Sleep -Milliseconds 800 } - Remove-Item -Recurse -Force "venv" -ErrorAction SilentlyContinue - # A killed process can take a moment to release its file handles, so a - # first Remove-Item may still hit a locked .pyd. Retry once after a short - # pause before giving up and letting the stage fail loudly. - if (Test-Path "venv") { - Start-Sleep -Seconds 2 - Remove-Item -Recurse -Force "venv" + # Rename-then-delete: on Windows a directory RENAME succeeds even while + # files inside it are mapped as DLLs (only in-place delete/replace of + # the mapped file is denied, and only same-volume renames are atomic + # moves). Moving the old venv aside means `uv venv` can create a fresh + # one immediately even if some straggler still holds a .pyd from the + # old tree; the renamed dir is deleted best-effort (now, and by the + # cleanup pass below on the NEXT install if a handle outlives this one). + $staleName = "venv.stale.{0}" -f (Get-Date -Format "yyyyMMddHHmmss") + $renamed = $false + try { + Rename-Item -Path "venv" -NewName $staleName -ErrorAction Stop + $renamed = $true + } catch { + Write-Warn "Could not rename venv aside ($($_.Exception.Message)); falling back to in-place delete" } + if ($renamed) { + Remove-Item -Recurse -Force $staleName -ErrorAction SilentlyContinue + if (Test-Path $staleName) { + Write-Warn "Old venv parked at $staleName (a process still holds files in it); it will be cleaned up on the next install" + } + } else { + Remove-Item -Recurse -Force "venv" -ErrorAction SilentlyContinue + # A killed process can take a moment to release its file handles, so a + # first Remove-Item may still hit a locked .pyd. Retry once after a short + # pause before giving up and letting the stage fail loudly. + if (Test-Path "venv") { + Start-Sleep -Seconds 2 + Remove-Item -Recurse -Force "venv" + } + } + } + + # Clean up parked venvs from previous installs whose handles have since + # been released. Best-effort — a still-held tree just stays for next time. + Get-ChildItem -Directory -Filter "venv.stale.*" -ErrorAction SilentlyContinue | ForEach-Object { + Remove-Item -Recurse -Force $_.FullName -ErrorAction SilentlyContinue } # uv creates the venv and pins the Python version in one step. uv emits @@ -1684,6 +1745,18 @@ function Install-Venv { Pop-Location + # Re-arm the gateway autostart tasks disabled during the venv teardown. + # Same function scope, so the list survives even under the stage-per- + # process bootstrap. Deliberately NOT started here — dependencies aren't + # installed yet; the task fires normally on next logon and `hermes update` + # / the gateway resume path handles the immediate restart. + if ($gatewayTasksDisabled -and $gatewayTasksDisabled.Count -gt 0) { + foreach ($tn in $gatewayTasksDisabled) { + schtasks /Change /TN $tn /ENABLE 2>$null | Out-Null + } + Write-Info "Re-enabled gateway autostart task(s): $($gatewayTasksDisabled -join ', ')" + } + Write-Success "Virtual environment ready (Python $PythonVersion)" } diff --git a/tests/hermes_cli/test_update_venv_health.py b/tests/hermes_cli/test_update_venv_health.py new file mode 100644 index 000000000..b6660a8c1 --- /dev/null +++ b/tests/hermes_cli/test_update_venv_health.py @@ -0,0 +1,185 @@ +"""Tests for the Windows half-updated-venv hardening (July 2026 incident). + +Covers three additions to ``hermes update``: + +1. ``_venv_core_imports_healthy`` — the venv health probe that lets an + "Already up to date" checkout still repair a broken dependency install. +2. ``_detect_venv_python_processes`` — the venv-interpreter process guard + that refuses to mutate the venv while a desktop backend / stray python + holds .pyd files mapped. +3. The commit_count == 0 repair branch wiring in ``_cmd_update_impl``. + +All Windows-specific paths are exercised via ``_is_windows`` patching so +they run on any host (same approach as test_update_concurrent_quarantine). +""" + +from __future__ import annotations + +import subprocess +import sys +import types +from types import SimpleNamespace +from unittest.mock import MagicMock, patch + +import pytest + +from hermes_cli import main as cli_main + + +# --------------------------------------------------------------------------- +# _venv_core_imports_healthy +# --------------------------------------------------------------------------- + + +def test_venv_health_reports_healthy_when_no_venv(tmp_path): + """No venv python → nothing to probe → healthy (never blocks update).""" + with patch.object(cli_main, "PROJECT_ROOT", tmp_path): + healthy, detail = cli_main._venv_core_imports_healthy() + assert healthy is True + assert detail == "" + + +def _fake_venv_python(tmp_path, *, windows: bool = False): + bin_dir = tmp_path / "venv" / ("Scripts" if windows else "bin") + bin_dir.mkdir(parents=True) + py = bin_dir / ("python.exe" if windows else "python") + py.write_bytes(b"") + return py + + +def test_venv_health_reports_missing_imports(tmp_path): + """Probe output lines are surfaced as the unhealthy detail.""" + _fake_venv_python(tmp_path) + + fake = SimpleNamespace( + returncode=0, + stdout="fastapi: No module named 'annotated_doc'\n", + stderr="", + ) + with patch.object(cli_main, "PROJECT_ROOT", tmp_path), patch.object( + cli_main.subprocess, "run", return_value=fake + ): + healthy, detail = cli_main._venv_core_imports_healthy() + + assert healthy is False + assert "annotated_doc" in detail + + +def test_venv_health_healthy_when_probe_clean(tmp_path): + _fake_venv_python(tmp_path) + fake = SimpleNamespace(returncode=0, stdout="", stderr="") + with patch.object(cli_main, "PROJECT_ROOT", tmp_path), patch.object( + cli_main.subprocess, "run", return_value=fake + ): + healthy, detail = cli_main._venv_core_imports_healthy() + assert healthy is True + + +def test_venv_health_broken_interpreter_is_unhealthy(tmp_path): + """Nonzero exit with no module list = interpreter itself is broken.""" + _fake_venv_python(tmp_path) + fake = SimpleNamespace(returncode=1, stdout="", stderr="Fatal Python error: init failed\n") + with patch.object(cli_main, "PROJECT_ROOT", tmp_path), patch.object( + cli_main.subprocess, "run", return_value=fake + ): + healthy, detail = cli_main._venv_core_imports_healthy() + assert healthy is False + assert "Fatal Python error" in detail + + +def test_venv_health_probe_failure_reports_healthy(tmp_path): + """A probe that can't run must NOT force needless reinstalls.""" + _fake_venv_python(tmp_path) + with patch.object(cli_main, "PROJECT_ROOT", tmp_path), patch.object( + cli_main.subprocess, + "run", + side_effect=subprocess.TimeoutExpired(cmd="python", timeout=60), + ): + healthy, _detail = cli_main._venv_core_imports_healthy() + assert healthy is True + + +# --------------------------------------------------------------------------- +# _detect_venv_python_processes +# --------------------------------------------------------------------------- + + +def _proc(pid: int, exe: str, name: str, cmdline: list[str] | None = None): + proc = MagicMock() + proc.info = {"pid": pid, "exe": exe, "name": name, "cmdline": cmdline or []} + return proc + + +def test_detect_venv_python_off_windows_is_empty(): + with patch.object(cli_main, "_is_windows", return_value=False): + assert cli_main._detect_venv_python_processes() == [] + + +@patch.object(cli_main, "_is_windows", return_value=True) +def test_detect_venv_python_finds_backend(_winp, tmp_path): + venv_py = str(tmp_path / "venv" / "Scripts" / "python.exe") + other_py = "C:\\Python311\\python.exe" + + me = MagicMock() + me.parents.return_value = [] + fake_psutil = types.SimpleNamespace( + process_iter=lambda attrs: iter( + [ + _proc(101, venv_py, "python.exe", ["python.exe", "-m", "hermes_cli.main", "serve"]), + _proc(102, other_py, "python.exe", ["python.exe", "somescript.py"]), + ] + ), + Process=lambda *a, **k: me, + ) + with patch.object(cli_main, "PROJECT_ROOT", tmp_path), patch.dict( + sys.modules, {"psutil": fake_psutil} + ): + matches = cli_main._detect_venv_python_processes() + + assert [m[0] for m in matches] == [101] + assert "serve" in matches[0][2] + + +@patch.object(cli_main, "_is_windows", return_value=True) +def test_detect_venv_python_excludes_self_and_ancestors(_winp, tmp_path): + import os as _os + + venv_py = str(tmp_path / "venv" / "Scripts" / "python.exe") + parent = MagicMock() + parent.pid = 555 + me = MagicMock() + me.parents.return_value = [parent] + fake_psutil = types.SimpleNamespace( + process_iter=lambda attrs: iter( + [ + _proc(_os.getpid(), venv_py, "python.exe"), + _proc(555, venv_py, "hermes.exe"), + ] + ), + Process=lambda *a, **k: me, + ) + with patch.object(cli_main, "PROJECT_ROOT", tmp_path), patch.dict( + sys.modules, {"psutil": fake_psutil} + ): + assert cli_main._detect_venv_python_processes() == [] + + +@patch.object(cli_main, "_is_windows", return_value=True) +def test_detect_venv_python_no_psutil_is_empty(_winp, tmp_path): + with patch.object(cli_main, "PROJECT_ROOT", tmp_path), patch.dict( + sys.modules, {"psutil": None} + ): + assert cli_main._detect_venv_python_processes() == [] + + +def test_format_venv_holders_message_flags_desktop_backend(tmp_path): + matches = [ + (101, "python.exe", "python.exe -m hermes_cli.main serve --host 127.0.0.1"), + (102, "pythonw.exe", "pythonw.exe -m hermes_cli.main gateway run"), + ] + msg = cli_main._format_venv_python_holders_message(matches) + assert "101" in msg + assert "desktop app" in msg.lower() + assert "gateway" in msg + assert "hermes update" in msg + assert "--force" in msg From 4470d957cb952251827cb1f1ec9c9da309fde903 Mon Sep 17 00:00:00 2001 From: dsad Date: Fri, 3 Jul 2026 00:59:29 +0300 Subject: [PATCH 09/46] fix(browser): block Camofox input on private pages --- ...test_browser_camofox_private_page_guard.py | 51 +++++++++++++++++++ tools/browser_camofox.py | 12 +++++ 2 files changed, 63 insertions(+) diff --git a/tests/tools/test_browser_camofox_private_page_guard.py b/tests/tools/test_browser_camofox_private_page_guard.py index 410209d73..eae08077d 100644 --- a/tests/tools/test_browser_camofox_private_page_guard.py +++ b/tests/tools/test_browser_camofox_private_page_guard.py @@ -83,6 +83,34 @@ def test_private_page_blocks_camofox_reads(monkeypatch, _session, tool_call, act assert action_phrase in out["error"] +@pytest.mark.parametrize( + ("tool_call", "action_phrase"), + [ + (lambda: browser_camofox.camofox_click("@e1", task_id="t1"), "click"), + ( + lambda: browser_camofox.camofox_type("@e1", "do-not-send-this", task_id="t1"), + "type", + ), + (lambda: browser_camofox.camofox_press("Enter", task_id="t1"), "press"), + ], +) +def test_private_page_blocks_camofox_input_actions(monkeypatch, _session, tool_call, action_phrase): + _block_active(monkeypatch) + + def fail_post(*_args, **_kwargs): + raise AssertionError("Camofox action HTTP call should not run on a private page") + + monkeypatch.setattr(browser_camofox, "_post", fail_post) + + out = json.loads(tool_call()) + + assert out["success"] is False + assert PRIVATE_URL in out["error"] + assert "private or internal address" in out["error"] + assert action_phrase in out["error"] + assert "do-not-send-this" not in json.dumps(out) + + def test_snapshot_still_runs_when_page_is_public(monkeypatch, _session): _public_page(monkeypatch) @@ -98,6 +126,29 @@ def test_snapshot_still_runs_when_page_is_public(monkeypatch, _session): assert out["element_count"] == 1 +def test_camofox_click_still_runs_when_page_is_public(monkeypatch, _session): + _public_page(monkeypatch) + calls = [] + + def fake_post(path, body=None, timeout=None): + calls.append((path, body, timeout)) + return {"url": "https://example.test/"} + + monkeypatch.setattr(browser_camofox, "_post", fake_post) + + out = json.loads(browser_camofox.camofox_click("@e1", task_id="t1")) + + assert out["success"] is True + assert out["clicked"] == "e1" + assert calls == [ + ( + "/tabs/tab-1/click", + {"userId": "user-1", "ref": "e1"}, + None, + ) + ] + + def test_guard_inactive_does_not_probe(monkeypatch, _session): """When the SSRF guard is inactive the read proceeds WITHOUT probing the URL. diff --git a/tools/browser_camofox.py b/tools/browser_camofox.py index fe11256aa..4151d3cdb 100644 --- a/tools/browser_camofox.py +++ b/tools/browser_camofox.py @@ -653,6 +653,10 @@ def camofox_click(ref: str, task_id: Optional[str] = None) -> str: if not session["tab_id"]: return tool_error("No browser session. Call browser_navigate first.", success=False) + blocked = _camofox_private_page_block(session, task_id, "click") + if blocked: + return blocked + # Strip @ prefix if present (our tool convention) clean_ref = ref.lstrip("@") @@ -676,6 +680,10 @@ def camofox_type(ref: str, text: str, task_id: Optional[str] = None) -> str: if not session["tab_id"]: return tool_error("No browser session. Call browser_navigate first.", success=False) + blocked = _camofox_private_page_block(session, task_id, "type") + if blocked: + return blocked + clean_ref = ref.lstrip("@") _post( @@ -745,6 +753,10 @@ def camofox_press(key: str, task_id: Optional[str] = None) -> str: if not session["tab_id"]: return tool_error("No browser session. Call browser_navigate first.", success=False) + blocked = _camofox_private_page_block(session, task_id, "press") + if blocked: + return blocked + _post( f"/tabs/{session['tab_id']}/press", {"userId": session["user_id"], "key": key}, From 47764f19f462c0b3a99865255f3b1dfae5098e74 Mon Sep 17 00:00:00 2001 From: srojk34 <286497132+srojk34@users.noreply.github.com> Date: Fri, 3 Jul 2026 05:18:15 +0300 Subject: [PATCH 10/46] fix(browser): apply private-page guard to browser_cdp frame_id routing browser_cdp's frame_id (OOPIF) path returned early via _browser_cdp_via_supervisor before _browser_cdp_private_guard ever ran, unlike the stateless path a few lines below. A model that navigated a cloud browser to a private/internal URL could still read page content by passing frame_id, bypassing the same SSRF/private-page boundary already enforced on Runtime.evaluate, Page.navigate, and other raw CDP calls. Apply the same guard call used by the stateless path before dispatching to the supervisor, so both routing modes share one boundary. --- tests/tools/test_browser_cdp_tool.py | 64 ++++++++++++++++++++++++++++ tools/browser_cdp_tool.py | 9 ++++ 2 files changed, 73 insertions(+) diff --git a/tests/tools/test_browser_cdp_tool.py b/tests/tools/test_browser_cdp_tool.py index 194800701..0c0b16e9b 100644 --- a/tests/tools/test_browser_cdp_tool.py +++ b/tests/tools/test_browser_cdp_tool.py @@ -430,6 +430,70 @@ def test_runtime_evaluate_blocked_when_current_page_is_private(monkeypatch): assert calls == [] +def test_frame_id_route_blocked_when_current_page_is_private(monkeypatch): + """frame_id routing (OOPIF via supervisor) must not bypass the guard + applied to the stateless path — same private-page boundary either way.""" + supervisor_calls = [] + + import tools.browser_tool as bt + + monkeypatch.setattr(bt, "_eval_ssrf_guard_active", lambda task_id: True) + monkeypatch.setattr(bt, "_current_page_private_url", lambda task_id: PRIVATE_URL) + + def fake_supervisor_route(**kwargs): + supervisor_calls.append(kwargs) + return json.dumps({"success": True, "result": {"value": "private data"}}) + + monkeypatch.setattr( + browser_cdp_tool, "_browser_cdp_via_supervisor", fake_supervisor_route + ) + + result = json.loads( + browser_cdp_tool.browser_cdp( + method="Runtime.evaluate", + params={"expression": "document.body.innerText"}, + frame_id="frame-1", + task_id="task-1", + ) + ) + + assert "error" in result + assert PRIVATE_URL in result["error"] + assert "private or internal address" in result["error"] + assert supervisor_calls == [] + + +def test_frame_id_route_allowed_when_page_is_not_private(monkeypatch): + """Sanity check: the new guard call must not block ordinary frame_id + routing when the current page isn't private.""" + supervisor_calls = [] + + import tools.browser_tool as bt + + monkeypatch.setattr(bt, "_eval_ssrf_guard_active", lambda task_id: True) + monkeypatch.setattr(bt, "_current_page_private_url", lambda task_id: None) + + def fake_supervisor_route(**kwargs): + supervisor_calls.append(kwargs) + return json.dumps({"success": True, "result": {"value": "ok"}}) + + monkeypatch.setattr( + browser_cdp_tool, "_browser_cdp_via_supervisor", fake_supervisor_route + ) + + result = json.loads( + browser_cdp_tool.browser_cdp( + method="Runtime.evaluate", + params={"expression": "document.title"}, + frame_id="frame-1", + task_id="task-1", + ) + ) + + assert result.get("success") is True + assert len(supervisor_calls) == 1 + + def test_page_navigate_to_private_url_blocked_before_cdp(monkeypatch): calls = [] diff --git a/tools/browser_cdp_tool.py b/tools/browser_cdp_tool.py index ca7497bb6..2df9a1660 100644 --- a/tools/browser_cdp_tool.py +++ b/tools/browser_cdp_tool.py @@ -428,6 +428,15 @@ def browser_cdp( # --- Route iframe-scoped calls through the supervisor --------------- if frame_id: + # Same private-page/SSRF boundary as the stateless path below — + # frame_id routing must not become the sibling bypass for it. + blocked = _browser_cdp_private_guard( + task_id=effective_task_id, + method=method, + params=params or {}, + ) + if blocked: + return blocked return _browser_cdp_via_supervisor( task_id=effective_task_id, frame_id=frame_id, From 16332af60b5a5262111f1171c5d85f07463f929d Mon Sep 17 00:00:00 2001 From: srojk34 <286497132+srojk34@users.noreply.github.com> Date: Fri, 3 Jul 2026 05:45:35 +0300 Subject: [PATCH 11/46] security(gateway): anchor api_server MEDIA tag resolution to safe paths _resolve_media_to_data_urls's ad-hoc _MEDIA_TAG_RE matched any bare token after MEDIA: (no absolute-path anchor) and read the resolved path directly with no denylist. A relative/traversal path like MEDIA:../../../../etc/passwd.png slipped through, and any image- suffixed file the process could read (including under ~/.ssh, ~/.aws, etc.) was base64-inlined into the API response if its path merely appeared in the model's own final reply text. Every other platform adapter's MEDIA: handling already goes through two shared primitives in gateway/platforms/base.py: - MEDIA_TAG_CLEANUP_RE, which anchors the path to ~/, /, or a Windows drive letter plus a known deliverable extension. - validate_media_delivery_path, which resolves symlinks and rejects paths under the credential/system-path denylist. Reuse both here instead of the local unanchored pattern and naive Path().expanduser() resolution. --- gateway/platforms/api_server.py | 30 ++++++++++++---- .../test_api_server_media_data_urls.py | 34 +++++++++++++++++++ 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/gateway/platforms/api_server.py b/gateway/platforms/api_server.py index 3cf11f335..a02959684 100644 --- a/gateway/platforms/api_server.py +++ b/gateway/platforms/api_server.py @@ -54,9 +54,11 @@ except ImportError: from gateway.config import Platform, PlatformConfig from gateway.platforms.base import ( + MEDIA_TAG_CLEANUP_RE, BasePlatformAdapter, SendResult, is_network_accessible, + validate_media_delivery_path, ) from agent.redact import redact_sensitive_text @@ -581,9 +583,6 @@ _MEDIA_MIME = { ".webp": "image/webp", ".bmp": "image/bmp", } -_MEDIA_TAG_RE = re.compile( - r"[`\"']?MEDIA:\s*(`[^`\n]+`|\"[^\"\n]+\"|'[^'\n]+'|\S+)[`\"']?" -) _MEDIA_DATA_URL_MAX_BYTES = 5 * 1024 * 1024 # skip images larger than 5MB @@ -594,18 +593,35 @@ def _resolve_media_to_data_urls(text: str) -> str: ``MEDIA:`` tags referencing images on the server are useless to them. Inline small local images as markdown data URLs; non-image or unreadable paths are left untouched. + + Uses the same anchored ``MEDIA_TAG_CLEANUP_RE`` matcher and + ``validate_media_delivery_path`` safety check every other platform + adapter's media delivery already goes through (gateway/platforms/base.py) + — an absolute-path anchor plus a known-extension requirement, and a + resolved-path check against the credential/system-path denylist. The + prior pattern here matched any bare token after ``MEDIA:`` (including a + relative/traversal path like ``../../etc/passwd.png``) and read the file + directly with no denylist, so any image-suffixed, readable file the + process could see was base64-exfiltrated to the API caller if its path + merely appeared in the model's own final reply text. """ if not text or "MEDIA:" not in text: return text import base64 def _to_data_url(path_str: str) -> Optional[str]: - p = Path(path_str.strip().strip("`\"'")).expanduser() + # validate_media_delivery_path() strips wrapping quotes/backticks + # and trailing punctuation internally, same as MEDIA_TAG_CLEANUP_RE's + # other callers (extract_media / _strip_media_tag_directives) rely on. + safe_path = validate_media_delivery_path(path_str) + if not safe_path: + return None + p = Path(safe_path) suffix = p.suffix.lower() if suffix not in _MEDIA_IMG_EXT: return None try: - if not p.is_file() or p.stat().st_size > _MEDIA_DATA_URL_MAX_BYTES: + if p.stat().st_size > _MEDIA_DATA_URL_MAX_BYTES: return None b64 = base64.b64encode(p.read_bytes()).decode() except OSError: @@ -613,10 +629,10 @@ def _resolve_media_to_data_urls(text: str) -> str: return f"![image](data:{_MEDIA_MIME[suffix]};base64,{b64})" def _repl(m: "re.Match[str]") -> str: - return _to_data_url(m.group(1)) or m.group(0) + return _to_data_url(m.group("path")) or m.group(0) try: - return _MEDIA_TAG_RE.sub(_repl, text) + return MEDIA_TAG_CLEANUP_RE.sub(_repl, text) except Exception: return text diff --git a/tests/gateway/test_api_server_media_data_urls.py b/tests/gateway/test_api_server_media_data_urls.py index 960f4b194..bf0036b32 100644 --- a/tests/gateway/test_api_server_media_data_urls.py +++ b/tests/gateway/test_api_server_media_data_urls.py @@ -72,6 +72,40 @@ class TestResolveMediaToDataUrls(unittest.TestCase): out = _resolve_media_to_data_urls(f"MEDIA:{p1}\nand MEDIA:{p2}") self.assertEqual(out.count("data:image/png;base64,"), 2) + def test_relative_traversal_path_not_inlined(self): + """A relative/traversal path must never be inlined — the anchored + MEDIA_TAG_CLEANUP_RE matcher requires an absolute-path prefix + (~/, /, or a Windows drive letter), so a bare relative token after + MEDIA: is left as literal text rather than resolved against cwd.""" + text = "MEDIA:../../../../etc/passwd.png" + self.assertEqual(_resolve_media_to_data_urls(text), text) + + def test_credential_path_not_inlined_even_with_image_extension(self): + """An absolute path under the credential/system-path denylist + (validate_media_delivery_path) must not be inlined even though it + has an allowed image extension and the tag matcher's shape.""" + text = "MEDIA:~/.ssh/id_rsa.png" + self.assertEqual(_resolve_media_to_data_urls(text), text) + + def test_symlink_escaping_to_denylisted_target_not_inlined(self): + """A symlink whose resolved target lands under a denylisted system + prefix (/etc) must not be inlined — validate_media_delivery_path + resolves symlinks before the containment/denylist check runs, so + the traversal can't be laundered through an innocuous-looking + image-suffixed symlink name.""" + import os + import tempfile + from pathlib import Path + + d = Path(tempfile.mkdtemp(prefix="hermes_media_test_symlink")) + link = d / "shot.png" + try: + os.symlink("/etc/hosts", link) + except OSError: + self.skipTest("symlink creation not supported in this environment") + text = f"MEDIA:{link}" + self.assertEqual(_resolve_media_to_data_urls(text), text) + if __name__ == "__main__": unittest.main() From bc55c201c7563d5514477840506cda6d142f14ba Mon Sep 17 00:00:00 2001 From: liuhao1024 Date: Fri, 3 Jul 2026 11:55:08 +0800 Subject: [PATCH 12/46] fix(dashboard): block .env files from managed-files API The dashboard Files tab could list, read, and download .env files containing API keys when running with a bind-mounted Hermes home directory (e.g. docker run -v ~/.hermes:/opt/data). Add _SENSITIVE_FILENAMES frozenset and filter these from list_managed_files(), read_managed_file(), and download_managed_file(). Return 403 for direct read/download attempts on sensitive files. Fixes #57505 --- hermes_cli/web_server.py | 24 +++++++++++- tests/hermes_cli/test_web_server_files.py | 45 +++++++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/hermes_cli/web_server.py b/hermes_cli/web_server.py index ca4e5b02e..4f5aa98b2 100644 --- a/hermes_cli/web_server.py +++ b/hermes_cli/web_server.py @@ -1186,6 +1186,20 @@ _FS_READDIR_HIDDEN = { "target", "venv", } + +# Filenames that must never be listed, read, or downloaded through the +# managed-files API. These typically contain credentials (API keys, tokens) +# and exposing them through the dashboard file browser is a security leak — +# see issue #57505. +_SENSITIVE_FILENAMES: frozenset[str] = frozenset({ + ".env", + ".env.local", + ".env.production", + ".env.development", + ".env.staging", + ".env.test", + ".env.backup", +}) _FS_DATA_URL_MAX_BYTES = 16 * 1024 * 1024 _FS_TEXT_SOURCE_MAX_BYTES = 64 * 1024 * 1024 _FS_TEXT_PREVIEW_MAX_BYTES = 512 * 1024 @@ -1616,7 +1630,11 @@ async def list_managed_files(request: Request, path: Optional[str] = None): raise HTTPException(status_code=400, detail="Path is not a directory") try: - entries = [_managed_file_entry(policy, child) for child in target.iterdir()] + entries = [ + _managed_file_entry(policy, child) + for child in target.iterdir() + if child.name not in _SENSITIVE_FILENAMES + ] except PermissionError: raise HTTPException(status_code=403, detail="Directory is not readable") except OSError as exc: @@ -1642,6 +1660,8 @@ async def read_managed_file(request: Request, path: str): raise HTTPException(status_code=404, detail="File not found") if not target.is_file(): raise HTTPException(status_code=400, detail="Path is not a file") + if target.name in _SENSITIVE_FILENAMES: + raise HTTPException(status_code=403, detail="Access to sensitive files is not allowed") try: size = target.stat().st_size @@ -1684,6 +1704,8 @@ async def download_managed_file(request: Request, path: str): raise HTTPException(status_code=404, detail="File not found") if not target.is_file(): raise HTTPException(status_code=400, detail="Path is not a file") + if target.name in _SENSITIVE_FILENAMES: + raise HTTPException(status_code=403, detail="Access to sensitive files is not allowed") try: size = target.stat().st_size diff --git a/tests/hermes_cli/test_web_server_files.py b/tests/hermes_cli/test_web_server_files.py index b295f0ab9..b72e75c3f 100644 --- a/tests/hermes_cli/test_web_server_files.py +++ b/tests/hermes_cli/test_web_server_files.py @@ -488,3 +488,48 @@ def test_stream_upload_cleans_temp_on_cancellation(forced_files_client): # ... and no .upload temp file was left behind. leftovers = [p.name for p in target.parent.iterdir() if ".upload" in p.name] assert leftovers == [], f"temp upload files leaked on cancellation: {leftovers}" + + +def test_sensitive_env_files_hidden_from_listing(forced_files_client): + """Regression test for #57505: .env files must not appear in directory listings.""" + client, root = forced_files_client + + # Create a regular file and a .env file. + root.mkdir(parents=True, exist_ok=True) + regular = root / "config.txt" + regular.write_text("safe content") + env_file = root / ".env" + env_file.write_text("SECRET_KEY=abc123") + env_local = root / ".env.local" + env_local.write_text("LOCAL_SECRET=def456") + + listing = client.get("/api/files", params={"path": str(root)}) + assert listing.status_code == 200 + names = [e["name"] for e in listing.json()["entries"]] + assert "config.txt" in names + assert ".env" not in names + assert ".env.local" not in names + + +def test_sensitive_env_files_blocked_read(forced_files_client): + """Regression test for #57505: .env files must not be readable.""" + client, root = forced_files_client + + root.mkdir(parents=True, exist_ok=True) + env_file = root / ".env" + env_file.write_text("SECRET_KEY=abc123") + + resp = client.get("/api/files/read", params={"path": str(env_file)}) + assert resp.status_code == 403 + + +def test_sensitive_env_files_blocked_download(forced_files_client): + """Regression test for #57505: .env files must not be downloadable.""" + client, root = forced_files_client + + root.mkdir(parents=True, exist_ok=True) + env_file = root / ".env" + env_file.write_text("SECRET_KEY=abc123") + + resp = client.get("/api/files/download", params={"path": str(env_file)}) + assert resp.status_code == 403 From 1bcc52c14e714471ebe238223a7659fcc238981a Mon Sep 17 00:00:00 2001 From: liuhao1024 Date: Fri, 3 Jul 2026 12:18:58 +0800 Subject: [PATCH 13/46] fix(dashboard): use pattern match for .env sensitive file guard Replace the exact-filename frozenset with _is_sensitive_filename() that matches .env plus any .env. variant. This covers shorthand suffixes like .env.prod that the previous enumeration missed. Add test_sensitive_env_suffix_variants_blocked regression test covering .env.prod, .env.dev, .env.staging.local, and .env.ci. Addresses review feedback from egilewski on PR #57507. --- hermes_cli/web_server.py | 18 ++++++------------ tests/hermes_cli/test_web_server_files.py | 17 ++++++++++++++++- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/hermes_cli/web_server.py b/hermes_cli/web_server.py index 4f5aa98b2..217e7723d 100644 --- a/hermes_cli/web_server.py +++ b/hermes_cli/web_server.py @@ -1191,15 +1191,9 @@ _FS_READDIR_HIDDEN = { # managed-files API. These typically contain credentials (API keys, tokens) # and exposing them through the dashboard file browser is a security leak — # see issue #57505. -_SENSITIVE_FILENAMES: frozenset[str] = frozenset({ - ".env", - ".env.local", - ".env.production", - ".env.development", - ".env.staging", - ".env.test", - ".env.backup", -}) +def _is_sensitive_filename(name: str) -> bool: + """Return True for ``.env`` and any ``.env.`` variant.""" + return name == ".env" or name.startswith(".env.") _FS_DATA_URL_MAX_BYTES = 16 * 1024 * 1024 _FS_TEXT_SOURCE_MAX_BYTES = 64 * 1024 * 1024 _FS_TEXT_PREVIEW_MAX_BYTES = 512 * 1024 @@ -1633,7 +1627,7 @@ async def list_managed_files(request: Request, path: Optional[str] = None): entries = [ _managed_file_entry(policy, child) for child in target.iterdir() - if child.name not in _SENSITIVE_FILENAMES + if not _is_sensitive_filename(child.name) ] except PermissionError: raise HTTPException(status_code=403, detail="Directory is not readable") @@ -1660,7 +1654,7 @@ async def read_managed_file(request: Request, path: str): raise HTTPException(status_code=404, detail="File not found") if not target.is_file(): raise HTTPException(status_code=400, detail="Path is not a file") - if target.name in _SENSITIVE_FILENAMES: + if _is_sensitive_filename(target.name): raise HTTPException(status_code=403, detail="Access to sensitive files is not allowed") try: @@ -1704,7 +1698,7 @@ async def download_managed_file(request: Request, path: str): raise HTTPException(status_code=404, detail="File not found") if not target.is_file(): raise HTTPException(status_code=400, detail="Path is not a file") - if target.name in _SENSITIVE_FILENAMES: + if _is_sensitive_filename(target.name): raise HTTPException(status_code=403, detail="Access to sensitive files is not allowed") try: diff --git a/tests/hermes_cli/test_web_server_files.py b/tests/hermes_cli/test_web_server_files.py index b72e75c3f..8bc40680f 100644 --- a/tests/hermes_cli/test_web_server_files.py +++ b/tests/hermes_cli/test_web_server_files.py @@ -494,7 +494,7 @@ def test_sensitive_env_files_hidden_from_listing(forced_files_client): """Regression test for #57505: .env files must not appear in directory listings.""" client, root = forced_files_client - # Create a regular file and a .env file. + # Create a regular file and .env variants including shorthand suffixes. root.mkdir(parents=True, exist_ok=True) regular = root / "config.txt" regular.write_text("safe content") @@ -502,6 +502,8 @@ def test_sensitive_env_files_hidden_from_listing(forced_files_client): env_file.write_text("SECRET_KEY=abc123") env_local = root / ".env.local" env_local.write_text("LOCAL_SECRET=def456") + env_prod = root / ".env.prod" + env_prod.write_text("PROD_SECRET=ghi789") listing = client.get("/api/files", params={"path": str(root)}) assert listing.status_code == 200 @@ -509,6 +511,7 @@ def test_sensitive_env_files_hidden_from_listing(forced_files_client): assert "config.txt" in names assert ".env" not in names assert ".env.local" not in names + assert ".env.prod" not in names def test_sensitive_env_files_blocked_read(forced_files_client): @@ -533,3 +536,15 @@ def test_sensitive_env_files_blocked_download(forced_files_client): resp = client.get("/api/files/download", params={"path": str(env_file)}) assert resp.status_code == 403 + + +def test_sensitive_env_suffix_variants_blocked(forced_files_client): + """Regression: .env. shorthand variants (e.g. .env.prod) must also be blocked.""" + client, root = forced_files_client + + root.mkdir(parents=True, exist_ok=True) + for suffix in ("prod", "dev", "staging.local", "ci"): + p = root / f".env.{suffix}" + p.write_text(f"SECRET_{suffix}=abc123") + assert client.get("/api/files/read", params={"path": str(p)}).status_code == 403 + assert client.get("/api/files/download", params={"path": str(p)}).status_code == 403 From e4dbb67bf58040a905cf3fb830fce41f927df678 Mon Sep 17 00:00:00 2001 From: Eugeniusz Gilewski Date: Thu, 2 Jul 2026 01:43:21 +0200 Subject: [PATCH 14/46] fix(security): remove model-controlled delegate ACP transport Source: https://github.com/NousResearch/hermes-agent/pull/52346 Related prior work: https://github.com/NousResearch/hermes-agent/pull/39462 Related prior work: https://github.com/NousResearch/hermes-agent/pull/27426 Maintainer direction: https://github.com/NousResearch/hermes-agent/pull/52346#issuecomment-4854881612 Remove acp_command and acp_args from the model-facing delegate_task schema and dispatch paths. Child agents can still use ACP subprocess transport when it comes from trusted delegation config or parent inheritance, but a model tool call can no longer choose the command or arguments that reach child construction. This is salvageable because the risky boundary is model control over child ACP transport, not ACP itself. The patch follows the maintainer direction from the source discussion by preserving trusted ACP configuration and prior integration work while removing the untrusted tool-call fields from both top-level and per-task delegate inputs. Reproduced on main by passing acp_command through delegate_task and observing it reach _build_child_agent. Verified after the fix that model dispatch strips the hidden top-level fields and per-task hidden fields are ignored before child construction. Co-authored-by: Carlosian Co-authored-by: ssiweifnag <120658181+ssiweifnag@users.noreply.github.com> Co-authored-by: nikshepsvn <23241247+nikshepsvn@users.noreply.github.com> --- run_agent.py | 9 +- tests/tools/test_delegate.py | 165 +++++++++++------------------------ tools/delegate_tool.py | 126 ++++++-------------------- 3 files changed, 84 insertions(+), 216 deletions(-) diff --git a/run_agent.py b/run_agent.py index aaafd469a..cdd82f459 100644 --- a/run_agent.py +++ b/run_agent.py @@ -5623,7 +5623,10 @@ class AIAgent: New DELEGATE_TASK_SCHEMA fields only need to be added here to reach all invocation paths (concurrent, sequential, inline). """ - from tools.delegate_tool import delegate_task as _delegate_task + from tools.delegate_tool import ( + _strip_model_hidden_task_fields, + delegate_task as _delegate_task, + ) # Delegations from the top-level MODEL always run in the background — # the model does not get to choose. delegate_task returns immediately # with a handle (one per task) and each subagent's result re-enters the @@ -5639,10 +5642,8 @@ class AIAgent: return _delegate_task( goal=function_args.get("goal"), context=function_args.get("context"), - tasks=function_args.get("tasks"), + tasks=_strip_model_hidden_task_fields(function_args.get("tasks")), max_iterations=function_args.get("max_iterations"), - acp_command=function_args.get("acp_command"), - acp_args=function_args.get("acp_args"), role=function_args.get("role"), background=(not _is_subagent), parent_agent=self, diff --git a/tests/tools/test_delegate.py b/tests/tools/test_delegate.py index d35d3627e..5830706bf 100644 --- a/tests/tools/test_delegate.py +++ b/tests/tools/test_delegate.py @@ -78,6 +78,12 @@ class TestDelegateRequirements(unittest.TestCase): # config-authoritative via delegation.max_iterations so users get # predictable budgets. self.assertNotIn("max_iterations", props) + # ACP subprocess transport is operator-controlled via config.yaml, not + # model-controlled via delegate_task arguments. + self.assertNotIn("acp_command", props) + self.assertNotIn("acp_args", props) + self.assertNotIn("acp_command", props["tasks"]["items"]["properties"]) + self.assertNotIn("acp_args", props["tasks"]["items"]["properties"]) self.assertNotIn("maxItems", props["tasks"]) # removed — limit is now runtime-configurable def test_schema_description_advertises_runtime_limits(self): @@ -522,16 +528,7 @@ class TestToolNamePreservation(unittest.TestCase): ) def test_build_child_agent_ignores_acp_command_when_binary_missing(self): - """Regression: _build_child_agent must not force provider='copilot-acp' - when the override_acp_command binary is not on PATH. - - Without this guard, a model that hallucinates - ``delegate_task(acp_command="copilot")`` on a host without the Copilot - CLI installed (Railway / headless containers / fresh VPS) would route - the subagent through CopilotACPClient, which spawns the binary via - subprocess and raises RuntimeError. After 3 retries the asyncio loop - teardown can take the entire gateway down. - """ + """Stale delegation.command config must not force ACP subprocess mode.""" parent = _make_mock_parent(depth=0) # The crash scenario is a TG/cron agent on a host with no ACP CLI — # parent itself has no acp_command, so clearing the override must NOT @@ -606,68 +603,20 @@ class TestToolNamePreservation(unittest.TestCase): self.assertEqual(captured["provider"], "copilot-acp") self.assertEqual(captured["acp_command"], "copilot") - def test_schema_prunes_acp_command_when_no_acp_binary(self): - """Schema-level defense: delegate_task tool schema must NOT advertise - acp_command / acp_args to the model when no ACP binary is installed. - - Headless deploys (Railway / Fly / Docker / fresh VPS) typically have - none of copilot / claude / codex. Without the schema prune, models - occasionally hallucinate ``acp_command="copilot"`` from the field's - description and crash subagent runs. - """ + def test_schema_never_exposes_acp_transport_fields(self): + """delegate_task must never make ACP transport model-facing.""" from tools.delegate_tool import _build_dynamic_schema_overrides - with patch("tools.delegate_tool._acp_binary_available", return_value=False): + with patch("shutil.which", return_value="/usr/local/bin/copilot"): overrides = _build_dynamic_schema_overrides() props = overrides["parameters"]["properties"] - self.assertNotIn("acp_command", props, "top-level acp_command must be pruned") - self.assertNotIn("acp_args", props, "top-level acp_args must be pruned") + self.assertNotIn("acp_command", props) + self.assertNotIn("acp_args", props) task_item_props = props["tasks"]["items"]["properties"] - self.assertNotIn( - "acp_command", task_item_props, "per-task acp_command must be pruned" - ) - self.assertNotIn( - "acp_args", task_item_props, "per-task acp_args must be pruned" - ) - - def test_schema_keeps_acp_command_when_binary_available(self): - """Backward compat: when an ACP CLI IS on PATH, schema is unchanged. - Users with working ACP setups must still be able to invoke it. - """ - from tools.delegate_tool import _build_dynamic_schema_overrides - - with patch("tools.delegate_tool._acp_binary_available", return_value=True): - overrides = _build_dynamic_schema_overrides() - - props = overrides["parameters"]["properties"] - self.assertIn("acp_command", props) - self.assertIn("acp_args", props) - - task_item_props = props["tasks"]["items"]["properties"] - self.assertIn("acp_command", task_item_props) - self.assertIn("acp_args", task_item_props) - - def test_acp_binary_available_checks_known_clis(self): - """_acp_binary_available must check the known ACP CLI names via - shutil.which — guards against typos or accidental list trimming. - """ - from tools.delegate_tool import _KNOWN_ACP_BINARIES, _acp_binary_available - - self.assertIn("copilot", _KNOWN_ACP_BINARIES) - - calls = [] - - def fake_which(name): - calls.append(name) - return None - - with patch("shutil.which", side_effect=fake_which): - self.assertFalse(_acp_binary_available()) - - for name in _KNOWN_ACP_BINARIES: - self.assertIn(name, calls) + self.assertNotIn("acp_command", task_item_props) + self.assertNotIn("acp_args", task_item_props) def test_saved_tool_names_set_on_child_before_run(self): """_run_single_child must set _delegate_saved_tool_names on the child @@ -2281,37 +2230,39 @@ class TestDelegationReasoningEffort(unittest.TestCase): class TestDispatchDelegateTask(unittest.TestCase): """Tests for the _dispatch_delegate_task helper and full param forwarding.""" - @patch("tools.delegate_tool._load_config", return_value={}) - @patch("tools.delegate_tool._resolve_delegation_credentials") - def test_acp_args_forwarded(self, mock_creds, mock_cfg): - """Both acp_command and acp_args reach delegate_task via the helper.""" - mock_creds.return_value = { - "provider": None, "base_url": None, - "api_key": None, "api_mode": None, "model": None, - } - parent = _make_mock_parent(depth=0) - with patch("tools.delegate_tool._build_child_agent") as mock_build: - mock_child = MagicMock() - mock_child.run_conversation.return_value = { - "final_response": "done", "completed": True, - "api_calls": 1, "messages": [], - } - mock_child._delegate_saved_tool_names = [] - mock_child._credential_pool = None - mock_child.session_prompt_tokens = 0 - mock_child.session_completion_tokens = 0 - mock_child.model = "test" - mock_build.return_value = mock_child + def test_model_acp_args_not_forwarded(self): + """The live model dispatch path strips hidden ACP transport args.""" + import run_agent - delegate_task( - goal="test", - acp_command="claude", - acp_args=["--acp", "--stdio"], - parent_agent=parent, + captured = {} + + def fake_delegate_task(**kwargs): + captured.update(kwargs) + return "{}" + + parent = _make_mock_parent(depth=0) + with patch("tools.delegate_tool.delegate_task", fake_delegate_task): + run_agent.AIAgent._dispatch_delegate_task( + parent, + { + "goal": "test", + "acp_command": "claude", + "acp_args": ["--acp", "--stdio"], + "tasks": [ + { + "goal": "nested", + "acp_command": "codex", + "acp_args": ["--acp"], + }, + ], + }, ) - _, kwargs = mock_build.call_args - self.assertEqual(kwargs["override_acp_command"], "claude") - self.assertEqual(kwargs["override_acp_args"], ["--acp", "--stdio"]) + + self.assertNotIn("acp_command", captured) + self.assertNotIn("acp_args", captured) + self.assertEqual(captured["goal"], "test") + self.assertNotIn("acp_command", captured["tasks"][0]) + self.assertNotIn("acp_args", captured["tasks"][0]) class TestDelegateEventEnum(unittest.TestCase): """Tests for DelegateEvent enum and back-compat aliases.""" @@ -2600,31 +2551,15 @@ class TestOrchestratorRoleSchema(unittest.TestCase): self.assertIn("role", task_props) self.assertEqual(task_props["role"]["enum"], ["leaf", "orchestrator"]) - def test_acp_command_description_has_do_not_set_guidance(self): - # acp_command/acp_args descriptions must NOT bias the model toward - # assuming an ACP CLI (Claude, Copilot, etc.) is installed. They must - # carry explicit "do not set unless told" guidance so the model doesn't - # hallucinate ACP availability (#22013). + def test_schema_omits_acp_transport_fields(self): from tools.delegate_tool import DELEGATE_TASK_SCHEMA props = DELEGATE_TASK_SCHEMA["parameters"]["properties"] - top_acp_desc = props["acp_command"]["description"] - self.assertIn("Do NOT set", top_acp_desc) - self.assertIn("explicitly told you", top_acp_desc) - task_props = props["tasks"]["items"]["properties"] - per_task_acp_desc = task_props["acp_command"]["description"] - self.assertIn("Do NOT set", per_task_acp_desc) - - def test_acp_command_description_has_no_claude_as_example(self): - # Descriptions must not list 'claude' as a canonical example value — - # that directly primes the model to attempt Claude ACP even when it is - # not installed (#22013). - from tools.delegate_tool import DELEGATE_TASK_SCHEMA - props = DELEGATE_TASK_SCHEMA["parameters"]["properties"] - top_acp_desc = props["acp_command"]["description"].lower() - self.assertNotIn("e.g. 'claude'", top_acp_desc) - self.assertNotIn("e.g. \"claude\"", top_acp_desc) + self.assertNotIn("acp_command", props) + self.assertNotIn("acp_args", props) + self.assertNotIn("acp_command", task_props) + self.assertNotIn("acp_args", task_props) # Sentinel used to distinguish "role kwarg omitted" from "role=None". diff --git a/tools/delegate_tool.py b/tools/delegate_tool.py index b3172e51a..2baf4da30 100644 --- a/tools/delegate_tool.py +++ b/tools/delegate_tool.py @@ -1055,7 +1055,7 @@ def _build_child_agent( override_base_url: Optional[str] = None, override_api_key: Optional[str] = None, override_api_mode: Optional[str] = None, - # ACP transport overrides — lets a non-ACP parent spawn ACP child agents + # ACP transport overrides from trusted delegation config. override_acp_command: Optional[str] = None, override_acp_args: Optional[List[str]] = None, # Per-call role controlling whether the child can further delegate. @@ -1212,11 +1212,9 @@ def _build_child_agent( effective_api_mode = None # force re-derivation from provider's defaults else: effective_api_mode = getattr(parent_agent, "api_mode", None) - # Defensive: validate override_acp_command exists on PATH before honoring - # it. Models occasionally pass acp_command="copilot" / "claude" / etc. in - # delegate_task tool calls despite the schema saying not to, which forces - # the subagent onto the copilot-acp transport below and crashes the - # gateway when the binary is missing (e.g. headless container deploys). + # Defensive: validate trusted delegation.command exists on PATH before + # honoring it. Stale config should not force a child onto the ACP transport + # and then fail at subprocess startup. if override_acp_command: import shutil as _shutil @@ -2346,8 +2344,6 @@ def delegate_task( context: Optional[str] = None, tasks: Optional[List[Dict[str, Any]]] = None, max_iterations: Optional[int] = None, - acp_command: Optional[str] = None, - acp_args: Optional[List[str]] = None, role: Optional[str] = None, background: Optional[bool] = None, parent_agent=None, @@ -2486,7 +2482,6 @@ def delegate_task( children = [] try: for i, t in enumerate(task_list): - task_acp_args = t.get("acp_args") if "acp_args" in t else None # Per-task role beats top-level; normalise again so unknown # per-task values warn and degrade to leaf uniformly. effective_role = _normalize_role(t.get("role") or top_role) @@ -2505,14 +2500,8 @@ def delegate_task( override_base_url=creds["base_url"], override_api_key=creds["api_key"], override_api_mode=creds["api_mode"], - override_acp_command=t.get("acp_command") - or acp_command - or creds.get("command"), - override_acp_args=( - task_acp_args - if task_acp_args is not None - else (acp_args if acp_args is not None else creds.get("args")) - ), + override_acp_command=creds.get("command"), + override_acp_args=creds.get("args"), role=effective_role, ) # Override with correct parent tool names (before child construction mutated global) @@ -3292,30 +3281,6 @@ def _build_role_param_description() -> str: ) -# Known ACP-compatible CLIs that delegate_task can shell out to. Kept -# narrow on purpose: only the ones agent/copilot_acp_client.py and friends -# actually understand. Add new entries here when a new ACP CLI ships. -_KNOWN_ACP_BINARIES: tuple[str, ...] = ("copilot", "claude", "codex") - - -def _acp_binary_available() -> bool: - """True iff at least one known ACP CLI is on PATH. - - Used to gate inclusion of ``acp_command`` / ``acp_args`` in the - delegate_task schema. On headless hosts (Railway / Fly / Docker / - fresh VPS) without any of these binaries, exposing the fields invites - the model to hallucinate ``acp_command="copilot"`` from the schema's - description, which used to crash subagent runs and take the gateway - down. Pruning the fields from the schema removes the temptation. - - Not cached: ``shutil.which`` is cheap and we want the schema to react - to mid-session installs without forcing a process restart. - """ - import shutil as _shutil - - return any(_shutil.which(name) for name in _KNOWN_ACP_BINARIES) - - def _build_dynamic_schema_overrides() -> dict: """Return per-call schema overrides reflecting current config. @@ -3333,24 +3298,6 @@ def _build_dynamic_schema_overrides() -> dict: overrides_params["properties"]["tasks"]["description"] = _build_tasks_param_description() overrides_params["properties"]["role"]["description"] = _build_role_param_description() - # Prune ACP overrides from the schema when no known ACP CLI is on PATH. - # The runtime guard in _build_child_agent remains as defense-in-depth for - # internal callers / tests / future code paths that skip the schema layer. - if not _acp_binary_available(): - overrides_params["properties"].pop("acp_command", None) - overrides_params["properties"].pop("acp_args", None) - tasks_schema = dict(overrides_params["properties"].get("tasks", {})) - if "items" in tasks_schema: - items = dict(tasks_schema["items"]) - if "properties" in items: - items["properties"] = { - k: v - for k, v in items["properties"].items() - if k not in ("acp_command", "acp_args") - } - tasks_schema["items"] = items - overrides_params["properties"]["tasks"] = tasks_schema - return { "description": _build_top_level_description(), "parameters": overrides_params, @@ -3401,19 +3348,6 @@ DELEGATE_TASK_SCHEMA = { "type": "string", "description": "Task-specific context", }, - "acp_command": { - "type": "string", - "description": ( - "Per-task ACP command override (e.g. 'copilot'). " - "Overrides the top-level acp_command for this task only. " - "Do NOT set unless the user explicitly told you an ACP CLI is installed." - ), - }, - "acp_args": { - "type": "array", - "items": {"type": "string"}, - "description": "Per-task ACP args override. Leave empty unless acp_command is set.", - }, "role": { "type": "string", "enum": ["leaf", "orchestrator"], @@ -3444,28 +3378,6 @@ DELEGATE_TASK_SCHEMA = { "compatibility." ), }, - "acp_command": { - "type": "string", - "description": ( - "Override ACP command for child agents (e.g. 'copilot'). " - "When set, children use ACP subprocess transport instead of inheriting " - "the parent's transport. Requires an ACP-compatible CLI " - "(currently GitHub Copilot CLI via 'copilot --acp --stdio'). " - "See agent/copilot_acp_client.py for the implementation. " - "IMPORTANT: Do NOT set this unless the user has explicitly told you " - "a specific ACP-compatible CLI is installed and configured. " - "Leave empty to use the parent's default transport (Hermes subagents)." - ), - }, - "acp_args": { - "type": "array", - "items": {"type": "string"}, - "description": ( - "Arguments for the ACP command (default: ['--acp', '--stdio']). " - "Only used when acp_command is set. " - "Leave empty unless acp_command is explicitly provided." - ), - }, }, "required": [], }, @@ -3492,6 +3404,28 @@ def _model_background_value(args: dict, parent_agent=None) -> bool: return not is_subagent +_MODEL_HIDDEN_TASK_FIELDS = {"acp_command", "acp_args"} + + +def _strip_model_hidden_task_fields(tasks: Any) -> Any: + if not isinstance(tasks, list): + return tasks + stripped_tasks = [] + changed = False + for task in tasks: + if not isinstance(task, dict): + stripped_tasks.append(task) + continue + stripped = { + key: value + for key, value in task.items() + if key not in _MODEL_HIDDEN_TASK_FIELDS + } + changed = changed or len(stripped) != len(task) + stripped_tasks.append(stripped) + return stripped_tasks if changed else tasks + + registry.register( name="delegate_task", toolset="delegation", @@ -3499,10 +3433,8 @@ registry.register( handler=lambda args, **kw: delegate_task( goal=args.get("goal"), context=args.get("context"), - tasks=args.get("tasks"), + tasks=_strip_model_hidden_task_fields(args.get("tasks")), max_iterations=args.get("max_iterations"), - acp_command=args.get("acp_command"), - acp_args=args.get("acp_args"), role=args.get("role"), background=_model_background_value(args, kw.get("parent_agent")), parent_agent=kw.get("parent_agent"), From 62882b8e6f717a7b5305a543d7b603c8d41ea82c Mon Sep 17 00:00:00 2001 From: Que0x Date: Fri, 3 Jul 2026 12:39:01 +0300 Subject: [PATCH 15/46] fix(matrix): isolate per-event failures in _dispatch_sync gather MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `_dispatch_sync` gathers the mautrix per-event handler tasks with a bare `asyncio.gather(*tasks)`. Without `return_exceptions=True`, the first handler that raises aborts the gather, so the sibling events in the same sync response are dropped unprocessed — the exception propagates up to the sync loop, which logs a single "sync error" and moves on. The invite/redaction gathers a few lines above already use `return_exceptions=True`. Use `return_exceptions=True` and log each failing handler, so one bad event no longer takes out the rest of its batch and per-event failures stay visible. Regression test: a batch with one failing and one succeeding handler no longer raises, the good handler still runs, and the failure is logged (mutation- verified — reverting re-raises RuntimeError out of _dispatch_sync). --- plugins/platforms/matrix/adapter.py | 13 +++++++++++- tests/gateway/test_matrix.py | 33 +++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/plugins/platforms/matrix/adapter.py b/plugins/platforms/matrix/adapter.py index ebe9ebbbf..dac4dbd16 100644 --- a/plugins/platforms/matrix/adapter.py +++ b/plugins/platforms/matrix/adapter.py @@ -2351,7 +2351,18 @@ class MatrixAdapter(BasePlatformAdapter): if inspect.isawaitable(tasks): tasks = await tasks if tasks: - await asyncio.gather(*tasks) + # return_exceptions=True so one failing event handler doesn't abort + # the whole gather and silently drop the SIBLING events in the same + # sync response (a bare gather re-raises the first exception, leaving + # the rest of the batch unprocessed). Mirrors the invite/redaction + # gathers above. Surface each failure instead of swallowing it. + results = await asyncio.gather(*tasks, return_exceptions=True) + for result in results: + if isinstance(result, Exception): + logger.warning( + "Matrix: event handler failed during sync dispatch: %s", + result, + ) def _is_self_sender(self, sender: str) -> bool: """Return True if the sender refers to the bot's own account. diff --git a/tests/gateway/test_matrix.py b/tests/gateway/test_matrix.py index 748422045..d239728b7 100644 --- a/tests/gateway/test_matrix.py +++ b/tests/gateway/test_matrix.py @@ -5276,3 +5276,36 @@ class TestDeviceIdRecoveryOnReconnect: assert None not in _verify_call.args[0]["@bot:example.org"] await adapter.disconnect() + + +class TestMatrixDispatchSyncIsolation: + """A failing mautrix event handler must not abort the whole sync batch. + + ``_dispatch_sync`` gathers the per-event handler tasks. Without + ``return_exceptions=True`` the first exception aborts the gather and the + sibling events in the same sync response are silently dropped. + """ + + @pytest.mark.asyncio + async def test_dispatch_sync_isolates_failing_handler(self, caplog): + import logging + + adapter = _make_adapter() + ran = {"ok": False} + + async def _boom(): + raise RuntimeError("handler boom") + + async def _ok(): + ran["ok"] = True + + client = MagicMock() + client.handle_sync = MagicMock(return_value=[_boom(), _ok()]) + adapter._client = client + + with caplog.at_level(logging.WARNING): + # Must not raise despite the failing handler. + await adapter._dispatch_sync({"next_batch": "s1"}) + + assert ran["ok"] is True # the sibling handler still ran + assert "event handler failed" in caplog.text # failure surfaced, not swallowed From 7485fe0605a54eb148caf6eb7cf16fc23f18e6b5 Mon Sep 17 00:00:00 2001 From: teknium1 <127238744+teknium1@users.noreply.github.com> Date: Fri, 3 Jul 2026 03:06:55 -0700 Subject: [PATCH 16/46] fix(dashboard): make .env sensitive-file guard case-insensitive Follow-up to #57507: .ENV / .Env.local on case-insensitive filesystem mounts slipped past the guard. Lowercase the name before matching and add a regression test. Addresses egilewski's open review note. --- hermes_cli/web_server.py | 9 +++++++-- tests/hermes_cli/test_web_server_files.py | 12 ++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/hermes_cli/web_server.py b/hermes_cli/web_server.py index 217e7723d..f81353f6a 100644 --- a/hermes_cli/web_server.py +++ b/hermes_cli/web_server.py @@ -1192,8 +1192,13 @@ _FS_READDIR_HIDDEN = { # and exposing them through the dashboard file browser is a security leak — # see issue #57505. def _is_sensitive_filename(name: str) -> bool: - """Return True for ``.env`` and any ``.env.`` variant.""" - return name == ".env" or name.startswith(".env.") + """Return True for ``.env`` and any ``.env.`` variant. + + Case-insensitive so ``.ENV`` / ``.Env.local`` on case-insensitive + filesystems (macOS/Windows mounts) can't slip past the guard. + """ + lowered = name.lower() + return lowered == ".env" or lowered.startswith(".env.") _FS_DATA_URL_MAX_BYTES = 16 * 1024 * 1024 _FS_TEXT_SOURCE_MAX_BYTES = 64 * 1024 * 1024 _FS_TEXT_PREVIEW_MAX_BYTES = 512 * 1024 diff --git a/tests/hermes_cli/test_web_server_files.py b/tests/hermes_cli/test_web_server_files.py index 8bc40680f..63a8b39ff 100644 --- a/tests/hermes_cli/test_web_server_files.py +++ b/tests/hermes_cli/test_web_server_files.py @@ -548,3 +548,15 @@ def test_sensitive_env_suffix_variants_blocked(forced_files_client): p.write_text(f"SECRET_{suffix}=abc123") assert client.get("/api/files/read", params={"path": str(p)}).status_code == 403 assert client.get("/api/files/download", params={"path": str(p)}).status_code == 403 + + +def test_sensitive_env_case_insensitive_blocked(forced_files_client): + """Regression: .ENV / .Env.local casings must be blocked too (case-insensitive FS mounts).""" + client, root = forced_files_client + + root.mkdir(parents=True, exist_ok=True) + for name in (".ENV", ".Env.local", ".eNv.PROD"): + p = root / name + p.write_text("SECRET=abc123") + assert client.get("/api/files/read", params={"path": str(p)}).status_code == 403 + assert client.get("/api/files/download", params={"path": str(p)}).status_code == 403 From b53ba0e188363800447b7aca4c0a85420c39d1a8 Mon Sep 17 00:00:00 2001 From: Brooklyn Nicholson Date: Fri, 3 Jul 2026 05:30:16 -0500 Subject: [PATCH 17/46] fix(tts): coerce direct-only OpenAI model on the managed audio gateway A user with tts.openai.model set to a direct-OpenAI model (e.g. tts-1-hd) but no VOICE_TOOLS_OPENAI_KEY/OPENAI_API_KEY (or with tts.use_gateway) routes TTS through the managed Nous audio gateway, which only proxies gpt-4o-mini-tts. The request 400s with: VALIDATION_ERROR: Unsupported managed OpenAI speech model {'model': 'tts-1-hd', 'supportedModels': ['gpt-4o-mini-tts']} _resolve_openai_audio_client_config now reports whether it resolved the managed gateway; _generate_openai_tts coerces the model to a managed-supported one (logging a warning that points at the direct-key escape hatch) unless the user redirected base_url to their own endpoint. Direct-key users keep their tts-1/tts-1-hd preference unchanged. --- tests/tools/test_managed_media_gateways.py | 40 ++++++++++++++++++++++ tests/tools/test_tts_speed.py | 2 +- tools/tts_tool.py | 40 +++++++++++++++++----- 3 files changed, 73 insertions(+), 9 deletions(-) diff --git a/tests/tools/test_managed_media_gateways.py b/tests/tools/test_managed_media_gateways.py index d8b60d164..1b248ce09 100644 --- a/tests/tools/test_managed_media_gateways.py +++ b/tests/tools/test_managed_media_gateways.py @@ -244,6 +244,46 @@ def test_openai_tts_uses_managed_audio_gateway_when_direct_key_absent(monkeypatc assert captured["close_calls"] == 1 +def test_openai_tts_coerces_direct_only_model_on_managed_gateway(monkeypatch, tmp_path): + """A tts.openai.model valid only for direct OpenAI (e.g. tts-1-hd) must be + coerced to a managed-supported model, else the gateway 400s with + 'Unsupported managed OpenAI speech model'.""" + captured = {} + _install_fake_tools_package() + _install_fake_openai_module(captured) + monkeypatch.delenv("VOICE_TOOLS_OPENAI_KEY", raising=False) + monkeypatch.delenv("OPENAI_API_KEY", raising=False) + monkeypatch.setenv("TOOL_GATEWAY_DOMAIN", "nousresearch.com") + monkeypatch.setenv("TOOL_GATEWAY_USER_TOKEN", "nous-token") + + tts_tool = _load_tool_module("tools.tts_tool", "tts_tool.py") + output_path = tmp_path / "speech.mp3" + tts_tool._generate_openai_tts( + "hello world", str(output_path), {"openai": {"model": "tts-1-hd"}} + ) + + assert captured["base_url"] == "https://openai-audio-gateway.nousresearch.com/v1" + assert captured["speech_kwargs"]["model"] == "gpt-4o-mini-tts" + + +def test_openai_tts_keeps_direct_only_model_with_direct_key(monkeypatch, tmp_path): + """With a direct key, the user's tts-1-hd is honored (not coerced).""" + captured = {} + _install_fake_tools_package() + _install_fake_openai_module(captured) + monkeypatch.setenv("OPENAI_API_KEY", "openai-direct-key") + monkeypatch.delenv("VOICE_TOOLS_OPENAI_KEY", raising=False) + + tts_tool = _load_tool_module("tools.tts_tool", "tts_tool.py") + output_path = tmp_path / "speech.mp3" + tts_tool._generate_openai_tts( + "hello world", str(output_path), {"openai": {"model": "tts-1-hd"}} + ) + + assert captured["base_url"] == "https://api.openai.com/v1" + assert captured["speech_kwargs"]["model"] == "tts-1-hd" + + def test_openai_tts_accepts_openai_api_key_as_direct_fallback(monkeypatch, tmp_path): captured = {} _install_fake_tools_package() diff --git a/tests/tools/test_tts_speed.py b/tests/tools/test_tts_speed.py index d9274bb84..d079418e7 100644 --- a/tests/tools/test_tts_speed.py +++ b/tests/tools/test_tts_speed.py @@ -78,7 +78,7 @@ class TestOpenaiTtsSpeed: with patch("tools.tts_tool._import_openai_client", return_value=mock_cls), \ patch("tools.tts_tool._resolve_openai_audio_client_config", - return_value=("test-key", None)): + return_value=("test-key", None, False)): from tools.tts_tool import _generate_openai_tts _generate_openai_tts("Hello", str(tmp_path / "out.mp3"), tts_config) return mock_client.audio.speech.create diff --git a/tools/tts_tool.py b/tools/tts_tool.py index b71ebfa82..e2a96fb4a 100644 --- a/tools/tts_tool.py +++ b/tools/tts_tool.py @@ -172,6 +172,11 @@ DEFAULT_ELEVENLABS_VOICE_ID = "pNInz6obpgDQGcFmaJgB" # Adam DEFAULT_ELEVENLABS_MODEL_ID = "eleven_multilingual_v2" DEFAULT_ELEVENLABS_STREAMING_MODEL_ID = "eleven_flash_v2_5" DEFAULT_OPENAI_MODEL = "gpt-4o-mini-tts" +# The managed OpenAI audio gateway (Nous portal proxy) only proxies these speech +# models. A user's tts.openai.model set for *direct* OpenAI (e.g. "tts-1-hd") +# is rejected with a 400 "Unsupported managed OpenAI speech model", so it must be +# coerced to a supported model when routing through the gateway. +MANAGED_OPENAI_TTS_MODELS = frozenset({"gpt-4o-mini-tts"}) DEFAULT_KITTENTTS_MODEL = "KittenML/kitten-tts-nano-0.8-int8" # 25MB DEFAULT_KITTENTTS_VOICE = "Jasper" DEFAULT_PIPER_VOICE = "en_US-lessac-medium" # balanced size/quality @@ -1019,14 +1024,29 @@ def _generate_openai_tts(text: str, output_path: str, tts_config: Dict[str, Any] Returns: Path to the saved audio file. """ - api_key, base_url = _resolve_openai_audio_client_config() + api_key, base_url, is_managed = _resolve_openai_audio_client_config() oai_config = tts_config.get("openai", {}) model = oai_config.get("model", DEFAULT_OPENAI_MODEL) voice = oai_config.get("voice", DEFAULT_OPENAI_VOICE) - base_url = oai_config.get("base_url", base_url) + custom_base_url = oai_config.get("base_url") + if custom_base_url: + base_url = custom_base_url speed = float(oai_config.get("speed", tts_config.get("speed", 1.0))) + # The managed OpenAI audio gateway only proxies MANAGED_OPENAI_TTS_MODELS. + # A model set for direct OpenAI (e.g. "tts-1-hd") 400s there with + # "Unsupported managed OpenAI speech model", so coerce it — unless the user + # redirected base_url to their own endpoint, in which case respect it. + if is_managed and not custom_base_url and model not in MANAGED_OPENAI_TTS_MODELS: + logger.warning( + "TTS: managed OpenAI audio gateway does not support model %r; " + "falling back to %s. Set VOICE_TOOLS_OPENAI_KEY or OPENAI_API_KEY " + "to use %r directly.", + model, DEFAULT_OPENAI_MODEL, model, + ) + model = DEFAULT_OPENAI_MODEL + # Determine response format from extension if output_path.endswith(".ogg"): response_format = "opus" @@ -2502,15 +2522,17 @@ def check_tts_requirements() -> bool: return False -def _resolve_openai_audio_client_config() -> tuple[str, str]: - """Return direct OpenAI audio config or a managed gateway fallback. +def _resolve_openai_audio_client_config() -> tuple[str, str, bool]: + """Return ``(api_key, base_url, is_managed)`` for the OpenAI audio client. - When ``tts.use_gateway`` is set in config, the Tool Gateway is preferred + ``is_managed`` is True when the config resolves to the Nous managed audio + gateway (a restricted proxy), so callers can coerce the request to what the + gateway supports. When ``tts.use_gateway`` is set the gateway is preferred even if direct OpenAI credentials are present. """ direct_api_key = resolve_openai_audio_api_key() if direct_api_key and not prefers_gateway("tts"): - return direct_api_key, DEFAULT_OPENAI_BASE_URL + return direct_api_key, DEFAULT_OPENAI_BASE_URL, False managed_gateway = resolve_managed_tool_gateway("openai-audio") if managed_gateway is None: @@ -2524,8 +2546,10 @@ def _resolve_openai_audio_client_config() -> tuple[str, str]: ) raise ValueError(message) - return managed_gateway.nous_user_token, urljoin( - f"{managed_gateway.gateway_origin.rstrip('/')}/", "v1" + return ( + managed_gateway.nous_user_token, + urljoin(f"{managed_gateway.gateway_origin.rstrip('/')}/", "v1"), + True, ) From 5e116285465854b1d149247c84a4d2c2d031b386 Mon Sep 17 00:00:00 2001 From: liuhao1024 Date: Sat, 6 Jun 2026 01:04:14 +0800 Subject: [PATCH 18/46] fix(image_routing): check stripped custom: provider key for vision override When model.provider is set to custom:, _supports_vision_override() previously tried only the runtime provider key ('custom') and the raw config value ('custom:my-proxy'). It did not try the stripped name ('my-proxy'), which is the actual key under providers: in config.yaml. This caused native image routing to fall back to text mode even when the user explicitly declared supports_vision: true on the named provider's model entry. Fixes #39963 --- agent/image_routing.py | 12 +++++++++--- tests/agent/test_image_routing.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/agent/image_routing.py b/agent/image_routing.py index acd66fea8..13d39675e 100644 --- a/agent/image_routing.py +++ b/agent/image_routing.py @@ -185,7 +185,8 @@ def _supports_vision_override( 2. ``providers..models..supports_vision`` (named custom providers — ``provider`` may be the runtime-resolved value ``"custom"`` and/or the user-declared name under - ``model.provider``; both are tried) + ``model.provider``; both are tried. For ``custom:`` syntax, + the stripped ```` is also tried as a provider key.) Returns None when no override is set, so the caller falls through to models.dev. Returns False explicitly only when the user wrote a @@ -205,11 +206,16 @@ def _supports_vision_override( # get rewritten to provider="custom" at runtime # (hermes_cli/runtime_provider.py:_resolve_named_custom_runtime), so the # config still holds the user-declared name under model.provider. Try - # both as candidate provider keys. + # both as candidate provider keys, plus the stripped suffix from + # "custom:" (where is the key under providers:). config_provider = str(model_cfg.get("provider") or "").strip() + # Extract the stripped name from "custom:" if present + stripped_suffix = "" + if config_provider.startswith("custom:"): + stripped_suffix = config_provider[len("custom:"):] providers_raw = cfg.get("providers") providers_cfg: Dict[str, Any] = providers_raw if isinstance(providers_raw, dict) else {} - for p in dict.fromkeys(filter(None, (provider, config_provider))): + for p in dict.fromkeys(filter(None, (provider, config_provider, stripped_suffix))): entry_raw = providers_cfg.get(p) entry: Dict[str, Any] = entry_raw if isinstance(entry_raw, dict) else {} models_raw = entry.get("models") diff --git a/tests/agent/test_image_routing.py b/tests/agent/test_image_routing.py index 6f9b9b292..dfcd45af0 100644 --- a/tests/agent/test_image_routing.py +++ b/tests/agent/test_image_routing.py @@ -224,6 +224,37 @@ class TestSupportsVisionOverride: cfg = {"model": "some-string", "providers": ["not-a-dict"]} assert _supports_vision_override(cfg, "custom", "my-llava") is None + def test_custom_colon_name_stripped_suffix_lookup(self): + # model.provider: custom:my-proxy → should resolve stripped key "my-proxy" + cfg = { + "model": {"provider": "custom:my-proxy"}, + "providers": { + "my-proxy": {"models": {"gpt-5.5": {"supports_vision": True}}}, + }, + } + assert _supports_vision_override(cfg, "custom", "gpt-5.5") is True + + def test_custom_colon_name_stripped_suffix_false(self): + # Explicitly disabled vision on the stripped key. + cfg = { + "model": {"provider": "custom:my-proxy"}, + "providers": { + "my-proxy": {"models": {"gpt-5.5": {"supports_vision": False}}}, + }, + } + assert _supports_vision_override(cfg, "custom", "gpt-5.5") is False + + def test_custom_colon_name_no_stripped_key_falls_through(self): + # custom:my-proxy but providers only has "custom" — stripped key + # doesn't match, but "custom" does via runtime provider. + cfg = { + "model": {"provider": "custom:my-proxy"}, + "providers": { + "custom": {"models": {"gpt-5.5": {"supports_vision": True}}}, + }, + } + assert _supports_vision_override(cfg, "custom", "gpt-5.5") is True + # ─── _lookup_supports_vision (override-aware) ──────────────────────────────── From 769469a703d5d76e3d8d6fc10d07196a78cb52ab Mon Sep 17 00:00:00 2001 From: Maxim Esipov Date: Sun, 31 May 2026 22:51:41 +0300 Subject: [PATCH 19/46] fix: route gateway images by session model override (cherry picked from commit 7702071c01db4df67469397118d9561d2e55eb92) --- gateway/run.py | 58 ++++++-- .../test_image_input_routing_runtime.py | 140 ++++++++++++++++++ .../test_native_image_buffer_isolation.py | 2 +- 3 files changed, 190 insertions(+), 10 deletions(-) create mode 100644 tests/gateway/test_image_input_routing_runtime.py diff --git a/gateway/run.py b/gateway/run.py index e187ff8a3..646a48569 100644 --- a/gateway/run.py +++ b/gateway/run.py @@ -10035,7 +10035,10 @@ class GatewayRunner(GatewayAuthorizationMixin, GatewayKanbanWatchersMixin, Gatew if image_paths: # Decide routing: native (attach pixels) vs text (vision_analyze # pre-run + prepend description). See agent/image_routing.py. - _img_mode = self._decide_image_input_mode() + _img_mode = self._decide_image_input_mode( + source=source, + session_key=session_key, + ) if _img_mode == "native": # Defer attachment to the run_conversation call site. pending_native = getattr(self, "_pending_native_image_paths_by_session", None) @@ -14381,25 +14384,62 @@ class GatewayRunner(GatewayAuthorizationMixin, GatewayKanbanWatchersMixin, Gatew except TypeError: executor.shutdown(wait=False) - def _decide_image_input_mode(self) -> str: - """Resolve the image-input routing for the currently active model. + def _decide_image_input_mode( + self, + *, + source: Optional[SessionSource] = None, + session_key: Optional[str] = None, + user_config: Optional[dict] = None, + provider: Optional[str] = None, + model: Optional[str] = None, + ) -> str: + """Resolve image-input routing for the effective model this turn. Returns ``"native"`` (attach pixels on the user turn) or ``"text"`` (pre-analyze with vision_analyze and prepend the description). See agent/image_routing.py for the full decision table. - The active provider/model are read from config.yaml so the decision - tracks ``/model`` switches automatically on the next message. + Gateway sessions can have /model overrides that live outside + config.yaml. Image preprocessing runs before AIAgent sets the + auxiliary_client runtime globals, so resolve the same per-session + runtime bundle the upcoming agent turn will use instead of consulting + only the persisted default model. """ try: from agent.image_routing import decide_image_input_mode from agent.auxiliary_client import _read_main_model, _read_main_provider from hermes_cli.config import load_config - cfg = load_config() - provider = _read_main_provider() - model = _read_main_model() - return decide_image_input_mode(provider, model, cfg) + cfg = user_config if isinstance(user_config, dict) else load_config() + resolved_provider = (provider or "").strip() + resolved_model = (model or "").strip() + + needs_session_runtime = not resolved_provider or not resolved_model + has_session_identity = source is not None or session_key + if needs_session_runtime and has_session_identity: + try: + turn_model, runtime_kwargs = self._resolve_session_agent_runtime( + source=source, + session_key=session_key, + user_config=cfg, + ) + if not resolved_model and isinstance(turn_model, str): + resolved_model = turn_model.strip() + runtime_provider = runtime_kwargs.get("provider") if isinstance(runtime_kwargs, dict) else None + if not resolved_provider and isinstance(runtime_provider, str): + resolved_provider = runtime_provider.strip() + except Exception as exc: + logger.debug( + "image_routing: session runtime resolution failed, falling back to config — %s", + exc, + ) + + if not resolved_provider: + resolved_provider = _read_main_provider() + if not resolved_model: + resolved_model = _read_main_model() + + return decide_image_input_mode(resolved_provider, resolved_model, cfg) except Exception as exc: logger.debug("image_routing: decision failed, falling back to text — %s", exc) return "text" diff --git a/tests/gateway/test_image_input_routing_runtime.py b/tests/gateway/test_image_input_routing_runtime.py new file mode 100644 index 000000000..5bf34d390 --- /dev/null +++ b/tests/gateway/test_image_input_routing_runtime.py @@ -0,0 +1,140 @@ +import pytest + +from gateway.config import GatewayConfig, Platform, PlatformConfig +from gateway.platforms.base import MessageEvent, MessageType +from gateway.run import GatewayRunner +from gateway.session import SessionSource + + +def _make_runner() -> GatewayRunner: + runner = object.__new__(GatewayRunner) + runner.config = GatewayConfig( + platforms={Platform.TELEGRAM: PlatformConfig(enabled=True, token="fake")} + ) + runner.adapters = {} + runner._pending_native_image_paths_by_session = {} + runner._session_model_overrides = {} + runner._session_reasoning_overrides = {} + return runner + + +def _source() -> SessionSource: + return SessionSource( + platform=Platform.TELEGRAM, + chat_id="273403055", + chat_type="dm", + user_id="42", + user_name="Maxim", + ) + + +def _image_event(text: str = "look") -> MessageEvent: + return MessageEvent( + text=text, + message_type=MessageType.PHOTO, + source=_source(), + media_urls=["/tmp/cashback.png"], + media_types=["image/png"], + ) + + +def _auto_config() -> dict: + return { + "agent": {"image_input_mode": "auto"}, + "auxiliary": {"vision": {"provider": "auto", "model": "", "base_url": ""}}, + "model": {"provider": "xiaomi", "default": "mimo-v2.5-pro"}, + } + + +@pytest.mark.asyncio +async def test_prepare_image_routing_uses_session_vision_model_override(monkeypatch): + """Telegram /model overrides must affect native-vs-text image routing. + + Regression: _prepare_inbound_message_text used config.yaml's default model + before the per-session model override was installed on auxiliary_client's + runtime globals. A Telegram session switched to a vision model still had + screenshots pre-analyzed as text when config.default was text-only. + """ + runner = _make_runner() + source = _source() + event = _image_event() + cfg = _auto_config() + + monkeypatch.setattr("gateway.run._load_gateway_config", lambda: cfg) + monkeypatch.setattr("hermes_cli.config.load_config", lambda: cfg) + monkeypatch.setattr("agent.auxiliary_client._read_main_provider", lambda: "xiaomi") + monkeypatch.setattr("agent.auxiliary_client._read_main_model", lambda: "mimo-v2.5-pro") + monkeypatch.setattr( + runner, + "_resolve_session_agent_runtime", + lambda **_: ("gpt-5.5", {"provider": "openai-codex"}), + ) + + def fake_supports(provider, model, config): + return provider == "openai-codex" and model == "gpt-5.5" + + monkeypatch.setattr("agent.image_routing._lookup_supports_vision", fake_supports) + + async def fail_enrich(*_args, **_kwargs): + pytest.fail("vision-capable session override should use native image routing") + + monkeypatch.setattr(runner, "_enrich_message_with_vision", fail_enrich) + + result = await runner._prepare_inbound_message_text( + event=event, + source=source, + history=[], + ) + + session_key = runner._session_key_for_source(source) + assert result == "look" + assert runner._pending_native_image_paths_by_session[session_key] == [ + "/tmp/cashback.png" + ] + + +@pytest.mark.asyncio +async def test_prepare_image_routing_falls_back_to_text_for_text_only_session_override(monkeypatch): + """A text-only session override should get vision_analyze text fallback. + + Regression mirror case: if config.default is a vision model but the current + Telegram session is switched to a text-only provider (for example Mimo), + auto routing must not attach pixels natively to the text-only model. + """ + runner = _make_runner() + source = _source() + event = _image_event() + cfg = _auto_config() + cfg["model"] = {"provider": "openai-codex", "default": "gpt-5.5"} + + monkeypatch.setattr("gateway.run._load_gateway_config", lambda: cfg) + monkeypatch.setattr("hermes_cli.config.load_config", lambda: cfg) + monkeypatch.setattr("agent.auxiliary_client._read_main_provider", lambda: "openai-codex") + monkeypatch.setattr("agent.auxiliary_client._read_main_model", lambda: "gpt-5.5") + monkeypatch.setattr( + runner, + "_resolve_session_agent_runtime", + lambda **_: ("mimo-v2.5-pro", {"provider": "xiaomi"}), + ) + + def fake_supports(provider, model, config): + return provider == "openai-codex" and model == "gpt-5.5" + + monkeypatch.setattr("agent.image_routing._lookup_supports_vision", fake_supports) + + async def fake_enrich(user_text, image_paths): + assert user_text == "look" + assert image_paths == ["/tmp/cashback.png"] + return "[vision summary]\n\nlook" + + monkeypatch.setattr(runner, "_enrich_message_with_vision", fake_enrich) + + result = await runner._prepare_inbound_message_text( + event=event, + source=source, + history=[], + ) + + session_key = runner._session_key_for_source(source) + assert result == "[vision summary]\n\nlook" + assert runner._pending_native_image_paths_by_session.get(session_key) is None diff --git a/tests/gateway/test_native_image_buffer_isolation.py b/tests/gateway/test_native_image_buffer_isolation.py index 55f96730a..dbaa4350a 100644 --- a/tests/gateway/test_native_image_buffer_isolation.py +++ b/tests/gateway/test_native_image_buffer_isolation.py @@ -14,7 +14,7 @@ def _make_runner() -> GatewayRunner: runner.adapters = {} runner._model = "openai/gpt-4.1-mini" runner._base_url = None - runner._decide_image_input_mode = lambda: "native" + runner._decide_image_input_mode = lambda **_: "native" return runner From f6a3d2e900f86880891afd58f944c250fd75540a Mon Sep 17 00:00:00 2001 From: LeonSGP43 Date: Fri, 26 Jun 2026 15:59:43 +0800 Subject: [PATCH 20/46] fix(model): preserve named custom provider slug --- hermes_cli/model_setup_flows.py | 2 +- .../test_model_provider_persistence.py | 46 ++++++++++++++++++- .../test_runtime_provider_resolution.py | 27 +++++++++++ 3 files changed, 73 insertions(+), 2 deletions(-) diff --git a/hermes_cli/model_setup_flows.py b/hermes_cli/model_setup_flows.py index 312677dab..b6769b69d 100644 --- a/hermes_cli/model_setup_flows.py +++ b/hermes_cli/model_setup_flows.py @@ -1446,7 +1446,7 @@ def _model_flow_named_custom(config, provider_info): model = {"default": model} if model else {} cfg["model"] = model if provider_key: - model["provider"] = provider_key + model["provider"] = "custom:" + provider_key.strip().lower().replace(" ", "-") model.pop("base_url", None) model.pop("api_key", None) else: diff --git a/tests/hermes_cli/test_model_provider_persistence.py b/tests/hermes_cli/test_model_provider_persistence.py index 76d5ee741..dd007d442 100644 --- a/tests/hermes_cli/test_model_provider_persistence.py +++ b/tests/hermes_cli/test_model_provider_persistence.py @@ -207,6 +207,51 @@ class TestProviderPersistsAfterModelSave: assert model.get("base_url") == "https://packy.example.com/v1" assert model.get("api_mode") == "codex_responses" + def test_named_custom_provider_with_builtin_slug_persists_custom_prefix( + self, config_home, monkeypatch + ): + """providers. must persist as a named custom provider.""" + import yaml + + from hermes_cli.main import _model_flow_named_custom + + config_path = config_home / "config.yaml" + config_path.write_text( + "providers:\n" + " minimax-cn:\n" + " name: MiniMax CN Proxy\n" + " api: https://mimimax.cn/v1\n" + " key_env: MINIMAX_CN_PROXY_KEY\n" + " transport: chat_completions\n" + " model: MiniMax-M3\n" + " default_model: MiniMax-M3\n" + ) + monkeypatch.setenv("MINIMAX_CN_PROXY_KEY", "proxy-secret") + + provider_info = { + "name": "MiniMax CN Proxy", + "base_url": "https://mimimax.cn/v1", + "api_key": "", + "key_env": "MINIMAX_CN_PROXY_KEY", + "model": "MiniMax-M3", + "api_mode": "chat_completions", + "provider_key": "minimax-cn", + } + + with patch("hermes_cli.auth._save_model_choice"), \ + patch("hermes_cli.auth.deactivate_provider"), \ + patch("hermes_cli.models.fetch_api_models", return_value=["MiniMax-M3"]), \ + patch("hermes_cli.curses_ui.curses_radiolist", side_effect=OSError("no tty in test")), \ + patch("builtins.input", return_value="1"): + _model_flow_named_custom({}, provider_info) + + config = yaml.safe_load(config_path.read_text()) or {} + model = config.get("model") + assert isinstance(model, dict) + assert model.get("provider") == "custom:minimax-cn" + assert "base_url" not in model + assert "api_key" not in model + def test_copilot_acp_provider_saved_when_selected(self, config_home): """_model_flow_copilot_acp should persist provider/base_url/model together.""" from hermes_cli.main import _model_flow_copilot_acp @@ -555,4 +600,3 @@ class TestZaiEndpointPicker: _select_zai_endpoint(custom_url) assert captured["default"] == expected_default - diff --git a/tests/hermes_cli/test_runtime_provider_resolution.py b/tests/hermes_cli/test_runtime_provider_resolution.py index 54f58b858..df47efcf8 100644 --- a/tests/hermes_cli/test_runtime_provider_resolution.py +++ b/tests/hermes_cli/test_runtime_provider_resolution.py @@ -1272,6 +1272,33 @@ def test_resolve_requested_provider_precedence(monkeypatch): assert rp.resolve_requested_provider() == "auto" +def test_resolve_runtime_provider_named_custom_with_builtin_slug(monkeypatch): + monkeypatch.setenv("MINIMAX_CN_PROXY_KEY", "proxy-secret") + monkeypatch.setattr( + rp, + "load_config", + lambda: { + "model": {"provider": "custom:minimax-cn"}, + "providers": { + "minimax-cn": { + "name": "MiniMax CN Proxy", + "api": "https://mimimax.cn/v1", + "key_env": "MINIMAX_CN_PROXY_KEY", + "transport": "chat_completions", + "default_model": "MiniMax-M3", + } + }, + }, + ) + + resolved = rp.resolve_runtime_provider() + + assert resolved["provider"] == "custom" + assert resolved["base_url"] == "https://mimimax.cn/v1" + assert resolved["api_key"] == "proxy-secret" + assert resolved["api_mode"] == "chat_completions" + + # ── api_mode config override tests ────────────────────────────────────── From 25d1a077466ef9d42a11680b3d9edafede869ae2 Mon Sep 17 00:00:00 2001 From: teknium1 <127238744+teknium1@users.noreply.github.com> Date: Fri, 3 Jul 2026 03:23:28 -0700 Subject: [PATCH 21/46] test(gateway): accept kwargs in _decide_image_input_mode stub after #36055 signature change --- tests/gateway/test_queued_native_image_session_key.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/gateway/test_queued_native_image_session_key.py b/tests/gateway/test_queued_native_image_session_key.py index 86ba1620a..e24897561 100644 --- a/tests/gateway/test_queued_native_image_session_key.py +++ b/tests/gateway/test_queued_native_image_session_key.py @@ -86,7 +86,7 @@ def _make_runner(adapter): ) runner._model = "openai/gpt-4.1-mini" runner._base_url = None - runner._decide_image_input_mode = lambda: "native" + runner._decide_image_input_mode = lambda **_kw: "native" return runner From 8bf797f1c20f7e4acfafb4457ab3918362dc9673 Mon Sep 17 00:00:00 2001 From: Jiahui-Gu Date: Tue, 26 May 2026 17:19:21 +0800 Subject: [PATCH 22/46] fix(agent): prefer native vision over auxiliary fallback in auto mode (#29135) --- agent/image_routing.py | 34 +++++++++++++++++++------------ tests/agent/test_image_routing.py | 34 ++++++++++++++++++++++++------- 2 files changed, 48 insertions(+), 20 deletions(-) diff --git a/agent/image_routing.py b/agent/image_routing.py index 13d39675e..ba6d8da32 100644 --- a/agent/image_routing.py +++ b/agent/image_routing.py @@ -17,13 +17,17 @@ It reads ``agent.image_input_mode`` from config.yaml (``auto`` | ``native`` | ``text``, default ``auto``) and the active model's capability metadata. In ``auto`` mode: - - If the user has explicitly configured ``auxiliary.vision.provider`` - (i.e. not ``auto`` and not empty), we assume they want the text pipeline - regardless of the main model — they've opted in to a specific vision - backend for a reason (cost, quality, local-only, etc.). - - Otherwise, if the active model reports ``supports_vision=True`` in its - models.dev metadata, we attach natively. - - Otherwise (non-vision model, no explicit override), we fall back to text. + - If the active model reports ``supports_vision=True`` (via config + override or models.dev metadata), we attach natively — vision-capable + main models should always see the original pixels, even when an + auxiliary vision backend is configured. That auxiliary backend then + acts as a *fallback* for sessions whose main model can't take images. + - Otherwise, if the user has explicitly configured ``auxiliary.vision`` + (provider/model/base_url not ``auto``/empty), we route through the + text pipeline so the auxiliary vision backend can describe the image + for the text-only main model. + - Otherwise (non-vision model, no explicit override), we fall back to + text via the default vision_analyze flow. This keeps ``vision_analyze`` surfaced as a tool in every session — skills and agent flows that chain it (browser screenshots, deeper inspection of @@ -342,8 +346,10 @@ def _coerce_mode(raw: Any) -> str: def _explicit_aux_vision_override(cfg: Optional[Dict[str, Any]]) -> bool: """True when the user configured a specific auxiliary vision backend. - An explicit override means the user *wants* the text pipeline (they're - paying for a dedicated vision model), so we don't silently bypass it. + An explicit override means the user has a dedicated vision backend + available; it's used as a *fallback* when the main model can't take + images natively. In ``auto`` mode, native vision on a vision-capable + main model still wins over this fallback — see issue #29135. """ if not isinstance(cfg, dict): return False @@ -432,13 +438,15 @@ def decide_image_input_mode( if mode_cfg == "text": return "text" - # auto - if _explicit_aux_vision_override(cfg): - return "text" - + # auto: prefer native vision when the main model supports it. An + # explicit auxiliary.vision config acts as a *fallback* for text-only + # main models — it should not preempt native vision on a model that + # can natively inspect the pixels (issue #29135). supports = _lookup_supports_vision(provider, model, cfg) if supports is True: return "native" + if _explicit_aux_vision_override(cfg): + return "text" return "text" diff --git a/tests/agent/test_image_routing.py b/tests/agent/test_image_routing.py index dfcd45af0..675823112 100644 --- a/tests/agent/test_image_routing.py +++ b/tests/agent/test_image_routing.py @@ -97,11 +97,21 @@ class TestDecideImageInputMode: with patch("agent.image_routing._lookup_supports_vision", return_value=None): assert decide_image_input_mode("openrouter", "brand-new-slug", {}) == "text" - def test_auto_respects_aux_vision_override_even_for_vision_model(self): - """If the user configured a dedicated vision backend, don't bypass it.""" + def test_auto_prefers_native_for_vision_capable_main_model_even_with_aux_configured(self): + """Regression #29135: vision-capable main model wins over aux fallback. + + Auxiliary.vision is a fallback for text-only main models; it must + not preempt native vision on a vision-capable main model. + """ cfg = {"auxiliary": {"vision": {"provider": "openrouter", "model": "google/gemini-2.5-flash"}}} with patch("agent.image_routing._lookup_supports_vision", return_value=True): - assert decide_image_input_mode("anthropic", "claude-sonnet-4", cfg) == "text" + assert decide_image_input_mode("anthropic", "claude-sonnet-4", cfg) == "native" + + def test_auto_uses_aux_vision_fallback_for_text_only_main_model(self): + """#29135: aux vision still acts as fallback for non-vision main models.""" + cfg = {"auxiliary": {"vision": {"provider": "openrouter", "model": "google/gemini-2.5-flash"}}} + with patch("agent.image_routing._lookup_supports_vision", return_value=False): + assert decide_image_input_mode("deepseek", "deepseek-v4-pro", cfg) == "text" def test_none_config_is_auto(self): with patch("agent.image_routing._lookup_supports_vision", return_value=True): @@ -325,15 +335,25 @@ class TestAutoModeRespectsOverride: with patch("agent.models_dev.get_model_capabilities", return_value=None): assert decide_image_input_mode("custom", "unknown", {}) == "text" - def test_explicit_aux_vision_override_still_wins(self): - # If the user has configured a dedicated vision aux backend, respect - # it even when supports_vision: true is also set. + def test_explicit_aux_vision_no_longer_overrides_native_capable_main(self): + # #29135: aux.vision is a fallback for text-only main models; it + # must NOT preempt native routing when the main model can take + # images directly (supports_vision: true). cfg = { "model": {"supports_vision": True}, "auxiliary": {"vision": {"provider": "openrouter", "model": "gemini-2.5-pro"}}, } with patch("agent.models_dev.get_model_capabilities", return_value=None): - assert decide_image_input_mode("custom", "qwen3.6-35b", cfg) == "text" + assert decide_image_input_mode("custom", "qwen3.6-35b", cfg) == "native" + + def test_explicit_aux_vision_used_when_main_model_supports_vision_false(self): + # #29135 counterpart: text-only main model + aux fallback → text. + cfg = { + "model": {"supports_vision": False}, + "auxiliary": {"vision": {"provider": "openrouter", "model": "gemini-2.5-pro"}}, + } + with patch("agent.models_dev.get_model_capabilities", return_value=None): + assert decide_image_input_mode("custom", "deepseek-v4", cfg) == "text" # ─── build_native_content_parts ────────────────────────────────────────────── From 25aa626cb42cfec620083ea69fe12e8afe171ff7 Mon Sep 17 00:00:00 2001 From: Jacky Zeng Date: Mon, 22 Jun 2026 15:37:42 +0800 Subject: [PATCH 23/46] fix(vision): forward custom-endpoint credentials in vision auto-detect A custom: main provider resolves at runtime to the bare provider id "custom". In the vision auto-detect chain, the main-provider branch called resolve_provider_client("custom", ...) WITHOUT explicit_base_url/api_key, so it returned (None, None) ("no endpoint credentials found") and the whole chain fell through to OpenRouter/Nous. A user on a custom endpoint with no aggregator configured then got "No LLM provider configured for task=vision provider=auto" on every image, even though their main model fully supports vision. Recover the live endpoint that set_runtime_main() records each turn (_RUNTIME_MAIN_BASE_URL/_API_KEY/_API_MODE) and forward it to Step 1, with a fallback to _resolve_custom_runtime() for non-gateway callers. Mirrors the existing explicit-base_url branch directly above. Adds TestResolveVisionCustomProvider covering custom, custom:, and the no-runtime fallback path. --- agent/auxiliary_client.py | 28 +++++- tests/agent/test_auxiliary_main_first.py | 118 +++++++++++++++++++++++ 2 files changed, 145 insertions(+), 1 deletion(-) diff --git a/agent/auxiliary_client.py b/agent/auxiliary_client.py index 64768963e..1eb352496 100644 --- a/agent/auxiliary_client.py +++ b/agent/auxiliary_client.py @@ -4940,9 +4940,35 @@ def resolve_vision_provider_client( main_provider, ) else: + # Custom endpoints (``custom`` / ``custom:``) carry no + # built-in base_url/api_key — resolve_provider_client("custom") + # would return None ("no endpoint credentials found") and the + # whole chain would fall through to the aggregators, breaking + # vision for every user on a custom provider that has no + # separate ``auxiliary.vision`` block. Recover the live main + # endpoint that ``set_runtime_main()`` recorded for this turn so + # Step 1 can build a working client. + rpc_base_url = None + rpc_api_key = None + rpc_api_mode = resolved_api_mode + if main_provider == "custom" or main_provider.startswith("custom:"): + if _RUNTIME_MAIN_BASE_URL: + rpc_base_url = _RUNTIME_MAIN_BASE_URL + rpc_api_key = _RUNTIME_MAIN_API_KEY or None + rpc_api_mode = resolved_api_mode or _RUNTIME_MAIN_API_MODE or None + else: + # No live runtime recorded (non-gateway caller): fall + # back to resolving the configured custom endpoint. + custom_base, custom_key, custom_mode = _resolve_custom_runtime() + if custom_base: + rpc_base_url = custom_base + rpc_api_key = custom_key + rpc_api_mode = resolved_api_mode or custom_mode or None rpc_client, rpc_model = resolve_provider_client( main_provider, vision_model, - api_mode=resolved_api_mode, + api_mode=rpc_api_mode, + explicit_base_url=rpc_base_url, + explicit_api_key=rpc_api_key, is_vision=True) if rpc_client is not None: logger.info( diff --git a/tests/agent/test_auxiliary_main_first.py b/tests/agent/test_auxiliary_main_first.py index 94181d468..0b8b0a044 100644 --- a/tests/agent/test_auxiliary_main_first.py +++ b/tests/agent/test_auxiliary_main_first.py @@ -543,6 +543,124 @@ class TestResolveVisionMainFirst: mock_strict.assert_called_once_with("nous", None) +# ── Vision — custom provider endpoint credential passthrough ──────────────── + + +class TestResolveVisionCustomProvider: + """Custom-endpoint mains must forward base_url/api_key to Step 1. + + Regression: a ``custom:`` main provider resolves to the bare + runtime provider id ``"custom"``. ``resolve_provider_client("custom")`` + has no built-in endpoint, so without forwarding the live base_url/api_key + it returns ``(None, None)`` and vision falls through to OpenRouter / Nous, + which an offline / aggregator-less user has never configured — breaking + vision entirely with ``No LLM provider configured for task=vision + provider=auto``. The fix recovers the live endpoint that + ``set_runtime_main()`` recorded for the turn. + """ + + def test_custom_main_forwards_runtime_endpoint(self, monkeypatch): + """custom main with recorded runtime endpoint → Step 1 builds a client.""" + import agent.auxiliary_client as aux + + monkeypatch.setattr(aux, "_RUNTIME_MAIN_BASE_URL", "https://my.endpoint.example/v1") + monkeypatch.setattr(aux, "_RUNTIME_MAIN_API_KEY", "sk-runtime-key") + monkeypatch.setattr(aux, "_RUNTIME_MAIN_API_MODE", "anthropic_messages") + + with patch( + "agent.auxiliary_client._read_main_provider", return_value="custom", + ), patch( + "agent.auxiliary_client._read_main_model", return_value="claude-opus-4-8", + ), patch( + "agent.auxiliary_client._resolve_task_provider_model", + return_value=("auto", None, None, None, None), + ), patch( + "agent.auxiliary_client.resolve_provider_client" + ) as mock_resolve: + mock_client = MagicMock() + mock_resolve.return_value = (mock_client, "claude-opus-4-8") + + from agent.auxiliary_client import resolve_vision_provider_client + + provider, client, model = resolve_vision_provider_client() + + assert provider == "custom" + assert client is mock_client + assert model == "claude-opus-4-8" + # The endpoint credentials recorded for the turn MUST be forwarded, + # otherwise resolve_provider_client("custom") returns (None, None). + kwargs = mock_resolve.call_args.kwargs + assert kwargs.get("explicit_base_url") == "https://my.endpoint.example/v1" + assert kwargs.get("explicit_api_key") == "sk-runtime-key" + assert kwargs.get("is_vision") is True + + def test_custom_prefixed_main_forwards_runtime_endpoint(self, monkeypatch): + """A ``custom:`` provider id also forwards the runtime endpoint.""" + import agent.auxiliary_client as aux + + monkeypatch.setattr(aux, "_RUNTIME_MAIN_BASE_URL", "https://named.example/v1") + monkeypatch.setattr(aux, "_RUNTIME_MAIN_API_KEY", "sk-named") + monkeypatch.setattr(aux, "_RUNTIME_MAIN_API_MODE", "") + + with patch( + "agent.auxiliary_client._read_main_provider", + return_value="custom:copilot-gateway", + ), patch( + "agent.auxiliary_client._read_main_model", return_value="claude-opus-4-8", + ), patch( + "agent.auxiliary_client._resolve_task_provider_model", + return_value=("auto", None, None, None, None), + ), patch( + "agent.auxiliary_client.resolve_provider_client" + ) as mock_resolve: + mock_client = MagicMock() + mock_resolve.return_value = (mock_client, "claude-opus-4-8") + + from agent.auxiliary_client import resolve_vision_provider_client + + provider, client, model = resolve_vision_provider_client() + + assert provider == "custom:copilot-gateway" + assert client is mock_client + kwargs = mock_resolve.call_args.kwargs + assert kwargs.get("explicit_base_url") == "https://named.example/v1" + assert kwargs.get("explicit_api_key") == "sk-named" + assert kwargs.get("is_vision") is True + + def test_custom_main_no_runtime_falls_back_to_configured_endpoint(self, monkeypatch): + """No recorded runtime endpoint → resolve the configured custom endpoint.""" + import agent.auxiliary_client as aux + + monkeypatch.setattr(aux, "_RUNTIME_MAIN_BASE_URL", "") + monkeypatch.setattr(aux, "_RUNTIME_MAIN_API_KEY", "") + monkeypatch.setattr(aux, "_RUNTIME_MAIN_API_MODE", "") + + with patch( + "agent.auxiliary_client._read_main_provider", return_value="custom", + ), patch( + "agent.auxiliary_client._read_main_model", return_value="claude-opus-4-8", + ), patch( + "agent.auxiliary_client._resolve_task_provider_model", + return_value=("auto", None, None, None, None), + ), patch( + "agent.auxiliary_client._resolve_custom_runtime", + return_value=("https://configured.example/v1", "sk-configured", "chat_completions"), + ), patch( + "agent.auxiliary_client.resolve_provider_client" + ) as mock_resolve: + mock_client = MagicMock() + mock_resolve.return_value = (mock_client, "claude-opus-4-8") + + from agent.auxiliary_client import resolve_vision_provider_client + + provider, client, model = resolve_vision_provider_client() + + assert client is mock_client + kwargs = mock_resolve.call_args.kwargs + assert kwargs.get("explicit_base_url") == "https://configured.example/v1" + assert kwargs.get("explicit_api_key") == "sk-configured" + + # ── Constant cleanup ──────────────────────────────────────────────────────── From 149641485c7f5bcb33f6acf11544f0a816d8b054 Mon Sep 17 00:00:00 2001 From: liuhao1024 Date: Sun, 28 Jun 2026 01:41:23 +0800 Subject: [PATCH 24/46] fix(vision): read auxiliary model from config.yaml before env var _handlers for vision_analyze and video_analyze read model name from config.yaml (auxiliary.vision.model / auxiliary.video.model) before falling back to AUXILIARY_VISION_MODEL / AUXILIARY_VIDEO_MODEL env vars. Matches the existing config-first pattern for timeout and temperature in the same file. Fixes #53749 --- tests/tools/test_vision_tools.py | 42 ++++++++++++++++++++++++++++++++ tools/vision_tools.py | 27 ++++++++++++++++++-- 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/tests/tools/test_vision_tools.py b/tests/tools/test_vision_tools.py index 98bdd2276..47d4b6481 100644 --- a/tests/tools/test_vision_tools.py +++ b/tests/tools/test_vision_tools.py @@ -261,6 +261,48 @@ class TestHandleVisionAnalyze: # (the centralized call_llm router picks the default) assert model is None + def test_config_yaml_model_takes_priority_over_env(self): + """config.yaml auxiliary.vision.model should be preferred over env var.""" + with ( + patch( + "tools.vision_tools.vision_analyze_tool", new_callable=AsyncMock + ) as mock_tool, + patch( + "hermes_cli.config.load_config", + return_value={"auxiliary": {"vision": {"model": "qwen3.7-plus"}}}, + ), + patch.dict(os.environ, {"AUXILIARY_VISION_MODEL": "env-model"}), + ): + mock_tool.return_value = json.dumps({"result": "ok"}) + coro = _handle_vision_analyze( + {"image_url": "https://example.com/img.png", "question": "test"} + ) + coro.close() + call_args = mock_tool.call_args + model = call_args[0][2] # third positional arg + assert model == "qwen3.7-plus" + + def test_env_var_used_when_config_missing_model(self): + """Env var should be used when config.yaml has no auxiliary.vision.model.""" + with ( + patch( + "tools.vision_tools.vision_analyze_tool", new_callable=AsyncMock + ) as mock_tool, + patch( + "hermes_cli.config.load_config", + return_value={"auxiliary": {"vision": {}}}, + ), + patch.dict(os.environ, {"AUXILIARY_VISION_MODEL": "fallback-model"}), + ): + mock_tool.return_value = json.dumps({"result": "ok"}) + coro = _handle_vision_analyze( + {"image_url": "https://example.com/img.png", "question": "test"} + ) + coro.close() + call_args = mock_tool.call_args + model = call_args[0][2] + assert model == "fallback-model" + def test_empty_args_graceful(self): """Missing keys should default to empty strings, not raise.""" with patch( diff --git a/tools/vision_tools.py b/tools/vision_tools.py index 23273483e..6b67abec9 100644 --- a/tools/vision_tools.py +++ b/tools/vision_tools.py @@ -1356,7 +1356,18 @@ async def _handle_vision_analyze(args: Dict[str, Any], **kw: Any) -> str: "Fully describe and explain everything about this image, then answer the " f"following question:\n\n{question}" ) - model = os.getenv("AUXILIARY_VISION_MODEL", "").strip() or None + # Prefer config.yaml auxiliary.vision.model; env var is a legacy override. + model = None + try: + from hermes_cli.config import cfg_get, load_config + _cfg = load_config() + _vmodel = cfg_get(_cfg, "auxiliary", "vision", "model") + if _vmodel: + model = str(_vmodel).strip() or None + except Exception: + pass + if not model: + model = os.getenv("AUXILIARY_VISION_MODEL", "").strip() or None return await vision_analyze_tool(image_url, full_prompt, model) @@ -1718,7 +1729,19 @@ def _handle_video_analyze(args: Dict[str, Any], **kw: Any) -> Awaitable[str]: "including visual content, motion, audio cues, text overlays, and scene " f"transitions. Then answer the following question:\n\n{question}" ) - model = os.getenv("AUXILIARY_VIDEO_MODEL", "").strip() or os.getenv("AUXILIARY_VISION_MODEL", "").strip() or None + # Prefer config.yaml auxiliary.video.model (falling back to vision); + # env vars are a legacy override. + model = None + try: + from hermes_cli.config import cfg_get, load_config + _cfg = load_config() + _vmodel = cfg_get(_cfg, "auxiliary", "video", "model") or cfg_get(_cfg, "auxiliary", "vision", "model") + if _vmodel: + model = str(_vmodel).strip() or None + except Exception: + pass + if not model: + model = os.getenv("AUXILIARY_VIDEO_MODEL", "").strip() or os.getenv("AUXILIARY_VISION_MODEL", "").strip() or None return video_analyze_tool(video_url, full_prompt, model) From 0ad4dd60e9ef8dcc434974229a45628e7da5e4fa Mon Sep 17 00:00:00 2001 From: teknium1 <127238744+teknium1@users.noreply.github.com> Date: Fri, 3 Jul 2026 02:50:21 -0700 Subject: [PATCH 25/46] test(vision): adapt salvaged config-priority tests to async _handle_vision_analyze The salvaged tests from #53754 predate _handle_vision_analyze becoming async and the native fast path; await the handler and force the legacy aux path so the model-resolution assertion is actually exercised. --- tests/tools/test_vision_tools.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/tests/tools/test_vision_tools.py b/tests/tools/test_vision_tools.py index 47d4b6481..73cc672a6 100644 --- a/tests/tools/test_vision_tools.py +++ b/tests/tools/test_vision_tools.py @@ -261,12 +261,17 @@ class TestHandleVisionAnalyze: # (the centralized call_llm router picks the default) assert model is None - def test_config_yaml_model_takes_priority_over_env(self): + @pytest.mark.asyncio + async def test_config_yaml_model_takes_priority_over_env(self): """config.yaml auxiliary.vision.model should be preferred over env var.""" with ( patch( "tools.vision_tools.vision_analyze_tool", new_callable=AsyncMock ) as mock_tool, + patch( + "tools.vision_tools._should_use_native_vision_fast_path", + return_value=False, + ), patch( "hermes_cli.config.load_config", return_value={"auxiliary": {"vision": {"model": "qwen3.7-plus"}}}, @@ -274,20 +279,24 @@ class TestHandleVisionAnalyze: patch.dict(os.environ, {"AUXILIARY_VISION_MODEL": "env-model"}), ): mock_tool.return_value = json.dumps({"result": "ok"}) - coro = _handle_vision_analyze( + await _handle_vision_analyze( {"image_url": "https://example.com/img.png", "question": "test"} ) - coro.close() call_args = mock_tool.call_args model = call_args[0][2] # third positional arg assert model == "qwen3.7-plus" - def test_env_var_used_when_config_missing_model(self): + @pytest.mark.asyncio + async def test_env_var_used_when_config_missing_model(self): """Env var should be used when config.yaml has no auxiliary.vision.model.""" with ( patch( "tools.vision_tools.vision_analyze_tool", new_callable=AsyncMock ) as mock_tool, + patch( + "tools.vision_tools._should_use_native_vision_fast_path", + return_value=False, + ), patch( "hermes_cli.config.load_config", return_value={"auxiliary": {"vision": {}}}, @@ -295,10 +304,9 @@ class TestHandleVisionAnalyze: patch.dict(os.environ, {"AUXILIARY_VISION_MODEL": "fallback-model"}), ): mock_tool.return_value = json.dumps({"result": "ok"}) - coro = _handle_vision_analyze( + await _handle_vision_analyze( {"image_url": "https://example.com/img.png", "question": "test"} ) - coro.close() call_args = mock_tool.call_args model = call_args[0][2] assert model == "fallback-model" From 0e9136cb2756f5bead66d45fc3998fbf26031917 Mon Sep 17 00:00:00 2001 From: teknium1 <127238744+teknium1@users.noreply.github.com> Date: Fri, 3 Jul 2026 03:07:36 -0700 Subject: [PATCH 26/46] chore: add suninrain086 to AUTHOR_MAP for salvaged #50685 --- scripts/release.py | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/release.py b/scripts/release.py index 1b3d3a672..4099a6bfb 100755 --- a/scripts/release.py +++ b/scripts/release.py @@ -1388,6 +1388,7 @@ AUTHOR_MAP = { "holynn@placeholder.local": "holynn-q", "agent@hermes.local": "jacdevos", "sunsky.lau@gmail.com": "liuhao1024", + "suninrain086@gmail.com": "suninrain086", # PR #57651 salvage of #50685 (vision custom-endpoint creds) "mohamed.origami@gmail.com": "mohamedorigami-jpg", # PR #32117 (cron storage root anchor; #32091) "58446328+sherman-yang@users.noreply.github.com": "sherman-yang", # PR #32788 (cron per-job MCP merge; #23997) "rob@rbrtbn.com": "rbrtbn", From 87ae4ae94bc13e302be2a37b30226f2b19909227 Mon Sep 17 00:00:00 2001 From: Teknium <127238744+teknium1@users.noreply.github.com> Date: Fri, 3 Jul 2026 04:08:37 -0700 Subject: [PATCH 27/46] =?UTF-8?q?fix(update):=20harden=20#57659=20follow-u?= =?UTF-8?q?ps=20=E2=80=94=20task=20restore=20on=20failure,=20--force-venv?= =?UTF-8?q?=20split,=20trampoline=20detection,=20managed-install=20health?= =?UTF-8?q?=20(#57680)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Five follow-ups to #57659 from post-merge review: 1. install.ps1: gateway scheduled-task re-enable now runs in a finally (a thrown Remove-Item/uv venv failure previously stranded the user's gateway autostart disabled), and tasks that were already disabled before the install are no longer blindly re-enabled. 2. The venv-python holder guard is no longer bypassed by plain --force (which the desktop bootstrap passes on every update while its lock probe only checks hermes.exe/app.asar). New explicit --force-venv is the escape hatch; --force keeps bypassing only the hermes.exe shim guard. 3. _detect_venv_python_processes now also catches uv/base-interpreter trampolines whose exe is outside the venv, via cmdline (venv path or '-m hermes_cli.main' tied to this install root) and cwd. 4. Missing venv python is now UNHEALTHY on managed installs (.hermes-bootstrap-complete / .update-incomplete markers) so the repair lane runs instead of 'Already up to date!'; the repair branch recreates the venv first when it's gone entirely. Dev checkouts keep reporting healthy. 5. install.ps1 comment no longer claims a Startup-folder disarm the code doesn't perform (logon-only, not a mid-install respawner). --- .../src-tauri/src/update.rs | 8 + hermes_cli/main.py | 70 +++++++- hermes_cli/subcommands/update.py | 8 +- scripts/install.ps1 | 57 +++--- tests/hermes_cli/test_update_venv_health.py | 169 +++++++++++++++++- website/docs/getting-started/updating.md | 2 + 6 files changed, 278 insertions(+), 36 deletions(-) diff --git a/apps/bootstrap-installer/src-tauri/src/update.rs b/apps/bootstrap-installer/src-tauri/src/update.rs index c085ef60a..28597600e 100644 --- a/apps/bootstrap-installer/src-tauri/src/update.rs +++ b/apps/bootstrap-installer/src-tauri/src/update.rs @@ -230,6 +230,14 @@ async fn run_update(app: AppHandle) -> Result<()> { // us, and wait_for_install_locks_free below force-kills any straggler — so by the // time `hermes update` runs there is no legitimate hermes.exe to protect, // and the guard would only produce a false "Hermes is still running" stop. + // + // NOTE: --force does NOT bypass the venv-python holder guard (that needs + // an explicit `--force-venv`, which we deliberately do not pass). Our lock + // probe only checks the hermes.exe shim and app.asar, so an external venv + // python holding a native .pyd (a user terminal, an unmanaged gateway) + // could still be alive here — mutating the venv under it would strand the + // install half-updated. If that guard fires, it exits 2 and the match arm + // below surfaces the correct "close all Hermes windows" message. update_args.push("--force".into()); update_args.push("--branch".into()); update_args.push(update_branch); diff --git a/hermes_cli/main.py b/hermes_cli/main.py index 29b1ac1de..4400ee9a2 100644 --- a/hermes_cli/main.py +++ b/hermes_cli/main.py @@ -8797,6 +8797,20 @@ def _venv_core_imports_healthy() -> tuple[bool, str]: bin_dir = "Scripts" if _is_windows() else "bin" venv_python = venv_dir / bin_dir / python_name if not venv_python.exists(): + # No venv interpreter at all. In a dev checkout that's normal (the + # dev may run hermes from any interpreter), so report healthy to + # avoid forcing reinstalls. But on a MANAGED install (the Windows + # installer / desktop bootstrap stamps `.hermes-bootstrap-complete`, + # and an interrupted update leaves `.update-incomplete`), the venv + # IS the install — its absence means a repair got interrupted after + # the old venv was moved aside, and "Already up to date!" would + # gaslight the user while nothing can run. + managed_markers = ( + PROJECT_ROOT / ".hermes-bootstrap-complete", + _update_marker_path(), + ) + if any(m.exists() for m in managed_markers): + return False, f"venv python missing ({venv_python})" return True, "" # Core web/serve imports plus their newest transitive deps. Import (not @@ -8864,6 +8878,10 @@ def _detect_venv_python_processes( venv_prefix = str(venv_dir.resolve()).lower().rstrip(os.sep) + os.sep except OSError: venv_prefix = str(venv_dir).lower().rstrip(os.sep) + os.sep + try: + root_prefix = str(PROJECT_ROOT.resolve()).lower().rstrip(os.sep) + os.sep + except OSError: + root_prefix = str(PROJECT_ROOT).lower().rstrip(os.sep) + os.sep skip: set[int] = set(exclude_pids or set()) skip.add(os.getpid()) @@ -8875,7 +8893,7 @@ def _detect_venv_python_processes( matches: list[tuple[int, str, str]] = [] try: - proc_iter = psutil.process_iter(["pid", "exe", "name", "cmdline"]) + proc_iter = psutil.process_iter(["pid", "exe", "name", "cmdline", "cwd"]) except Exception: return [] for proc in proc_iter: @@ -8891,11 +8909,27 @@ def _detect_venv_python_processes( exe_norm = str(Path(exe).resolve()).lower() except (OSError, ValueError): exe_norm = str(exe).lower() - if not exe_norm.startswith(venv_prefix): + cmdline_raw = " ".join(info.get("cmdline") or []) + cmdline_low = cmdline_raw.lower() + cwd_low = str(info.get("cwd") or "").lower().rstrip(os.sep) + os.sep + + # Primary match: the executable itself lives under this venv + # (venv\Scripts\python(w).exe — the desktop backend / gateway case). + is_holder = exe_norm.startswith(venv_prefix) + # Fallback: uv/base-interpreter trampolines run a python whose exe is + # OUTSIDE the venv but which still imports from it and holds its .pyd + # files. Catch those by what they're running: a cmdline that references + # this venv's path, or a `-m hermes_cli.main ...` invocation tied to + # this install (install root in the cmdline or as the working dir). + if not is_holder and venv_prefix in cmdline_low: + is_holder = True + if not is_holder and "hermes_cli.main" in cmdline_low: + if root_prefix in cmdline_low or cwd_low.startswith(root_prefix): + is_holder = True + if not is_holder: continue name = info.get("name") or Path(exe).name - cmdline = " ".join(info.get("cmdline") or [])[:120] - matches.append((int(pid), str(name), cmdline)) + matches.append((int(pid), str(name), cmdline_raw[:120])) return matches @@ -8925,7 +8959,7 @@ def _format_venv_python_holders_message(matches: list[tuple[int, str, str]]) -> " Close the Hermes desktop app / other Hermes terminals, then re-run:" ) lines.append(" hermes update") - lines.append(" (or use `hermes update --force` to proceed anyway at your own risk)") + lines.append(" (or use `hermes update --force-venv` to proceed anyway at your own risk)") return "\n".join(lines) @@ -9392,9 +9426,13 @@ def _cmd_update_impl(args, gateway_mode: bool): # (most commonly the Desktop app's `hermes serve` backend) will keep .pyd # files locked and corrupt the dependency sync below. Refuse rather than # race: killing the desktop backend is futile (the app supervises and - # respawns it), so the user must close the app. --force preserves the old - # behavior for users who know what they're doing. - if _is_windows() and not getattr(args, "force", False): + # respawns it), so the user must close the app. Deliberately NOT bypassed + # by plain --force: the desktop bootstrap updater passes --force to skip + # the hermes.exe shim guard above, but its lock probe only checks the shim + # and app.asar — a non-desktop venv python holding a .pyd would sail + # through and corrupt the sync (the exact failure this guard exists for). + # --force-venv is the explicit escape hatch. + if _is_windows() and not getattr(args, "force_venv", False): _venv_holders = _detect_venv_python_processes() if _venv_holders: print(_format_venv_python_holders_message(_venv_holders)) @@ -9619,6 +9657,22 @@ def _cmd_update_impl(args, gateway_mode: bool): from hermes_cli.managed_uv import ensure_uv repair_uv = ensure_uv() + # A managed install whose venv is gone entirely (interrupted + # repair after the old venv was moved aside) needs the venv + # recreated before dependencies can be installed into it. + venv_python_missing = not ( + PROJECT_ROOT + / "venv" + / ("Scripts" if _is_windows() else "bin") + / ("python.exe" if _is_windows() else "python") + ).exists() + if venv_python_missing and repair_uv: + print("→ Recreating virtual environment...") + subprocess.run( + [repair_uv, "venv", "venv"], + cwd=PROJECT_ROOT, + check=False, + ) if repair_uv: repair_env = {**os.environ, "VIRTUAL_ENV": str(PROJECT_ROOT / "venv")} _install_python_dependencies_with_optional_fallback( diff --git a/hermes_cli/subcommands/update.py b/hermes_cli/subcommands/update.py index b2a632f20..bbd5e43e0 100644 --- a/hermes_cli/subcommands/update.py +++ b/hermes_cli/subcommands/update.py @@ -65,6 +65,12 @@ def build_update_parser(subparsers, *, cmd_update: Callable) -> None: "--force", action="store_true", default=False, - help="Windows: proceed with the update even when another hermes.exe is detected. The concurrent process will likely cause WinError 32 warnings and may leave a reboot-deferred .exe replacement.", + help="Windows: proceed with the update even when another hermes.exe is detected. The concurrent process will likely cause WinError 32 warnings and may leave a reboot-deferred .exe replacement. Does NOT bypass the venv-process guard (see --force-venv).", + ) + update_parser.add_argument( + "--force-venv", + action="store_true", + default=False, + help="Windows: mutate the venv even while other processes are running from its interpreter (desktop backend, gateway, terminals). Those processes keep native .pyd files locked, so the dependency sync will likely fail partway and strand the install half-updated. Use only if you know the detected holders are false positives.", ) update_parser.set_defaults(func=cmd_update) diff --git a/scripts/install.ps1 b/scripts/install.ps1 index e090dcb5c..19df6d313 100644 --- a/scripts/install.ps1 +++ b/scripts/install.ps1 @@ -1602,7 +1602,12 @@ function Install-Venv { Write-Info "Creating virtual environment with Python $PythonVersion..." Push-Location $InstallDir - + + # Tasks we disabled below and must re-enable no matter how this stage + # exits. Populated only with tasks that were ENABLED before we touched + # them, so a task the user deliberately disabled is never re-armed. + $gatewayTasksDisabled = @() + try { if (Test-Path "venv") { Write-Info "Virtual environment already exists, recreating..." # On Windows, native Python extensions (e.g. _bcrypt.pyd, tornado's @@ -1614,18 +1619,23 @@ function Install-Venv { if ($env:OS -eq "Windows_NT") { $myPid = $PID Write-Info "Stopping any running hermes processes before recreating venv..." - # Disarm respawners FIRST: the gateway autostart Scheduled Task and - # the Startup-folder entry both relaunch a killed gateway within - # seconds, and losing that race re-locks the venv's .pyd files - # between our kill sweep and Remove-Item (the July 2026 - # _brotlicffi.pyd incident). schtasks /End stops a running task - # instance; /Change /DISABLE stops it from re-firing mid-install. - # Re-enabled after the venv is recreated (below). Best-effort: a - # missing task just errors quietly. - $gatewayTasksDisabled = @() + # Disarm the respawner FIRST: the gateway autostart Scheduled Task + # relaunches a killed gateway within seconds, and losing that race + # re-locks the venv's .pyd files between our kill sweep and + # Remove-Item (the July 2026 _brotlicffi.pyd incident). schtasks + # /End stops a running task instance; /Change /DISABLE stops it + # from re-firing mid-install. (The Startup-folder .vbs fallback is + # NOT touched: it only fires at logon, so it cannot respawn a + # gateway mid-install.) Re-enabled in the finally below — including + # on failure — but only for tasks that were enabled to begin with. + # Best-effort: a missing task just errors quietly. try { schtasks /Query /FO CSV 2>$null | ConvertFrom-Csv | Where-Object { $_.TaskName -like '*Hermes_Gateway*' } | ForEach-Object { $tn = $_.TaskName + if ($_.Status -eq 'Disabled') { + Write-Info " gateway autostart task $tn is already disabled; leaving it that way" + return + } schtasks /End /TN $tn 2>$null | Out-Null schtasks /Change /TN $tn /DISABLE 2>$null | Out-Null $gatewayTasksDisabled += $tn @@ -1727,7 +1737,6 @@ function Install-Venv { # ok=true) when the venv was never created. $venvExitCode = $LASTEXITCODE if ($venvExitCode -ne 0) { - Pop-Location throw "Failed to create virtual environment (uv venv exited with $venvExitCode)" } @@ -1742,19 +1751,21 @@ function Install-Venv { if (Test-Path $venvPythonExe) { $env:UV_PYTHON = $venvPythonExe } - - Pop-Location - - # Re-arm the gateway autostart tasks disabled during the venv teardown. - # Same function scope, so the list survives even under the stage-per- - # process bootstrap. Deliberately NOT started here — dependencies aren't - # installed yet; the task fires normally on next logon and `hermes update` - # / the gateway resume path handles the immediate restart. - if ($gatewayTasksDisabled -and $gatewayTasksDisabled.Count -gt 0) { - foreach ($tn in $gatewayTasksDisabled) { - schtasks /Change /TN $tn /ENABLE 2>$null | Out-Null + } finally { + Pop-Location + # Re-arm the gateway autostart tasks disabled during the venv teardown + # — in a finally so a failed teardown/creation can never strand the + # user's gateway autostart in the disabled state. Same function scope, + # so the list survives even under the stage-per-process bootstrap. + # Deliberately NOT started here — dependencies aren't installed yet; + # the task fires normally on next logon and `hermes update` / the + # gateway resume path handles the immediate restart. + if ($gatewayTasksDisabled -and $gatewayTasksDisabled.Count -gt 0) { + foreach ($tn in $gatewayTasksDisabled) { + schtasks /Change /TN $tn /ENABLE 2>$null | Out-Null + } + Write-Info "Re-enabled gateway autostart task(s): $($gatewayTasksDisabled -join ', ')" } - Write-Info "Re-enabled gateway autostart task(s): $($gatewayTasksDisabled -join ', ')" } Write-Success "Virtual environment ready (Python $PythonVersion)" diff --git a/tests/hermes_cli/test_update_venv_health.py b/tests/hermes_cli/test_update_venv_health.py index b6660a8c1..16a9a1428 100644 --- a/tests/hermes_cli/test_update_venv_health.py +++ b/tests/hermes_cli/test_update_venv_health.py @@ -32,13 +32,33 @@ from hermes_cli import main as cli_main def test_venv_health_reports_healthy_when_no_venv(tmp_path): - """No venv python → nothing to probe → healthy (never blocks update).""" + """No venv python in a DEV checkout → nothing to probe → healthy.""" with patch.object(cli_main, "PROJECT_ROOT", tmp_path): healthy, detail = cli_main._venv_core_imports_healthy() assert healthy is True assert detail == "" +def test_venv_health_missing_venv_unhealthy_on_managed_install(tmp_path): + """On a managed install (bootstrap marker) the venv IS the install — + its absence must be reported unhealthy so the repair lane runs instead + of 'Already up to date!'.""" + (tmp_path / ".hermes-bootstrap-complete").write_text("done") + with patch.object(cli_main, "PROJECT_ROOT", tmp_path): + healthy, detail = cli_main._venv_core_imports_healthy() + assert healthy is False + assert "venv python missing" in detail + + +def test_venv_health_missing_venv_unhealthy_with_interrupted_marker(tmp_path): + """An interrupted-update breadcrumb also flips missing-venv to unhealthy.""" + (tmp_path / ".update-incomplete").write_text("started=1\npid=1\n") + with patch.object(cli_main, "PROJECT_ROOT", tmp_path): + healthy, detail = cli_main._venv_core_imports_healthy() + assert healthy is False + assert "venv python missing" in detail + + def _fake_venv_python(tmp_path, *, windows: bool = False): bin_dir = tmp_path / "venv" / ("Scripts" if windows else "bin") bin_dir.mkdir(parents=True) @@ -104,9 +124,15 @@ def test_venv_health_probe_failure_reports_healthy(tmp_path): # --------------------------------------------------------------------------- -def _proc(pid: int, exe: str, name: str, cmdline: list[str] | None = None): +def _proc(pid: int, exe: str, name: str, cmdline: list[str] | None = None, cwd: str = ""): proc = MagicMock() - proc.info = {"pid": pid, "exe": exe, "name": name, "cmdline": cmdline or []} + proc.info = { + "pid": pid, + "exe": exe, + "name": name, + "cmdline": cmdline or [], + "cwd": cwd, + } return proc @@ -182,4 +208,139 @@ def test_format_venv_holders_message_flags_desktop_backend(tmp_path): assert "desktop app" in msg.lower() assert "gateway" in msg assert "hermes update" in msg - assert "--force" in msg + assert "--force-venv" in msg + + +@patch.object(cli_main, "_is_windows", return_value=True) +def test_detect_venv_python_catches_outside_venv_trampoline(_winp, tmp_path): + """uv/base-interpreter trampoline: exe OUTSIDE the venv, but the cmdline + clearly runs Hermes from this install → must still be flagged as a holder + (it imports from the venv and holds its .pyd files).""" + base_py = "C:\\Python311\\python.exe" + venv_path = str(tmp_path / "venv" / "Scripts" / "python.exe") + + me = MagicMock() + me.parents.return_value = [] + fake_psutil = types.SimpleNamespace( + process_iter=lambda attrs: iter( + [ + # cmdline references the venv path directly + _proc(201, base_py, "python.exe", [base_py, venv_path, "-m", "x"]), + # `-m hermes_cli.main serve` with the install root as cwd + _proc( + 202, + base_py, + "python.exe", + [base_py, "-m", "hermes_cli.main", "serve"], + cwd=str(tmp_path), + ), + # unrelated base-interpreter python → NOT a holder + _proc(203, base_py, "python.exe", [base_py, "somescript.py"], cwd="C:\\other"), + ] + ), + Process=lambda *a, **k: me, + ) + with patch.object(cli_main, "PROJECT_ROOT", tmp_path), patch.dict( + sys.modules, {"psutil": fake_psutil} + ): + matches = cli_main._detect_venv_python_processes() + + assert sorted(m[0] for m in matches) == [201, 202] + + +@patch.object(cli_main, "_is_windows", return_value=True) +def test_detect_venv_hermes_cli_cmdline_outside_install_not_matched(_winp, tmp_path): + """A hermes_cli.main process belonging to a DIFFERENT install (neither + install root in cmdline nor cwd under it) must not be flagged.""" + base_py = "C:\\Python311\\python.exe" + me = MagicMock() + me.parents.return_value = [] + fake_psutil = types.SimpleNamespace( + process_iter=lambda attrs: iter( + [ + _proc( + 301, + base_py, + "python.exe", + [base_py, "-m", "hermes_cli.main", "serve"], + cwd="C:\\other-install", + ), + ] + ), + Process=lambda *a, **k: me, + ) + with patch.object(cli_main, "PROJECT_ROOT", tmp_path), patch.dict( + sys.modules, {"psutil": fake_psutil} + ): + assert cli_main._detect_venv_python_processes() == [] + + +# --------------------------------------------------------------------------- +# --force vs --force-venv gating of the venv-holder guard +# --------------------------------------------------------------------------- + + +def _update_args(**overrides): + defaults = dict( + gateway=False, + check=False, + no_backup=True, + backup=False, + yes=True, + branch=None, + force=False, + force_venv=False, + ) + defaults.update(overrides) + return SimpleNamespace(**defaults) + + +def _run_update_until_guard(args): + """Drive _cmd_update_impl just far enough to hit the venv-holder guard. + + Everything before the guard is stubbed; the guard firing is observed via + SystemExit(2). The first statement AFTER the guard is + ``git_dir = PROJECT_ROOT / ".git"`` — a PROJECT_ROOT sentinel whose + ``__truediv__`` raises marks 'guard passed'.""" + + class _PastGuard(Exception): + pass + + class _RootSentinel: + def __truediv__(self, _other): + raise _PastGuard + + with patch.object(cli_main, "_is_windows", return_value=True), patch.object( + cli_main, "_venv_scripts_dir", return_value=None + ), patch.object(cli_main, "_run_pre_update_backup"), patch.object( + cli_main, "_pause_windows_gateways_for_update", return_value=None + ), patch.object( + cli_main, "_resume_windows_gateways_after_update" + ), patch.object( + cli_main, + "_detect_venv_python_processes", + return_value=[(101, "python.exe", "python.exe -m hermes_cli.main serve")], + ), patch.object( + cli_main, "PROJECT_ROOT", _RootSentinel() + ): + try: + cli_main._cmd_update_impl(args, gateway_mode=False) + except _PastGuard: + return "past_guard" + except SystemExit as exc: + return f"exit_{exc.code}" + return "returned" + + +@pytest.mark.parametrize( + "force,force_venv,expected", + [ + (False, False, "exit_2"), # guard fires + (True, False, "exit_2"), # plain --force does NOT bypass the venv guard + (False, True, "past_guard"), # --force-venv is the explicit escape hatch + (True, True, "past_guard"), + ], +) +def test_venv_holder_guard_force_semantics(force, force_venv, expected, capsys): + result = _run_update_until_guard(_update_args(force=force, force_venv=force_venv)) + assert result == expected, capsys.readouterr().out diff --git a/website/docs/getting-started/updating.md b/website/docs/getting-started/updating.md index 1d42519d3..7e7ea5b03 100644 --- a/website/docs/getting-started/updating.md +++ b/website/docs/getting-started/updating.md @@ -102,6 +102,8 @@ $ hermes update Close the listed processes and re-run. If you're sure the concurrent process won't interfere (rare — usually only useful when an antivirus shim is mis-attributed), pass `--force` to skip the check. In that case the updater will still retry the `.exe` rename with exponential backoff and, on stubborn locks, schedule the replacement for next reboot via `MoveFileEx(MOVEFILE_DELAY_UNTIL_REBOOT)` so the update can complete. +A second, separate guard refuses to touch the venv while any process is running from its Python interpreter (the Desktop app's backend, a gateway, a Python REPL). Those processes keep native extension files (`.pyd`) locked, and a dependency sync that dies partway on an access-denied error strands the install between versions. This guard is **not** bypassed by `--force`; if you're certain the detected holders are false positives, use the explicit `hermes update --force-venv`. + Expected output looks like: ``` From 22c5048d9c6a3d6e3d6c786ef014a0998ca2a0c3 Mon Sep 17 00:00:00 2001 From: Teknium <127238744+teknium1@users.noreply.github.com> Date: Fri, 3 Jul 2026 04:08:48 -0700 Subject: [PATCH 28/46] fix(moa): restore prompt caching for the aggregator and advisors (#57675) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two caching holes made MoA re-bill essentially its entire input stream: 1. AGGREGATOR: anthropic_prompt_cache_policy() judged the agent's own model/provider — on the MoA path those are the virtual preset name and 'moa', which match no caching branch, so _use_prompt_caching was False and the acting aggregator (Claude on OpenRouter) ran with ZERO cache_control breakpoints. Measured on identical opus-4.8 sessions: 85% cache share solo vs 2% via MoA — ~30M re-billed input tokens on one 132-task benchmark run. Fix: when provider == 'moa', resolve the policy from the preset's real aggregator slot (provider/model/base_url/api_mode via resolve_runtime_provider). 2. ADVISORS: _run_reference never applied cache_control at all, and Anthropic caching is opt-in per request — Claude advisors served 0 cache reads across 1,227 benchmark calls (11.5M re-billed input tokens) even though the advisory view is append-only across iterations (stable prefix; the synthetic end marker is last so it never pollutes it). Fix: _maybe_apply_advisor_cache_control() reuses the SAME policy function and SAME system_and_3 layout as the main loop, judged on the advisor slot's own resolved runtime — advisor requests are now decorated exactly like an acting agent on that provider. Auto-caching routes (OpenAI-family) are left untouched by policy. Live-verified on the wire (per-iteration opus+gpt5.5 preset, 4 fan-outs): claude advisor fan-out 2-3 cache_write=2161/2344, fan-out 4 cache_read=2206 / fresh_in=2; aggregator session cache share 84%/77% (vs 2%/0% before). Sub-1024-token prompts correctly stay uncached (Anthropic minimum). --- agent/agent_runtime_helpers.py | 40 +++++++++++++++++++++++++ agent/moa_loop.py | 55 ++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) diff --git a/agent/agent_runtime_helpers.py b/agent/agent_runtime_helpers.py index 18ed3102c..08c0052bc 100644 --- a/agent/agent_runtime_helpers.py +++ b/agent/agent_runtime_helpers.py @@ -1478,6 +1478,46 @@ def anthropic_prompt_cache_policy( eff_api_mode = api_mode if api_mode is not None else (agent.api_mode or "") eff_model = (model if model is not None else agent.model) or "" + # MoA virtual provider: the agent's model/provider are the preset name and + # "moa" — neither matches any caching branch, so the ACTING AGGREGATOR + # (often Claude on OpenRouter) silently lost prompt caching entirely + # (measured: 85% cache share solo vs 2% on the identical model via MoA — + # tens of millions of re-billed input tokens per benchmark run). Resolve + # the policy from the preset's real aggregator slot instead. + if eff_provider.strip().lower() == "moa": + try: + from hermes_cli.config import load_config as _load_moa_cfg + from hermes_cli.moa_config import resolve_moa_preset + from hermes_cli.runtime_provider import resolve_runtime_provider + + _preset = resolve_moa_preset( + _load_moa_cfg().get("moa") or {}, eff_model or None + ) + _agg = _preset.get("aggregator") or {} + _agg_provider = str(_agg.get("provider") or "").strip() + _agg_model = str(_agg.get("model") or "").strip() + if _agg_provider and _agg_model: + _agg_base_url = "" + _agg_api_mode = "" + try: + _rt = resolve_runtime_provider( + requested=_agg_provider, target_model=_agg_model + ) + _agg_base_url = _rt.get("base_url") or "" + _agg_api_mode = _rt.get("api_mode") or "" + except Exception: + pass + return anthropic_prompt_cache_policy( + agent, + provider=_agg_provider, + base_url=_agg_base_url, + api_mode=_agg_api_mode, + model=_agg_model, + ) + except Exception as _moa_exc: # pragma: no cover - defensive + logger.debug("MoA aggregator cache-policy resolution failed: %s", _moa_exc) + return False, False + model_lower = eff_model.lower() provider_lower = eff_provider.lower() is_claude = "claude" in model_lower diff --git a/agent/moa_loop.py b/agent/moa_loop.py index 439698444..ccaebda8f 100644 --- a/agent/moa_loop.py +++ b/agent/moa_loop.py @@ -173,6 +173,49 @@ def _slot_runtime(slot: dict[str, str]) -> dict[str, Any]: return out +def _maybe_apply_advisor_cache_control( + messages: list[dict[str, Any]], + runtime: dict[str, Any], +) -> list[dict[str, Any]]: + """Decorate an advisor request with cache_control when its route honors it. + + Reuses the SAME policy function as the main agent loop + (``anthropic_prompt_cache_policy``) resolved against the advisor slot's + own provider/base_url/api_mode/model, and the SAME breakpoint layout + (``apply_anthropic_cache_control``, system_and_3). This keeps advisor + calls decorated exactly like an acting agent on that provider would be — + no MoA-specific caching logic to drift. + + Returns the messages unchanged on any resolution error or when the + policy says the route doesn't honor markers. + """ + try: + from types import SimpleNamespace + + from agent.agent_runtime_helpers import anthropic_prompt_cache_policy + from agent.prompt_caching import apply_anthropic_cache_control + + # The policy function reads agent.* only as fallbacks for kwargs we + # don't pass; provide a stub so an advisor slot is judged purely on + # its own resolved runtime. + stub = SimpleNamespace(provider="", base_url="", api_mode="", model="") + should_cache, native_layout = anthropic_prompt_cache_policy( + stub, + provider=runtime.get("provider") or "", + base_url=runtime.get("base_url") or "", + api_mode=runtime.get("api_mode") or "", + model=runtime.get("model") or "", + ) + if not should_cache: + return messages + return apply_anthropic_cache_control( + messages, native_anthropic=native_layout + ) + except Exception as exc: # pragma: no cover - decoration must never break a call + logger.debug("advisor cache_control decoration skipped: %s", exc) + return messages + + def _run_reference( slot: dict[str, str], ref_messages: list[dict[str, Any]], @@ -214,6 +257,18 @@ def _run_reference( # trimmed view (_reference_messages) already strips the agent's own # system prompt, so this is the only system message the reference sees. messages = [{"role": "system", "content": _REFERENCE_SYSTEM_PROMPT}, *ref_messages] + # Apply the same Anthropic-style prompt-caching decoration the main + # agent loop applies (system_and_3 breakpoints). The advisory view is + # append-only across iterations (new turns append before the trailing + # synthetic marker), so on cache-honoring routes (Claude via + # OpenRouter/native, MiniMax, Qwen/DashScope) iteration N+1's prefix + # replays iteration N's cached prefix. Without this, Claude advisors + # served ZERO cache reads across an entire benchmark run (measured: + # 0/1227 calls, 11.5M re-billed input tokens) because Anthropic + # caching is opt-in per request. OpenAI-family advisors are untouched + # (their caching is automatic; markers are ignored harmlessly, but we + # only decorate when the policy says the route honors them). + messages = _maybe_apply_advisor_cache_control(messages, runtime) response = call_llm( task="moa_reference", messages=messages, From ad3261bc772e73e31aa19f993046b125536ebade Mon Sep 17 00:00:00 2001 From: kshitijk4poor <82637225+kshitijk4poor@users.noreply.github.com> Date: Fri, 3 Jul 2026 18:38:12 +0530 Subject: [PATCH 29/46] chore: add AUTHOR_MAP entry for PR #57692 salvage (CocaKova) --- scripts/release.py | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/release.py b/scripts/release.py index 4099a6bfb..ab509388b 100755 --- a/scripts/release.py +++ b/scripts/release.py @@ -46,6 +46,7 @@ ACP_REGISTRY_MANIFEST = REPO_ROOT / "acp_registry" / "agent.json" # Auto-extracted from noreply emails + manual overrides AUTHOR_MAP = { "infinitycrew39@gmail.com": "infinitycrew39", # PR #56431 salvage (honor live vLLM context limits on local endpoints) + "jonathan.kovacs999@gmail.com": "CocaKova", # PR #57692 salvage (cron: run jobs under the profile secret scope so get_secret does not fail-close with UnscopedSecretError under profile isolation) "hermes.wanderer@yahoo.com": "trismegistus-wanderer", # PR #31856 salvage (gateway: defer idle-TTL agent-cache eviction until the session store says the session actually expired, so the expiry watcher can still fire MemoryProvider.on_session_end with the live transcript; #11205) "louis@letsfive.io": "Mibayy", # PR #3243 salvage (/compact alias + preview/aggressive flags for /compress) "louis@letsfive.io": "Mibayy", # PR #3176 salvage (api-server: per-client model routing via model_routes) From 587be5b5b49340c560258b136dd98b03904649da Mon Sep 17 00:00:00 2001 From: dsad Date: Fri, 3 Jul 2026 14:57:05 +0300 Subject: [PATCH 30/46] fix(image-gen): guard local provider inputs against credential reads --- plugins/image_gen/openai/__init__.py | 10 ++++++++++ plugins/image_gen/openrouter/__init__.py | 10 ++++++++++ tests/plugins/image_gen/test_openai_provider.py | 12 ++++++++++++ .../image_gen/test_openrouter_compat_provider.py | 12 ++++++++++++ 4 files changed, 44 insertions(+) diff --git a/plugins/image_gen/openai/__init__.py b/plugins/image_gen/openai/__init__.py index e214271bc..cecdac206 100644 --- a/plugins/image_gen/openai/__init__.py +++ b/plugins/image_gen/openai/__init__.py @@ -147,6 +147,16 @@ def _load_image_bytes(ref: str) -> Tuple[bytes, str]: ext = header.split("image/", 1)[1].split(";", 1)[0] or "png" return base64.b64decode(b64), f"image.{ext}" # Local file path. + try: + from agent.file_safety import get_read_block_error + + blocked = get_read_block_error(ref) + if blocked: + raise ValueError(blocked) + except ValueError: + raise + except Exception as exc: # noqa: BLE001 - preserve existing local-file behavior + logger.debug("OpenAI image input read guard unavailable: %s", exc) with open(ref, "rb") as fh: data = fh.read() name = os.path.basename(ref) or "image.png" diff --git a/plugins/image_gen/openrouter/__init__.py b/plugins/image_gen/openrouter/__init__.py index a3cc348cc..a08bae614 100644 --- a/plugins/image_gen/openrouter/__init__.py +++ b/plugins/image_gen/openrouter/__init__.py @@ -97,6 +97,16 @@ def _to_image_url_part(ref: str) -> Optional[str]: if ref.startswith(("http://", "https://", "data:")): return ref path = Path(ref) + try: + from agent.file_safety import get_read_block_error + + blocked = get_read_block_error(ref) + if blocked: + raise ValueError(blocked) + except ValueError: + raise + except Exception as exc: # noqa: BLE001 - keep local image refs best-effort + logger.debug("OpenRouter image input read guard unavailable: %s", exc) try: raw = path.read_bytes() except OSError as exc: diff --git a/tests/plugins/image_gen/test_openai_provider.py b/tests/plugins/image_gen/test_openai_provider.py index 8a6a49850..abd867823 100644 --- a/tests/plugins/image_gen/test_openai_provider.py +++ b/tests/plugins/image_gen/test_openai_provider.py @@ -124,6 +124,18 @@ class TestModelResolution: # ── Generate ──────────────────────────────────────────────────────────────── +class TestSourceImageLoading: + def test_load_image_bytes_blocks_credential_store(self, tmp_path, monkeypatch): + hermes_home = tmp_path / ".hermes" + hermes_home.mkdir() + auth_json = hermes_home / "auth.json" + auth_json.write_text('{"api_key":"sk-secret"}', encoding="utf-8") + monkeypatch.setenv("HERMES_HOME", str(hermes_home)) + + with pytest.raises(ValueError, match="credential store"): + openai_plugin._load_image_bytes(str(auth_json)) + + class TestGenerate: def test_empty_prompt_rejected(self, provider): result = provider.generate("", aspect_ratio="square") diff --git a/tests/plugins/image_gen/test_openrouter_compat_provider.py b/tests/plugins/image_gen/test_openrouter_compat_provider.py index cef2f4394..149fbc891 100644 --- a/tests/plugins/image_gen/test_openrouter_compat_provider.py +++ b/tests/plugins/image_gen/test_openrouter_compat_provider.py @@ -169,6 +169,18 @@ class TestHelpers: assert _to_image_url_part("/no/such/file.png") is None + def test_to_image_url_part_blocks_credential_store(self, tmp_path, monkeypatch): + from plugins.image_gen.openrouter import _to_image_url_part + + hermes_home = tmp_path / ".hermes" + hermes_home.mkdir() + auth_json = hermes_home / "auth.json" + auth_json.write_text('{"api_key":"sk-secret"}', encoding="utf-8") + monkeypatch.setenv("HERMES_HOME", str(hermes_home)) + + with pytest.raises(ValueError, match="credential store"): + _to_image_url_part(str(auth_json)) + def test_extract_images(self): from plugins.image_gen.openrouter import _extract_images From c1826e2690fe7e4813913f9b230b357b07626e19 Mon Sep 17 00:00:00 2001 From: kshitijk4poor <82637225+kshitijk4poor@users.noreply.github.com> Date: Fri, 3 Jul 2026 18:34:14 +0530 Subject: [PATCH 31/46] fix(image-gen): route local-input credential guard through one shared chokepoint + cover xai (#57698) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow-up to the per-provider guards. Three improvements from review: 1. Extract agent.file_safety.raise_if_read_blocked() as a single shared chokepoint and route the OpenAI, OpenRouter, and (newly) xAI image providers through it, replacing the 3x-duplicated inline try/except. Fixes the whole bug class: xai/_xai_image_field read a model-supplied local path via open() with no guard — the same vulnerability the PR fixed for OpenAI/OpenRouter, in a sibling provider it missed. 2. Strengthen the regression tests from pass-on-any-ValueError to true security invariants: spy open()/read_bytes() and assert the blocked credential is NEVER read; add negative controls (legit local image still loads; remote/data: URIs pass through unguarded) so a block-everything regression can't pass. 3. Guard is best-effort by design (defense-in-depth, not a security boundary) — documented on the shared helper. - agent/file_safety.py: raise_if_read_blocked() - plugins/image_gen/{openai,openrouter,xai}: route through helper - tests: no-read spies + negative controls across all three providers --- agent/file_safety.py | 24 +++++++++ plugins/image_gen/openai/__init__.py | 13 ++--- plugins/image_gen/openrouter/__init__.py | 12 ++--- plugins/image_gen/xai/__init__.py | 5 ++ .../plugins/image_gen/test_openai_provider.py | 50 +++++++++++++++++++ .../test_openrouter_compat_provider.py | 25 ++++++++++ tests/plugins/image_gen/test_xai_provider.py | 47 +++++++++++++++++ 7 files changed, 157 insertions(+), 19 deletions(-) diff --git a/agent/file_safety.py b/agent/file_safety.py index 02e1eba2a..d7e20ee5f 100644 --- a/agent/file_safety.py +++ b/agent/file_safety.py @@ -304,6 +304,30 @@ def get_read_block_error(path: str) -> Optional[str]: return None +def raise_if_read_blocked(path: str) -> None: + """Raise ``ValueError`` if ``path`` is a denied Hermes read (see + :func:`get_read_block_error`), else return. + + Shared chokepoint for provider input-loading sites that read a local + file the model/tool supplied (e.g. image-gen ``image_url`` / + ``reference_image_urls`` paths). Centralizes the guard so every provider + enforces the same read boundary with identical semantics instead of each + open-coding the try/except block (#57698). + + Best-effort by design: if ``agent.file_safety`` machinery is somehow + unavailable at the call site the guard no-ops rather than breaking local + image loading — consistent with the defense-in-depth (not security + boundary) framing of the denylist itself. The blocking ``ValueError`` from + a real hit still propagates; only unexpected internal errors are swallowed. + """ + try: + blocked = get_read_block_error(path) + except Exception: # noqa: BLE001 - guard must never break local-file loading + return + if blocked: + raise ValueError(blocked) + + # --------------------------------------------------------------------------- # Cross-profile write guard (#TBD) # diff --git a/plugins/image_gen/openai/__init__.py b/plugins/image_gen/openai/__init__.py index cecdac206..cfa9e42c9 100644 --- a/plugins/image_gen/openai/__init__.py +++ b/plugins/image_gen/openai/__init__.py @@ -146,17 +146,10 @@ def _load_image_bytes(ref: str) -> Tuple[bytes, str]: if "image/" in header: ext = header.split("image/", 1)[1].split(";", 1)[0] or "png" return base64.b64decode(b64), f"image.{ext}" - # Local file path. - try: - from agent.file_safety import get_read_block_error + # Local file path — enforce the shared credential-read guard before reading. + from agent.file_safety import raise_if_read_blocked - blocked = get_read_block_error(ref) - if blocked: - raise ValueError(blocked) - except ValueError: - raise - except Exception as exc: # noqa: BLE001 - preserve existing local-file behavior - logger.debug("OpenAI image input read guard unavailable: %s", exc) + raise_if_read_blocked(ref) with open(ref, "rb") as fh: data = fh.read() name = os.path.basename(ref) or "image.png" diff --git a/plugins/image_gen/openrouter/__init__.py b/plugins/image_gen/openrouter/__init__.py index a08bae614..a5c6c164d 100644 --- a/plugins/image_gen/openrouter/__init__.py +++ b/plugins/image_gen/openrouter/__init__.py @@ -97,16 +97,10 @@ def _to_image_url_part(ref: str) -> Optional[str]: if ref.startswith(("http://", "https://", "data:")): return ref path = Path(ref) - try: - from agent.file_safety import get_read_block_error + # Enforce the shared credential-read guard before inlining local bytes. + from agent.file_safety import raise_if_read_blocked - blocked = get_read_block_error(ref) - if blocked: - raise ValueError(blocked) - except ValueError: - raise - except Exception as exc: # noqa: BLE001 - keep local image refs best-effort - logger.debug("OpenRouter image input read guard unavailable: %s", exc) + raise_if_read_blocked(ref) try: raw = path.read_bytes() except OSError as exc: diff --git a/plugins/image_gen/xai/__init__.py b/plugins/image_gen/xai/__init__.py index 31a0b719b..5ce9f26cb 100644 --- a/plugins/image_gen/xai/__init__.py +++ b/plugins/image_gen/xai/__init__.py @@ -137,6 +137,11 @@ def _xai_image_field(source: str) -> Dict[str, str]: import base64 import os as _os + # Enforce the shared credential-read guard before reading local bytes + # (same boundary the OpenAI / OpenRouter / Codex image providers apply). + from agent.file_safety import raise_if_read_blocked + + raise_if_read_blocked(source) with open(_os.path.expanduser(source), "rb") as fh: # windows-footgun: ok raw = fh.read() ext = (_os.path.splitext(source)[1].lstrip(".") or "png").lower() diff --git a/tests/plugins/image_gen/test_openai_provider.py b/tests/plugins/image_gen/test_openai_provider.py index abd867823..2ac61c54e 100644 --- a/tests/plugins/image_gen/test_openai_provider.py +++ b/tests/plugins/image_gen/test_openai_provider.py @@ -135,6 +135,56 @@ class TestSourceImageLoading: with pytest.raises(ValueError, match="credential store"): openai_plugin._load_image_bytes(str(auth_json)) + def test_load_image_bytes_never_opens_blocked_credential(self, tmp_path, monkeypatch): + """The guard must fire BEFORE the file is opened — a credential store + must never be read into memory (#57698). Spy builtins.open and assert + it is never called for the blocked path.""" + hermes_home = tmp_path / ".hermes" + hermes_home.mkdir() + auth_json = hermes_home / "auth.json" + auth_json.write_text('{"api_key":"sk-secret"}', encoding="utf-8") + monkeypatch.setenv("HERMES_HOME", str(hermes_home)) + + import builtins + + real_open = builtins.open + opened: list = [] + + def _spy_open(file, *a, **k): + opened.append(str(file)) + return real_open(file, *a, **k) + + monkeypatch.setattr(builtins, "open", _spy_open) + with pytest.raises(ValueError, match="credential store"): + openai_plugin._load_image_bytes(str(auth_json)) + assert str(auth_json) not in opened, "blocked credential must never be opened" + + def test_load_image_bytes_allows_legit_local_image(self, tmp_path, monkeypatch): + """Negative control: a legitimate local image path is NOT blocked and + loads normally — proves the guard doesn't over-fire on everything.""" + hermes_home = tmp_path / ".hermes" + hermes_home.mkdir() + monkeypatch.setenv("HERMES_HOME", str(hermes_home)) + img = tmp_path / "pic.png" + img.write_bytes(b"\x89PNG\r\n\x1a\nfake-image-bytes") + + data, name = openai_plugin._load_image_bytes(str(img)) + assert data == b"\x89PNG\r\n\x1a\nfake-image-bytes" + assert name == "pic.png" + + def test_load_image_bytes_passthrough_data_uri_not_blocked(self, tmp_path, monkeypatch): + """Negative control: data: URIs are decoded, never routed through the + local-path guard (the guard only applies to local file reads).""" + import base64 + + hermes_home = tmp_path / ".hermes" + hermes_home.mkdir() + monkeypatch.setenv("HERMES_HOME", str(hermes_home)) + b64 = base64.b64encode(b"xyz").decode("ascii") + data, name = openai_plugin._load_image_bytes(f"data:image/png;base64,{b64}") + assert data == b"xyz" + assert name.endswith(".png") + class TestGenerate: def test_empty_prompt_rejected(self, provider): diff --git a/tests/plugins/image_gen/test_openrouter_compat_provider.py b/tests/plugins/image_gen/test_openrouter_compat_provider.py index 149fbc891..95052a9f8 100644 --- a/tests/plugins/image_gen/test_openrouter_compat_provider.py +++ b/tests/plugins/image_gen/test_openrouter_compat_provider.py @@ -181,6 +181,31 @@ class TestHelpers: with pytest.raises(ValueError, match="credential store"): _to_image_url_part(str(auth_json)) + def test_to_image_url_part_never_reads_blocked_credential(self, tmp_path, monkeypatch): + """The guard must fire BEFORE path.read_bytes() — the credential store + must never be inlined into a provider request (#57698).""" + from pathlib import Path as _P + + from plugins.image_gen.openrouter import _to_image_url_part + + hermes_home = tmp_path / ".hermes" + hermes_home.mkdir() + auth_json = hermes_home / "auth.json" + auth_json.write_text('{"api_key":"sk-secret"}', encoding="utf-8") + monkeypatch.setenv("HERMES_HOME", str(hermes_home)) + + real_read_bytes = _P.read_bytes + read: list = [] + + def _spy_read_bytes(self, *a, **k): + read.append(str(self)) + return real_read_bytes(self, *a, **k) + + monkeypatch.setattr(_P, "read_bytes", _spy_read_bytes) + with pytest.raises(ValueError, match="credential store"): + _to_image_url_part(str(auth_json)) + assert str(auth_json) not in read, "blocked credential must never be read" + def test_extract_images(self): from plugins.image_gen.openrouter import _extract_images diff --git a/tests/plugins/image_gen/test_xai_provider.py b/tests/plugins/image_gen/test_xai_provider.py index cf9708dae..a233240cf 100644 --- a/tests/plugins/image_gen/test_xai_provider.py +++ b/tests/plugins/image_gen/test_xai_provider.py @@ -492,3 +492,50 @@ def test_xai_image_field_expands_user_home(tmp_path, monkeypatch): field = _xai_image_field("~/pic.png") assert field["type"] == "image_url" assert field["url"].startswith("data:image/png;base64,") + + +class TestXAIImageFieldReadGuard: + """#57698: local image inputs must not read Hermes credential stores.""" + + def test_xai_image_field_blocks_credential_store(self, tmp_path, monkeypatch): + from plugins.image_gen.xai import _xai_image_field + + hermes_home = tmp_path / ".hermes" + hermes_home.mkdir() + auth_json = hermes_home / "auth.json" + auth_json.write_text('{"api_key":"sk-secret"}', encoding="utf-8") + monkeypatch.setenv("HERMES_HOME", str(hermes_home)) + + with pytest.raises(ValueError, match="credential store"): + _xai_image_field(str(auth_json)) + + def test_xai_image_field_never_opens_blocked_credential(self, tmp_path, monkeypatch): + """Guard fires before open() — credential store never read into memory.""" + import builtins + + from plugins.image_gen.xai import _xai_image_field + + hermes_home = tmp_path / ".hermes" + hermes_home.mkdir() + auth_json = hermes_home / "auth.json" + auth_json.write_text('{"api_key":"sk-secret"}', encoding="utf-8") + monkeypatch.setenv("HERMES_HOME", str(hermes_home)) + + real_open = builtins.open + opened: list = [] + + def _spy_open(file, *a, **k): + opened.append(str(file)) + return real_open(file, *a, **k) + + monkeypatch.setattr(builtins, "open", _spy_open) + with pytest.raises(ValueError, match="credential store"): + _xai_image_field(str(auth_json)) + assert str(auth_json) not in opened, "blocked credential must never be opened" + + def test_xai_image_field_passthrough_url_not_blocked(self, monkeypatch): + """Negative control: remote URLs and data: URIs pass through unguarded.""" + from plugins.image_gen.xai import _xai_image_field + + assert _xai_image_field("https://example.com/pic.png")["url"] == "https://example.com/pic.png" + assert _xai_image_field("data:image/png;base64,eHl6")["url"].startswith("data:image/png") From 104232979d6ec24e82a42dfbf14ac98f3df3c827 Mon Sep 17 00:00:00 2001 From: kshitijk4poor <82637225+kshitijk4poor@users.noreply.github.com> Date: Fri, 3 Jul 2026 18:42:04 +0530 Subject: [PATCH 32/46] fix(xai): route video-gen local inputs through the shared read guard Fold the xAI video credential-read guard into the same shared agent.file_safety.raise_if_read_blocked chokepoint this PR introduces for the image providers, so the whole image+video bug class is covered by one enforced boundary. Consolidates the parallel salvage of #57695 (xAI image+video) into this PR; #57727 is now redundant and will be closed. - video_gen/xai: guard _image_ref_to_xai_url and _video_ref_to_xai_url (the video image + video byte-read chokepoints) via the shared helper. - Regression tests: symlinked auth.json with .png/.mp4 names are blocked across both video read paths (mutation-checked). --- plugins/video_gen/xai/__init__.py | 20 ++++++++++++ tests/plugins/video_gen/test_xai_plugin.py | 38 ++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/plugins/video_gen/xai/__init__.py b/plugins/video_gen/xai/__init__.py index edc981c78..90dfa57bf 100644 --- a/plugins/video_gen/xai/__init__.py +++ b/plugins/video_gen/xai/__init__.py @@ -127,6 +127,22 @@ def _xai_headers(api_key: str) -> Dict[str, str]: } +def _raise_if_blocked_local_input(ref: str) -> None: + """Refuse to read a local media path that Hermes' read deny-list blocks. + + Thin wrapper over the shared ``agent.file_safety.raise_if_read_blocked`` + chokepoint so xAI video inputs enforce the same credential-store guard as + the image providers. Fails open if the guard machinery is unavailable + (defense-in-depth, per the denylist's own framing). + """ + try: + from agent.file_safety import raise_if_read_blocked + except Exception as exc: # noqa: BLE001 - guard must never break loading + logger.debug("xAI media input read guard unavailable: %s", exc) + return + raise_if_read_blocked(ref) + + def _image_ref_to_xai_url(value: str) -> str: """Return a URL/data URI accepted by xAI for image inputs.""" ref = (value or "").strip() @@ -140,6 +156,8 @@ def _image_ref_to_xai_url(value: str) -> str: if not path.is_file(): return ref + _raise_if_blocked_local_input(ref) + mime = mimetypes.guess_type(path.name)[0] or "application/octet-stream" if not mime.startswith("image/"): return ref @@ -195,6 +213,8 @@ def _video_ref_to_xai_url(value: str) -> str: if not path.is_file(): return ref + _raise_if_blocked_local_input(ref) + mime = mimetypes.guess_type(path.name)[0] or "video/mp4" if not mime.startswith("video/"): return ref diff --git a/tests/plugins/video_gen/test_xai_plugin.py b/tests/plugins/video_gen/test_xai_plugin.py index eb495b969..e1a2a5ec9 100644 --- a/tests/plugins/video_gen/test_xai_plugin.py +++ b/tests/plugins/video_gen/test_xai_plugin.py @@ -186,3 +186,41 @@ def test_video_input_from_public_url_rejects_bare_file_id(): ) ) assert result is None + + +def test_xai_video_image_input_blocks_credential_store_symlink(tmp_path, monkeypatch): + from plugins.video_gen.xai import _image_ref_to_xai_input + + hermes_home = tmp_path / ".hermes" + hermes_home.mkdir() + auth_json = hermes_home / "auth.json" + auth_json.write_text('{"api_key":"sk-secret"}', encoding="utf-8") + image_link = hermes_home / "leak.png" + try: + image_link.symlink_to(auth_json) + except OSError as exc: + pytest.skip(f"symlink unavailable on this platform: {exc}") + + monkeypatch.setenv("HERMES_HOME", str(hermes_home)) + + with pytest.raises(ValueError, match="credential store"): + _image_ref_to_xai_input(str(image_link)) + + +def test_xai_video_file_input_blocks_credential_store_symlink(tmp_path, monkeypatch): + from plugins.video_gen.xai import _video_ref_to_xai_url + + hermes_home = tmp_path / ".hermes" + hermes_home.mkdir() + auth_json = hermes_home / "auth.json" + auth_json.write_text('{"api_key":"sk-secret"}', encoding="utf-8") + video_link = hermes_home / "leak.mp4" + try: + video_link.symlink_to(auth_json) + except OSError as exc: + pytest.skip(f"symlink unavailable on this platform: {exc}") + + monkeypatch.setenv("HERMES_HOME", str(hermes_home)) + + with pytest.raises(ValueError, match="credential store"): + _video_ref_to_xai_url(str(video_link)) From fdab380a1ada1e1fc127b3a51d5695f538cb774f Mon Sep 17 00:00:00 2001 From: Jonny Kovacs Date: Fri, 3 Jul 2026 06:49:03 -0500 Subject: [PATCH 33/46] fix(cron): run jobs under the profile secret scope Once profile isolation is active (multiple gateway profiles or room->profile multiplexing), get_secret() fails closed outside an installed scope. The cron ticker fires jobs from a thread with no per-turn scope, so run_job() died in resolve_runtime_provider() with UnscopedSecretError (e.g. for OPENROUTER_BASE_URL / CUSTOM_BASE_URL) before model selection - every cron job failed while interactive turns worked fine. Wrap run_job() in set_secret_scope(build_profile_secret_scope(...)) with a finally-reset, mirroring the proven per-turn pattern in gateway/run.py (_profile_runtime_scope). Single-profile installs are unaffected (the scope is just the profile's own .env). tests/cron: 611 passed, 1 pre-existing unrelated failure (TestRoutingIntents::test_all_token_case_insensitive fails identically on unmodified main in a full-suite run and passes in isolation). --- cron/scheduler.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/cron/scheduler.py b/cron/scheduler.py index e072fce7f..6c26efb86 100644 --- a/cron/scheduler.py +++ b/cron/scheduler.py @@ -3114,7 +3114,26 @@ def run_one_job(job: dict, *, adapters=None, loop=None, verbose: bool = False) - ) return True # not an error — already handled/removed - success, output, final_response, error = run_job(job) + # Run the job under the profile's secret scope. get_secret() fails + # closed outside a scope once profile isolation is in play (multiple + # gateway profiles / room→profile multiplexing), and cron fires from + # the ticker thread where no per-turn scope is installed — so + # resolve_runtime_provider() raised UnscopedSecretError before model + # selection, breaking every cron job. Mirrors the per-turn pattern in + # gateway/run.py (_profile_runtime_scope). + from agent.secret_scope import ( + build_profile_secret_scope, + reset_secret_scope, + set_secret_scope, + ) + + _scope_token = set_secret_scope( + build_profile_secret_scope(_get_hermes_home()) + ) + try: + success, output, final_response, error = run_job(job) + finally: + reset_secret_scope(_scope_token) output_file = save_job_output(job["id"], output) if verbose: From def6d6fe1b7b1a214bb385500646ffde8fe82019 Mon Sep 17 00:00:00 2001 From: kshitijk4poor <82637225+kshitijk4poor@users.noreply.github.com> Date: Fri, 3 Jul 2026 18:34:23 +0530 Subject: [PATCH 34/46] test(cron): regression test for run_one_job secret scope Asserts the behavior contract that run_one_job installs a profile secret scope around run_job under multiplexing (so resolve_runtime_provider's get_secret does not fail-close with UnscopedSecretError) and tears it down afterward. Mutation-verified: fails on unmodified main with the exact UnscopedSecretError, passes with the fix. --- tests/cron/test_run_one_job.py | 43 ++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/tests/cron/test_run_one_job.py b/tests/cron/test_run_one_job.py index 7da6b1c14..c8528109d 100644 --- a/tests/cron/test_run_one_job.py +++ b/tests/cron/test_run_one_job.py @@ -117,3 +117,46 @@ def test_run_one_job_exception_marks_failure(monkeypatch): assert ok is False assert marks == [("j6", False)] + + +def test_run_one_job_installs_secret_scope_under_multiplex(monkeypatch, tmp_path): + """Regression: under profile isolation (multiplex active), run_one_job must + execute run_job inside a profile secret scope so credential reads + (resolve_runtime_provider -> get_secret) don't fail-close with + UnscopedSecretError, and must tear the scope down afterward. + + Behavior contract: a scope is present during run_job and absent after, + regardless of the concrete secret values. + """ + from agent import secret_scope as ss + + # Point cron's home resolution at a profile whose .env carries a secret. + (tmp_path / ".env").write_text("OPENROUTER_BASE_URL=https://openrouter.ai/api/v1\n") + monkeypatch.setattr(s, "_get_hermes_home", lambda: tmp_path) + + scope_during_run = {} + + def fake_run_job(job): + # This is where resolve_runtime_provider() would read a secret. Prove a + # scope is installed and the profile's secret resolves without raising. + scope_during_run["scope"] = ss.current_secret_scope() + scope_during_run["base_url"] = ss.get_secret("OPENROUTER_BASE_URL") + return (True, "out", "final", None) + + monkeypatch.setattr(s, "run_job", fake_run_job) + monkeypatch.setattr(s, "save_job_output", lambda jid, out: f"/tmp/{jid}.txt") + monkeypatch.setattr(s, "_deliver_result", lambda *a, **k: None) + monkeypatch.setattr(s, "mark_job_run", lambda *a, **k: None) + + ss.set_multiplex_active(True) + try: + ok = s.run_one_job({"id": "j7", "name": "t"}) + finally: + ss.set_multiplex_active(False) + + assert ok is True + # Scope was installed during run_job and the profile secret resolved. + assert scope_during_run["scope"] is not None + assert scope_during_run["base_url"] == "https://openrouter.ai/api/v1" + # And it was torn down after run_one_job returned (no leak). + assert ss.current_secret_scope() is None From 0a9d42ce402cc1a4e12dee18a313c1db2e0a02e3 Mon Sep 17 00:00:00 2001 From: kshitijk4poor <82637225+kshitijk4poor@users.noreply.github.com> Date: Fri, 3 Jul 2026 19:54:09 +0530 Subject: [PATCH 35/46] fix(web_tools): delegate backend availability to provider registry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plugin-registered web providers (registered via agent.web_search_registry) were invisible to the tool-availability gate: _is_backend_available() was a hardcoded env-var if-chain that returned False for any name outside the eight built-in backends. Because check_web_api_key() is the check_fn for both web_search and web_extract, a working custom provider with no built-in creds left both tools filtered out of the toolset entirely. Fix at the single chokepoint: _is_backend_available() now delegates non-legacy backend names to the registered provider's is_available(), falling back to the legacy built-in probes for known names and unregistered providers. Because _get_backend(), _get_capability_backend(), and check_web_api_key() all resolve availability through this one function, the fix cascades to every caller — including the per-capability extract selection that produced a dead-end 'search-only' error (#32698). The two remaining hardcoded whitelist early-returns (_get_backend, check_web_api_key) now also accept registered names, and both walk registered providers as a final fallback so a custom backend still resolves when no built-in has credentials. Built-in backend priority is preserved unchanged: the registry is consulted only for names outside _LEGACY_WEB_BACKENDS. Fixes #28651 Fixes #31873 Fixes #32698 --- tools/web_tools.py | 109 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 102 insertions(+), 7 deletions(-) diff --git a/tools/web_tools.py b/tools/web_tools.py index e66d0ee0f..be558d5ad 100644 --- a/tools/web_tools.py +++ b/tools/web_tools.py @@ -136,6 +136,65 @@ def _load_web_config() -> dict: except (ImportError, Exception): return {} + +# The built-in web backends whose availability is driven by hardcoded +# env-var / package / OAuth probes below. Any name NOT in this set is a +# candidate plugin-registered provider and must be resolved through the +# web_search_registry (``is_available()``) instead. Kept as a single named +# constant so the whitelist early-returns and the availability chokepoint +# stay in sync. +_LEGACY_WEB_BACKENDS = frozenset( + {"parallel", "firecrawl", "tavily", "exa", "searxng", "brave-free", "ddgs", "xai"} +) + + +def _registered_web_provider(backend: str): + """Return a plugin-registered web provider by name, or ``None``. + + Consults ``agent.web_search_registry`` so backends contributed by the + plugin system (which are absent from :data:`_LEGACY_WEB_BACKENDS`) are + discoverable during availability/selection resolution. Returns ``None`` + on any lookup failure so callers can fall through to legacy checks. + """ + if not backend: + return None + try: + from agent.web_search_registry import get_provider + + return get_provider(backend) + except Exception as exc: # noqa: BLE001 — registry optional; never fatal + logger.debug("web provider registry lookup failed for %r: %s", backend, exc) + return None + + +def _registered_web_provider_available(backend: str): + """Availability of a *registered* web provider, or ``None`` if unregistered. + + Returns ``True``/``False`` when *backend* names a registered provider + (calling its ``is_available()``), or ``None`` when it isn't registered — + letting the caller fall through to the legacy built-in probes. + """ + provider = _registered_web_provider(backend) + if provider is None: + return None + try: + return bool(provider.is_available()) + except Exception as exc: # noqa: BLE001 — a broken provider is "unavailable" + logger.debug("web provider %r.is_available() raised: %s", backend, exc) + return False + + +def _list_registered_web_providers(): + """Return all plugin-registered web providers (empty list on failure).""" + try: + from agent.web_search_registry import list_providers + + return list_providers() + except Exception as exc: # noqa: BLE001 — registry optional; never fatal + logger.debug("web provider registry list failed: %s", exc) + return [] + + def _get_backend() -> str: """Determine which web backend to use (shared fallback). @@ -144,7 +203,7 @@ def _get_backend() -> str: keys manually without running setup. """ configured = (_load_web_config().get("backend") or "").lower().strip() - if configured in {"parallel", "firecrawl", "tavily", "exa", "searxng", "brave-free", "ddgs", "xai"}: + if configured in _LEGACY_WEB_BACKENDS or _registered_web_provider(configured) is not None: return configured # Fallback for manual / legacy config — pick the highest-priority @@ -168,6 +227,14 @@ def _get_backend() -> str: if available: return backend + # Final fallback: walk plugin-registered providers so a custom backend + # (with no built-in creds present) still resolves. Built-in names are + # already covered above, so this only surfaces plugin-contributed + # providers via their own is_available() gate. + for provider in _list_registered_web_providers(): + if provider.name not in _LEGACY_WEB_BACKENDS and _is_backend_available(provider.name): + return provider.name + return "firecrawl" # default (backward compat) @@ -210,7 +277,22 @@ def _get_capability_backend(capability: str) -> str: def _is_backend_available(backend: str) -> bool: - """Return True when the selected backend is currently usable.""" + """Return True when the selected backend is currently usable. + + For plugin-registered backends (any name outside + :data:`_LEGACY_WEB_BACKENDS`), availability is delegated to the + provider's ``is_available()`` via the web_search_registry. This is the + single chokepoint through which ``_get_backend``, + ``_get_capability_backend``, and ``check_web_api_key`` all resolve + availability — fixing custom-provider discovery for every caller at once + (issues #28651, #31873, #32698). Built-in backends keep their cheap + hardcoded probes below. + """ + backend = (backend or "").lower().strip() + if backend not in _LEGACY_WEB_BACKENDS: + registered = _registered_web_provider_available(backend) + if registered is not None: + return registered if backend == "exa": return _has_env("EXA_API_KEY") if backend == "parallel": @@ -861,13 +943,26 @@ async def web_extract_tool( # Convenience function to check Firecrawl credentials def check_web_api_key() -> bool: - """Check whether the configured web backend is available.""" + """Check whether the configured web backend is available. + + Used as the ``check_fn`` gate for the ``web_search`` and ``web_extract`` + tool registry entries — so a plugin-registered provider that reports + ``is_available()`` must light the tools up even when no built-in backend + has credentials (issues #28651, #31873). Resolution funnels through + :func:`_is_backend_available`, which delegates non-legacy names to the + registry. + """ configured = _load_web_config().get("backend", "").lower().strip() - if configured in {"exa", "parallel", "firecrawl", "tavily", "searxng", "brave-free", "ddgs", "xai"}: - return _is_backend_available(configured) + if configured and _is_backend_available(configured): + return True + # Any built-in backend with credentials present. + if any(_is_backend_available(backend) for backend in _LEGACY_WEB_BACKENDS): + return True + # Any plugin-registered provider that reports itself available. return any( - _is_backend_available(backend) - for backend in ("exa", "parallel", "firecrawl", "tavily", "searxng", "brave-free", "ddgs", "xai") + _is_backend_available(provider.name) + for provider in _list_registered_web_providers() + if provider.name not in _LEGACY_WEB_BACKENDS ) From e4105a2ffd525d97ffacab34d044643fb252eae3 Mon Sep 17 00:00:00 2001 From: Sabin Iacob Date: Fri, 3 Jul 2026 19:55:59 +0530 Subject: [PATCH 36/46] test(web_tools): regression for plugin-registered provider availability A plugin-registered WebSearchProvider with no built-in provider credentials must light up web_search / web_extract and be discoverable by the backend selectors. Covers check_web_api_key(), _get_backend(), _is_backend_available() registry delegation, per-capability extract selection (#32698), and that the web_search / web_extract tool registry entries are not filtered out. Tests contributed by @m0n5t3r (PR #28652, issue #28651). --- tests/tools/test_web_tools_config.py | 119 +++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/tests/tools/test_web_tools_config.py b/tests/tools/test_web_tools_config.py index 667d5350c..6466e615f 100644 --- a/tests/tools/test_web_tools_config.py +++ b/tests/tools/test_web_tools_config.py @@ -668,3 +668,122 @@ def test_web_requires_env_includes_exa_key(): from tools.web_tools import _web_requires_env assert "EXA_API_KEY" in _web_requires_env() + + +class TestNonBuiltinProviderAvailability: + """Regression: a plugin-registered WebSearchProvider with no built-in + provider credentials must still light up web_search / web_extract tools. + + The web_tools availability gate delegates non-legacy backend names to the + web_search_registry's provider ``is_available()``. This class verifies + that a custom (non-built-in) provider discovered via the registry is + sufficient to make check_web_api_key() return True, _get_backend() return + the custom name, the per-capability selection honor it (issue #32698), and + the tool registry entries remain active. + + Original tests contributed by @m0n5t3r (PR #28652 / issue #28651). + """ + + # All env vars that could make a built-in provider available. + _WEB_ENV_KEYS = ( + "EXA_API_KEY", + "PARALLEL_API_KEY", + "FIRECRAWL_API_KEY", + "FIRECRAWL_API_URL", + "FIRECRAWL_GATEWAY_URL", + "TOOL_GATEWAY_DOMAIN", + "TOOL_GATEWAY_SCHEME", + "TOOL_GATEWAY_USER_TOKEN", + "TAVILY_API_KEY", + "SEARXNG_URL", + "BRAVE_SEARCH_API_KEY", + "XAI_API_KEY", + ) + + @staticmethod + def _create_fake_provider(*, search=True, extract=True): + """Dynamically create a WebSearchProvider subclass. + + Uses a local class definition (not a nested class) to avoid + Python 3.13 __bases__ deallocator issue with nested class + reassignment. + """ + from agent.web_search_provider import WebSearchProvider + + class FakePluginProvider(WebSearchProvider): + @property + def name(self): + return "fake-plugin-prov" + + def is_available(self): + return True + + def supports_search(self): + return search + + def supports_extract(self): + return extract + + return FakePluginProvider() + + def setup_method(self): + """Strip all built-in web provider env vars and reset the registry.""" + for key in self._WEB_ENV_KEYS: + os.environ.pop(key, None) + from agent.web_search_registry import _reset_for_tests, register_provider + _reset_for_tests() + register_provider(self._create_fake_provider()) + + def teardown_method(self): + """Reset the registry and restore env after each test.""" + from agent.web_search_registry import _reset_for_tests + _reset_for_tests() + for key in self._WEB_ENV_KEYS: + os.environ.pop(key, None) + + def test_check_web_api_key_returns_true_for_custom_provider(self): + """With only a custom provider registered (no built-in creds), + check_web_api_key() must return True.""" + with patch("tools.web_tools._ddgs_package_importable", return_value=False), \ + patch("tools.web_tools._peek_nous_access_token", return_value=None): + from tools.web_tools import check_web_api_key + assert check_web_api_key() is True + + def test_get_backend_discovers_custom_provider(self): + """_get_backend() must return the custom provider name when it's + the only available provider.""" + with patch("tools.web_tools._ddgs_package_importable", return_value=False), \ + patch("tools.web_tools._peek_nous_access_token", return_value=None): + from tools.web_tools import _get_backend + assert _get_backend() == "fake-plugin-prov" + + def test_is_backend_available_delegates_to_registry(self): + """_is_backend_available() must consult the registry for a + non-legacy backend name.""" + from tools.web_tools import _is_backend_available + assert _is_backend_available("fake-plugin-prov") is True + # Unknown, unregistered name -> False (no legacy probe matches). + assert _is_backend_available("totally-unknown-backend") is False + + def test_capability_backend_honors_custom_extract_provider(self): + """Per-capability selection (_get_extract_backend) must resolve the + custom provider when configured, instead of dead-ending — issue #32698.""" + with patch("tools.web_tools._ddgs_package_importable", return_value=False), \ + patch("tools.web_tools._peek_nous_access_token", return_value=None), \ + patch("tools.web_tools._load_web_config", + return_value={"extract_backend": "fake-plugin-prov"}): + from tools.web_tools import _get_extract_backend + assert _get_extract_backend() == "fake-plugin-prov" + + def test_tool_registry_entries_not_filtered_out(self): + """web_search and web_extract tool entries must remain in the + registry when only a custom provider is available.""" + with patch("tools.web_tools._ddgs_package_importable", return_value=False), \ + patch("tools.web_tools._peek_nous_access_token", return_value=None): + import tools.web_tools + web_search_entry = tools.web_tools.registry.get_entry("web_search") + web_extract_entry = tools.web_tools.registry.get_entry("web_extract") + assert web_search_entry is not None, \ + "web_search tool was filtered out despite custom provider being available" + assert web_extract_entry is not None, \ + "web_extract tool was filtered out despite custom provider being available" From a3ea73932ab02f57ff8900b260c506930b263c7f Mon Sep 17 00:00:00 2001 From: kshitijk4poor <82637225+kshitijk4poor@users.noreply.github.com> Date: Fri, 3 Jul 2026 19:56:36 +0530 Subject: [PATCH 37/46] chore(release): map iacobs@webflakes.com -> m0n5t3r in AUTHOR_MAP Second contributor identity from PR #28652 (issue #28651). --- scripts/release.py | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/release.py b/scripts/release.py index ab509388b..11f374e9f 100755 --- a/scripts/release.py +++ b/scripts/release.py @@ -1135,6 +1135,7 @@ AUTHOR_MAP = { "hata1234@gmail.com": "hata1234", "hmbown@gmail.com": "Hmbown", "iacobs@m0n5t3r.info": "m0n5t3r", + "iacobs@webflakes.com": "m0n5t3r", "jiayuw794@gmail.com": "JiayuuWang", "jinhyuk9714@gmail.com": "sjh9714", "jonny@nousresearch.com": "yoniebans", From a9cd0e07cbe6f411c875d6cfd3c8c356ca90b121 Mon Sep 17 00:00:00 2001 From: kshitijk4poor <82637225+kshitijk4poor@users.noreply.github.com> Date: Fri, 3 Jul 2026 20:02:50 +0530 Subject: [PATCH 38/46] refactor(web_tools): single registry authority for custom-provider availability MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Self-review follow-up. check_web_api_key() had a hand-rolled 'walk all registered providers and probe each' fallback that duplicated the registry's own availability-filtered resolvers (get_active_search_provider / get_active_extract_provider, backed by _resolve()) — a second resolution path that could diverge (the hand-rolled walk ignored capability, so a search-only custom provider was handled inconsistently). Delegate to the registry's resolvers so there is one authority for 'is a custom provider usable'. Also: _get_backend()'s tail walk now probes provider.is_available() directly instead of round-tripping through _is_backend_available(provider.name), which redundantly re-did the registry get_provider() lookup on a provider object already in hand. Both fallback loops guard is_available() against exceptions. Documented that _LEGACY_WEB_BACKENDS intentionally includes 'xai' (probed via has_xai_credentials, not a registered provider) while the registry's _LEGACY_PREFERENCE excludes it, so the two built-in sets don't silently drift. --- tools/web_tools.py | 45 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/tools/web_tools.py b/tools/web_tools.py index be558d5ad..1e2c4a03a 100644 --- a/tools/web_tools.py +++ b/tools/web_tools.py @@ -143,6 +143,12 @@ def _load_web_config() -> dict: # web_search_registry (``is_available()``) instead. Kept as a single named # constant so the whitelist early-returns and the availability chokepoint # stay in sync. +# +# NOTE: this intentionally includes ``xai``, which the registry's +# ``_LEGACY_PREFERENCE`` does NOT — xai availability is probed via +# ``has_xai_credentials()`` (env var OR auth.json OAuth), not a registered +# WebSearchProvider. Keep the two sets aligned by hand: if xai ever ships as +# a registered provider, drop it here so the registry path takes over. _LEGACY_WEB_BACKENDS = frozenset( {"parallel", "firecrawl", "tavily", "exa", "searxng", "brave-free", "ddgs", "xai"} ) @@ -230,10 +236,17 @@ def _get_backend() -> str: # Final fallback: walk plugin-registered providers so a custom backend # (with no built-in creds present) still resolves. Built-in names are # already covered above, so this only surfaces plugin-contributed - # providers via their own is_available() gate. + # providers via their own is_available() gate. We hold the provider + # object already, so probe it directly rather than round-tripping through + # _is_backend_available() (which would re-do the registry lookup). for provider in _list_registered_web_providers(): - if provider.name not in _LEGACY_WEB_BACKENDS and _is_backend_available(provider.name): - return provider.name + if provider.name in _LEGACY_WEB_BACKENDS: + continue + try: + if provider.is_available(): + return provider.name + except Exception as exc: # noqa: BLE001 — a broken provider is skipped + logger.debug("web provider %r.is_available() raised: %s", provider.name, exc) return "firecrawl" # default (backward compat) @@ -955,15 +968,27 @@ def check_web_api_key() -> bool: configured = _load_web_config().get("backend", "").lower().strip() if configured and _is_backend_available(configured): return True - # Any built-in backend with credentials present. + # Any built-in backend with credentials present. This is a boolean OR, so + # unlike _get_backend() the probe order is irrelevant. if any(_is_backend_available(backend) for backend in _LEGACY_WEB_BACKENDS): return True - # Any plugin-registered provider that reports itself available. - return any( - _is_backend_available(provider.name) - for provider in _list_registered_web_providers() - if provider.name not in _LEGACY_WEB_BACKENDS - ) + # Any plugin-registered provider the registry considers active for either + # capability. Delegating to the registry's own availability-filtered + # resolvers keeps a single authority for "is a custom provider usable" + # rather than re-implementing the walk here. + try: + from agent.web_search_registry import ( + get_active_search_provider, + get_active_extract_provider, + ) + + return ( + get_active_search_provider() is not None + or get_active_extract_provider() is not None + ) + except Exception as exc: # noqa: BLE001 — registry optional; never fatal + logger.debug("web provider registry availability check failed: %s", exc) + return False if __name__ == "__main__": From dcbce869ae4f59b7b0f2f5cba3f1466fe7fae965 Mon Sep 17 00:00:00 2001 From: Shannon Sands Date: Tue, 30 Jun 2026 15:52:34 +1000 Subject: [PATCH 39/46] Add safe Hermes console REPL --- hermes_cli/_parser.py | 1 + hermes_cli/console_engine.py | 1709 +++++++++++++++++++++++ hermes_cli/main.py | 15 +- hermes_cli/subcommands/console.py | 18 + tests/hermes_cli/test_console_engine.py | 593 ++++++++ 5 files changed, 2335 insertions(+), 1 deletion(-) create mode 100644 hermes_cli/console_engine.py create mode 100644 hermes_cli/subcommands/console.py create mode 100644 tests/hermes_cli/test_console_engine.py diff --git a/hermes_cli/_parser.py b/hermes_cli/_parser.py index 521c5fcf9..d06a3d4ac 100644 --- a/hermes_cli/_parser.py +++ b/hermes_cli/_parser.py @@ -71,6 +71,7 @@ Examples: hermes logs errors View errors.log hermes logs --since 1h Lines from the last hour hermes debug share Upload debug report for support + hermes console Open the safe Hermes command console hermes update Update to latest version hermes dashboard Start web UI dashboard (port 9119) hermes dashboard --stop Stop running dashboard processes diff --git a/hermes_cli/console_engine.py b/hermes_cli/console_engine.py new file mode 100644 index 000000000..e89ed2bc2 --- /dev/null +++ b/hermes_cli/console_engine.py @@ -0,0 +1,1709 @@ +"""Safe Hermes Console command engine. + +This module backs ``hermes console`` and is intentionally narrower than the +full Hermes CLI. It exposes a curated set of native adapters that can later be +shared by the dashboard console websocket without becoming a raw shell. +""" + +from __future__ import annotations + +import argparse +import contextlib +import importlib +import difflib +import io +import json +import shlex +import sys +from dataclasses import dataclass, replace +from pathlib import Path +from typing import Callable, Iterable, Literal, NoReturn, Sequence +from urllib.parse import urlparse + + +ConsoleStatus = Literal["ok", "error", "confirm_required", "exit", "clear"] +ConsoleContext = Literal["local", "hosted"] +ALL_CONTEXTS: frozenset[ConsoleContext] = frozenset({"local", "hosted"}) +LOCAL_CONTEXTS: frozenset[ConsoleContext] = frozenset({"local"}) + + +class ConsoleCommandError(RuntimeError): + """User-facing console command failure.""" + + +@dataclass(frozen=True) +class ConsoleResult: + status: ConsoleStatus + output: str = "" + command: str = "" + confirmation_message: str = "" + + +@dataclass(frozen=True) +class ConsoleCommand: + path: tuple[str, ...] + usage: str + summary: str + handler: Callable[["HermesConsoleEngine", list[str]], str] + mutating: bool = False + confirmation: str = "" + contexts: frozenset[ConsoleContext] = LOCAL_CONTEXTS + + +class _ArgumentParser(argparse.ArgumentParser): + def error(self, message: str) -> NoReturn: # pragma: no cover - argparse hook + raise ConsoleCommandError(f"{self.prog}: {message}") + + +def _capture_output(fn: Callable[[], object]) -> str: + stdout = io.StringIO() + stderr = io.StringIO() + code = 0 + with contextlib.redirect_stdout(stdout), contextlib.redirect_stderr(stderr): + try: + result = fn() + if isinstance(result, int) and result: + raise SystemExit(result) + except SystemExit as exc: + code = int(exc.code or 0) + text = stdout.getvalue() + stderr.getvalue() + if code: + raise ConsoleCommandError(text.strip() or f"Command exited with status {code}") + return text.rstrip() + + +def _split_line(line: str) -> list[str]: + try: + return shlex.split(line, comments=False, posix=True) + except ValueError as exc: + raise ConsoleCommandError(f"Could not parse command: {exc}") from exc + + +def _contains_shell_syntax(line: str, tokens: Sequence[str]) -> bool: + if "$(" in line or "`" in line: + return True + shell_tokens = {"|", "||", "&", "&&", ";", ">", ">>", "<", "<<", "2>", "2>>"} + if any(token in shell_tokens for token in tokens): + return True + return any(ch in line for ch in "|<>;") + + +def _format_sessions(sessions: Sequence[dict]) -> str: + if not sessions: + return "No sessions found." + lines = [f"{'ID':<32} {'Source':<12} {'Msgs':>5} Title / Preview"] + lines.append("-" * 82) + for session in sessions: + sid = str(session.get("id") or "")[:32] + source = str(session.get("source") or "-")[:12] + messages = session.get("message_count") or 0 + title = session.get("title") or session.get("preview") or "" + title = str(title).replace("\n", " ")[:60] + lines.append(f"{sid:<32} {source:<12} {messages:>5} {title}") + return "\n".join(lines) + + +def _format_job(job: dict, action: str) -> str: + job_id = job.get("id") or job.get("job_id") or "?" + name = job.get("name") or "(unnamed)" + state = job.get("state") or ("scheduled" if job.get("enabled", True) else "paused") + return f"{action} job: {name} ({job_id}) [{state}]" + + +EXPECTED_HOSTED_PATHS: tuple[tuple[str, ...], ...] = ( + ("status",), + ("doctor",), + ("logs",), + ("version",), + ("prompt-size",), + ("insights",), + ("security", "audit"), + ("portal", "info"), + ("portal", "tools"), + ("send",), + ("config", "show"), + ("config", "path"), + ("config", "env-path"), + ("config", "check"), + ("config", "migrate"), + ("config", "set"), + ("sessions", "list"), + ("sessions", "stats"), + ("sessions", "export"), + ("sessions", "rename"), + ("sessions", "optimize"), + ("sessions", "repair"), + ("cron", "list"), + ("cron", "status"), + ("cron", "create"), + ("cron", "edit"), + ("cron", "pause"), + ("cron", "resume"), + ("cron", "run"), + ("cron", "remove"), + ("cron", "tick"), + ("profile",), + ("profile", "list"), + ("profile", "show"), + ("profile", "info"), + ("tools", "list"), + ("tools", "enable"), + ("tools", "disable"), + ("tools", "post-setup"), + ("skills", "browse"), + ("skills", "search"), + ("skills", "inspect"), + ("skills", "list"), + ("skills", "check"), + ("skills", "list-modified"), + ("skills", "diff"), + ("skills", "install"), + ("skills", "update"), + ("skills", "audit"), + ("skills", "uninstall"), + ("skills", "reset"), + ("skills", "opt-in"), + ("skills", "opt-out"), + ("skills", "repair-official"), + ("skills", "snapshot", "export"), + ("skills", "tap", "list"), + ("mcp", "list"), + ("mcp", "catalog"), + ("mcp", "test"), + ("mcp", "add"), + ("mcp", "remove"), + ("mcp", "install"), + ("mcp", "login"), + ("mcp", "reauth"), + ("mcp", "configure"), + ("mcp", "picker"), + ("memory", "status"), + ("auth", "list"), + ("auth", "status"), + ("auth", "reset"), + ("auth", "spotify", "status"), + ("pairing", "list"), + ("pairing", "approve"), + ("pairing", "revoke"), + ("pairing", "clear-pending"), + ("webhook", "list"), + ("webhook", "subscribe"), + ("webhook", "remove"), + ("webhook", "test"), +) + + +def _parser_root() -> tuple[_ArgumentParser, argparse._SubParsersAction]: + parser = _ArgumentParser(prog="hermes", add_help=False) + subparsers = parser.add_subparsers(dest="_console_command") + return parser, subparsers + + +def _invoke_namespace(args: argparse.Namespace) -> object: + func = getattr(args, "func", None) + if not callable(func): + raise ConsoleCommandError("No handler is available for that console command.") + return func(args) + + +def _set_attrs(args: argparse.Namespace, **attrs: object) -> argparse.Namespace: + for name, value in attrs.items(): + setattr(args, name, value) + return args + + +def _dispatch_extracted_subcommand( + *, + root: str, + fixed: Sequence[str], + args: Sequence[str], + module_name: str, + builder_name: str, + main_handler_name: str, + console_context: ConsoleContext, + namespace_update: Callable[[argparse.Namespace, ConsoleContext], None] | None = None, +) -> str: + parser, subparsers = _parser_root() + module = importlib.import_module(module_name) + main_module = importlib.import_module("hermes_cli.main") + builder = getattr(module, builder_name) + main_handler = getattr(main_module, main_handler_name) + builder(subparsers, **{main_handler_name: main_handler}) + namespace = parser.parse_args([root, *fixed, *args]) + if namespace_update: + namespace_update(namespace, console_context) + return _capture_output(lambda: _invoke_namespace(namespace)) + + +def _dispatch_registered_subcommand( + *, + root: str, + fixed: Sequence[str], + args: Sequence[str], + module_name: str, + register_name: str, + handler_name: str | None = None, + console_context: ConsoleContext, + namespace_update: Callable[[argparse.Namespace, ConsoleContext], None] | None = None, +) -> str: + parser, subparsers = _parser_root() + module = importlib.import_module(module_name) + top_parser = subparsers.add_parser(root) + register = getattr(module, register_name) + register(top_parser) + if handler_name: + top_parser.set_defaults(func=getattr(module, handler_name)) + namespace = parser.parse_args([root, *fixed, *args]) + if namespace_update: + namespace_update(namespace, console_context) + return _capture_output(lambda: _invoke_namespace(namespace)) + + +def _dispatch_builder_subcommand( + *, + root: str, + fixed: Sequence[str], + args: Sequence[str], + module_name: str, + builder_name: str, + main_handler_name: str, + console_context: ConsoleContext, + namespace_update: Callable[[argparse.Namespace, ConsoleContext], None] | None = None, +) -> str: + parser, subparsers = _parser_root() + module = importlib.import_module(module_name) + main_module = importlib.import_module("hermes_cli.main") + top_parser = getattr(module, builder_name)(subparsers) + top_parser.set_defaults(func=getattr(main_module, main_handler_name)) + namespace = parser.parse_args([root, *fixed, *args]) + if namespace_update: + namespace_update(namespace, console_context) + return _capture_output(lambda: _invoke_namespace(namespace)) + + +def _dispatch_adder_subcommand( + *, + root: str, + fixed: Sequence[str], + args: Sequence[str], + module_name: str, + add_name: str, + console_context: ConsoleContext, + namespace_update: Callable[[argparse.Namespace, ConsoleContext], None] | None = None, +) -> str: + parser, subparsers = _parser_root() + module = importlib.import_module(module_name) + getattr(module, add_name)(subparsers) + namespace = parser.parse_args([root, *fixed, *args]) + if namespace_update: + namespace_update(namespace, console_context) + return _capture_output(lambda: _invoke_namespace(namespace)) + + +def _extracted_handler( + root: str, + fixed: Sequence[str], + module_name: str, + builder_name: str, + main_handler_name: str, + namespace_update: Callable[[argparse.Namespace, ConsoleContext], None] | None = None, +) -> Callable[["HermesConsoleEngine", list[str]], str]: + def handler(_engine: HermesConsoleEngine, args: list[str]) -> str: + return _dispatch_extracted_subcommand( + root=root, + fixed=fixed, + args=args, + module_name=module_name, + builder_name=builder_name, + main_handler_name=main_handler_name, + console_context=_engine.context, + namespace_update=namespace_update, + ) + + return handler + + +def _registered_handler( + root: str, + fixed: Sequence[str], + module_name: str, + register_name: str, + handler_name: str | None = None, + namespace_update: Callable[[argparse.Namespace, ConsoleContext], None] | None = None, +) -> Callable[["HermesConsoleEngine", list[str]], str]: + def handler(_engine: HermesConsoleEngine, args: list[str]) -> str: + return _dispatch_registered_subcommand( + root=root, + fixed=fixed, + args=args, + module_name=module_name, + register_name=register_name, + handler_name=handler_name, + console_context=_engine.context, + namespace_update=namespace_update, + ) + + return handler + + +def _builder_handler( + root: str, + fixed: Sequence[str], + module_name: str, + builder_name: str, + main_handler_name: str, + namespace_update: Callable[[argparse.Namespace, ConsoleContext], None] | None = None, +) -> Callable[["HermesConsoleEngine", list[str]], str]: + def handler(_engine: HermesConsoleEngine, args: list[str]) -> str: + return _dispatch_builder_subcommand( + root=root, + fixed=fixed, + args=args, + module_name=module_name, + builder_name=builder_name, + main_handler_name=main_handler_name, + console_context=_engine.context, + namespace_update=namespace_update, + ) + + return handler + + +def _adder_handler( + root: str, + fixed: Sequence[str], + module_name: str, + add_name: str, + namespace_update: Callable[[argparse.Namespace, ConsoleContext], None] | None = None, +) -> Callable[["HermesConsoleEngine", list[str]], str]: + def handler(_engine: HermesConsoleEngine, args: list[str]) -> str: + return _dispatch_adder_subcommand( + root=root, + fixed=fixed, + args=args, + module_name=module_name, + add_name=add_name, + console_context=_engine.context, + namespace_update=namespace_update, + ) + + return handler + + +def _register_command_family( + engine: "HermesConsoleEngine", + *, + root: str, + paths: Iterable[Sequence[str]], + handler_factory: Callable[[Sequence[str]], Callable[["HermesConsoleEngine", list[str]], str]], + mutating: Iterable[Sequence[str]] = (), + hosted: Iterable[Sequence[str]] = (), + summary: str = "", + confirmation: str = "", +) -> None: + mutating_paths = {tuple(path) for path in mutating} + hosted_paths = {tuple(path) for path in hosted} + for child_path in paths: + child_key = tuple(child_path) + full_path = (root, *tuple(child_path)) + usage = " ".join(full_path) + engine.register( + full_path, + usage, + summary or f"Run `hermes {usage}`.", + handler_factory(tuple(child_path)), + mutating=child_key in mutating_paths, + confirmation=confirmation or f"Run `hermes {usage}`?", + contexts=ALL_CONTEXTS if child_key in hosted_paths else LOCAL_CONTEXTS, + ) + + +class HermesConsoleEngine: + """Curated line-command executor for Hermes Console.""" + + def __init__(self, *, output_limit: int = 20000, context: ConsoleContext = "local"): + if context not in ALL_CONTEXTS: + raise ValueError(f"Unknown console context: {context}") + self.context = context + self.output_limit = output_limit + self.history: list[str] = [] + self.commands: dict[tuple[str, ...], ConsoleCommand] = {} + self._register_defaults() + + def execute(self, line: str, *, confirmed: bool = False) -> ConsoleResult: + raw_line = line.strip() + if not raw_line: + return ConsoleResult("ok") + + try: + tokens = _split_line(raw_line) + if tokens and tokens[0] == "hermes": + tokens = tokens[1:] + if not tokens: + return self._help_result() + + if _contains_shell_syntax(raw_line, tokens): + raise ConsoleCommandError( + "Hermes Console does not run shell syntax. Use one supported " + "Hermes command at a time." + ) + + builtin = self._execute_builtin(tokens) + if builtin is not None: + if raw_line not in {"history", "clear"}: + self.history.append(raw_line) + return builtin + + command, args = self._resolve_command(tokens) + if command.mutating and not confirmed: + return ConsoleResult( + "confirm_required", + command=raw_line, + confirmation_message=command.confirmation + or f"Run `{command.usage}`?", + ) + + output = command.handler(self, args).rstrip() + output = self._cap_output(output) + self.history.append(raw_line) + return ConsoleResult("ok", output=output, command=raw_line) + except ConsoleCommandError as exc: + return ConsoleResult("error", output=str(exc).strip(), command=raw_line) + + def help_text(self, subject: str | None = None) -> str: + if subject: + tokens = subject.split() + command, _args = self._resolve_command(tokens) + return f"{command.usage}\n{command.summary}" + + lines = [ + "Hermes Console", + "", + "Supported commands:", + ] + for command in sorted(self.commands.values(), key=lambda c: c.usage): + if self.context not in command.contexts: + continue + marker = " *" if command.mutating else " " + lines.append(f"{marker} {command.usage:<32} {command.summary}") + lines.extend( + [ + "", + "* requires confirmation", + "Built-ins: help, help , history, clear, exit, quit", + ] + ) + return "\n".join(lines) + + def _register_defaults(self) -> None: + self.register(("status",), "status", "Show Hermes component status.", _status, contexts=ALL_CONTEXTS) + self.register(("doctor",), "doctor", "Run diagnostics without auto-fix.", _doctor, contexts=ALL_CONTEXTS) + self.register(("logs",), "logs [name] [-n N]", "Show recent Hermes logs.", _logs, contexts=ALL_CONTEXTS) + self.register(("sessions", "list"), "sessions list [--limit N]", "List recent sessions.", _sessions_list, contexts=ALL_CONTEXTS) + self.register(("sessions", "stats"), "sessions stats", "Show session store statistics.", _sessions_stats, contexts=ALL_CONTEXTS) + self.register(("config", "show"), "config show", "Show current configuration.", _config_show, contexts=ALL_CONTEXTS) + self.register(("config", "path"), "config path", "Print config.yaml path.", _config_path, contexts=ALL_CONTEXTS) + self.register( + ("config", "set"), + "config set ", + "Set a configuration value.", + _config_set, + mutating=True, + confirmation="Update Hermes configuration?", + contexts=ALL_CONTEXTS, + ) + self.register(("cron", "list"), "cron list [--all]", "List scheduled jobs.", _cron_list, contexts=ALL_CONTEXTS) + self.register(("cron", "status"), "cron status", "Show cron scheduler status.", _cron_status, contexts=ALL_CONTEXTS) + self.register( + ("cron", "pause"), + "cron pause ", + "Pause a scheduled job.", + _cron_pause, + mutating=True, + confirmation="Pause this cron job?", + contexts=ALL_CONTEXTS, + ) + self.register( + ("cron", "resume"), + "cron resume ", + "Resume a paused cron job.", + _cron_resume, + mutating=True, + confirmation="Resume this cron job?", + contexts=ALL_CONTEXTS, + ) + self.register( + ("cron", "run"), + "cron run ", + "Run a job on the next scheduler tick.", + _cron_run, + mutating=True, + confirmation="Trigger this cron job?", + contexts=ALL_CONTEXTS, + ) + self._register_broad_cli_surface() + + def _register_broad_cli_surface(self) -> None: + """Register non-admin CLI commands that are safe for Hermes Console.""" + + extracted = { + "version": ( + "hermes_cli.subcommands.version", + "build_version_parser", + "cmd_version", + [()], + set(), + ), + "dump": ( + "hermes_cli.subcommands.dump", + "build_dump_parser", + "cmd_dump", + [()], + set(), + ), + "debug": ( + "hermes_cli.subcommands.debug", + "build_debug_parser", + "cmd_debug", + [("share",), ("delete",)], + {("share",), ("delete",)}, + ), + "prompt-size": ( + "hermes_cli.subcommands.prompt_size", + "build_prompt_size_parser", + "cmd_prompt_size", + [()], + set(), + ), + "insights": ( + "hermes_cli.subcommands.insights", + "build_insights_parser", + "cmd_insights", + [()], + set(), + ), + "security": ( + "hermes_cli.subcommands.security", + "build_security_parser", + "cmd_security", + [("audit",)], + set(), + ), + "backup": ( + "hermes_cli.subcommands.backup", + "build_backup_parser", + "cmd_backup", + [()], + {()}, + ), + "import": ( + "hermes_cli.subcommands.import_cmd", + "build_import_cmd_parser", + "cmd_import", + [()], + {()}, + ), + "config": ( + "hermes_cli.subcommands.config", + "build_config_parser", + "cmd_config", + [("env-path",), ("check",)], + set(), + ), + "tools": ( + "hermes_cli.subcommands.tools", + "build_tools_parser", + "cmd_tools", + [("list",), ("enable",), ("disable",), ("post-setup",)], + {("enable",), ("disable",), ("post-setup",)}, + ), + "plugins": ( + "hermes_cli.subcommands.plugins", + "build_plugins_parser", + "cmd_plugins", + [("list",), ("enable",), ("disable",), ("install",), ("update",), ("remove",)], + {("enable",), ("disable",), ("install",), ("update",), ("remove",)}, + ), + "skills": ( + "hermes_cli.subcommands.skills", + "build_skills_parser", + "cmd_skills", + [ + ("browse",), + ("search",), + ("inspect",), + ("list",), + ("check",), + ("list-modified",), + ("diff",), + ("install",), + ("update",), + ("audit",), + ("uninstall",), + ("reset",), + ("opt-in",), + ("opt-out",), + ("repair-official",), + ("snapshot", "export"), + ("snapshot", "import"), + ("tap", "list"), + ("tap", "add"), + ("tap", "remove"), + ], + { + ("install",), + ("update",), + ("audit",), + ("uninstall",), + ("reset",), + ("opt-in",), + ("opt-out",), + ("repair-official",), + ("snapshot", "export"), + ("snapshot", "import"), + ("tap", "add"), + ("tap", "remove"), + }, + ), + "mcp": ( + "hermes_cli.subcommands.mcp", + "build_mcp_parser", + "cmd_mcp", + [ + ("list",), + ("catalog",), + ("test",), + ("add",), + ("remove",), + ("install",), + ("login",), + ("reauth",), + ("configure",), + ("picker",), + ], + { + ("add",), + ("remove",), + ("install",), + ("login",), + ("reauth",), + ("configure",), + ("picker",), + }, + ), + "memory": ( + "hermes_cli.subcommands.memory", + "build_memory_parser", + "cmd_memory", + [("status",), ("off",), ("reset",)], + {("off",), ("reset",)}, + ), + "auth": ( + "hermes_cli.subcommands.auth", + "build_auth_parser", + "cmd_auth", + [ + ("list",), + ("status",), + ("reset",), + ("add",), + ("remove",), + ("logout",), + ("spotify", "status"), + ("spotify", "login"), + ("spotify", "logout"), + ], + { + ("reset",), + ("add",), + ("remove",), + ("logout",), + ("spotify", "login"), + ("spotify", "logout"), + }, + ), + "pairing": ( + "hermes_cli.subcommands.pairing", + "build_pairing_parser", + "cmd_pairing", + [("list",), ("approve",), ("revoke",), ("clear-pending",)], + {("approve",), ("revoke",), ("clear-pending",)}, + ), + "webhook": ( + "hermes_cli.subcommands.webhook", + "build_webhook_parser", + "cmd_webhook", + [("list",), ("subscribe",), ("remove",), ("test",)], + {("subscribe",), ("remove",)}, + ), + "hooks": ( + "hermes_cli.subcommands.hooks", + "build_hooks_parser", + "cmd_hooks", + [("list",), ("test",), ("doctor",), ("revoke",)], + {("test",), ("doctor",), ("revoke",)}, + ), + "slack": ( + "hermes_cli.subcommands.slack", + "build_slack_parser", + "cmd_slack", + [("manifest",)], + set(), + ), + "profile": ( + "hermes_cli.subcommands.profile", + "build_profile_parser", + "cmd_profile", + [ + ("list",), + ("show",), + ("info",), + ("create",), + ("use",), + ("describe",), + ("rename",), + ("delete",), + ("export",), + ("import",), + ("install",), + ("update",), + ], + { + ("create",), + ("use",), + ("describe",), + ("rename",), + ("delete",), + ("export",), + ("import",), + ("install",), + ("update",), + }, + ), + "cron": ( + "hermes_cli.subcommands.cron", + "build_cron_parser", + "cmd_cron", + [("create",), ("edit",), ("remove",), ("tick",)], + {("create",), ("edit",), ("remove",), ("tick",)}, + ), + } + + for root, (module, builder, main_handler, paths, mutating) in extracted.items(): + _register_command_family( + self, + root=root, + paths=paths, + mutating=mutating, + handler_factory=lambda fixed, root=root, module=module, builder=builder, main_handler=main_handler: _extracted_handler( + root, + fixed, + module, + builder, + main_handler, + namespace_update=_apply_confirmed_defaults, + ), + ) + + self.register( + ("config", "migrate"), + "config migrate", + "Update config with new options.", + _config_migrate, + mutating=True, + confirmation="Update Hermes configuration with missing defaults?", + ) + self.register( + ("sessions", "export"), + "sessions export [--source SOURCE] [--session-id ID]", + "Export sessions to JSONL.", + _sessions_export, + mutating=True, + confirmation="Export session data?", + ) + self.register( + ("sessions", "rename"), + "sessions rename ", + "Rename a session.", + _sessions_rename, + mutating=True, + confirmation="Rename this session?", + ) + self.register( + ("sessions", "optimize"), + "sessions optimize", + "Optimize the session store.", + _sessions_optimize, + mutating=True, + confirmation="Optimize the session database?", + ) + self.register( + ("sessions", "repair"), + "sessions repair [--check-only] [--no-backup]", + "Repair a malformed session database schema.", + _sessions_repair, + mutating=True, + confirmation="Repair the session database?", + ) + + self.register( + ("profile",), + "profile", + "Show active profile status.", + _profile_status, + ) + self.register( + ("send",), + "send --to <target> <message>", + "Send a message to a configured platform.", + _adder_handler("send", (), "hermes_cli.send_cmd", "register_send_subparser"), + mutating=True, + confirmation="Send this message?", + ) + + portal_paths = [("info",), ("tools",)] + _register_command_family( + self, + root="portal", + paths=portal_paths, + handler_factory=lambda fixed: _adder_handler( + "portal", + fixed, + "hermes_cli.portal_cli", + "add_parser", + ), + ) + + _register_command_family( + self, + root="project", + paths=[ + ("list",), + ("show",), + ("create",), + ("add-folder",), + ("remove-folder",), + ("rename",), + ("set-primary",), + ("use",), + ("archive",), + ("restore",), + ("bind-board",), + ], + mutating=[ + ("create",), + ("add-folder",), + ("remove-folder",), + ("rename",), + ("set-primary",), + ("use",), + ("archive",), + ("restore",), + ("bind-board",), + ], + handler_factory=lambda fixed: _builder_handler( + "project", + fixed, + "hermes_cli.projects_cmd", + "build_parser", + "cmd_project", + ), + ) + + _register_command_family( + self, + root="kanban", + paths=[ + ("init",), + ("boards", "list"), + ("boards", "create"), + ("boards", "rm"), + ("boards", "switch"), + ("boards", "current"), + ("boards", "rename"), + ("boards", "set-workdir"), + ("create",), + ("list",), + ("show",), + ("assign",), + ("reclaim",), + ("reassign",), + ("diagnose",), + ("link",), + ("unlink",), + ("claim",), + ("comment",), + ("complete",), + ("edit",), + ("block",), + ("schedule",), + ("unblock",), + ("promote",), + ("archive",), + ("stats",), + ("runs",), + ("heartbeat",), + ("assignments",), + ("context",), + ], + mutating=[ + ("init",), + ("boards", "create"), + ("boards", "rm"), + ("boards", "switch"), + ("boards", "rename"), + ("boards", "set-workdir"), + ("create",), + ("assign",), + ("reclaim",), + ("reassign",), + ("link",), + ("unlink",), + ("claim",), + ("comment",), + ("complete",), + ("edit",), + ("block",), + ("schedule",), + ("unblock",), + ("promote",), + ("archive",), + ], + handler_factory=lambda fixed: _builder_handler( + "kanban", + fixed, + "hermes_cli.kanban", + "build_parser", + "cmd_kanban", + ), + ) + + registered = { + "bundles": ( + "hermes_cli.bundles", + "register_cli", + "bundles_command", + [("list",), ("show",), ("create",), ("delete",), ("reload",)], + {("create",), ("delete",), ("reload",)}, + ), + "checkpoints": ( + "hermes_cli.checkpoints", + "register_cli", + None, + [("status",), ("list",), ("prune",), ("clear",), ("clear-legacy",)], + {("prune",), ("clear",), ("clear-legacy",)}, + ), + "curator": ( + "hermes_cli.curator", + "register_cli", + None, + [ + ("status",), + ("run",), + ("pause",), + ("resume",), + ("pin",), + ("unpin",), + ("restore",), + ("list-archived",), + ("archive",), + ("prune",), + ("backup",), + ("rollback",), + ], + { + ("run",), + ("pause",), + ("resume",), + ("pin",), + ("unpin",), + ("restore",), + ("archive",), + ("prune",), + ("backup",), + ("rollback",), + }, + ), + "pets": ( + "hermes_cli.pets", + "register_cli", + None, + [("list",), ("install",), ("select",), ("show",), ("off",), ("scale",), ("remove",), ("doctor",)], + {("install",), ("select",), ("off",), ("scale",), ("remove",)}, + ), + } + for root, (module, register, handler_name, paths, mutating) in registered.items(): + _register_command_family( + self, + root=root, + paths=paths, + mutating=mutating, + handler_factory=lambda fixed, root=root, module=module, register=register, handler_name=handler_name: _registered_handler( + root, + fixed, + module, + register, + handler_name=handler_name, + namespace_update=_apply_confirmed_defaults, + ), + ) + + self._mark_hosted(EXPECTED_HOSTED_PATHS) + + def register( + self, + path: Iterable[str], + usage: str, + summary: str, + handler: Callable[["HermesConsoleEngine", list[str]], str], + *, + mutating: bool = False, + confirmation: str = "", + contexts: Iterable[ConsoleContext] = LOCAL_CONTEXTS, + ) -> None: + key = tuple(path) + self.commands[key] = ConsoleCommand( + path=key, + usage=usage, + summary=summary, + handler=handler, + mutating=mutating, + confirmation=confirmation, + contexts=frozenset(contexts), + ) + + def _mark_hosted(self, paths: Iterable[Sequence[str]]) -> None: + for path in paths: + key = tuple(path) + command = self.commands.get(key) + if command is None: + raise RuntimeError(f"Hosted console policy references unknown command: {' '.join(key)}") + self.commands[key] = replace( + command, + contexts=command.contexts | frozenset({"hosted"}), + ) + + def _execute_builtin(self, tokens: list[str]) -> ConsoleResult | None: + head = tokens[0] + if head == "help": + subject = " ".join(tokens[1:]).strip() or None + try: + return ConsoleResult("ok", output=self.help_text(subject)) + except ConsoleCommandError as exc: + return ConsoleResult("error", output=str(exc)) + if head == "history": + output = "\n".join(f"{idx + 1}: {cmd}" for idx, cmd in enumerate(self.history)) + return ConsoleResult("ok", output=output or "No history yet.") + if head == "clear": + return ConsoleResult("clear", output="\033[2J\033[H") + if head in {"exit", "quit"}: + return ConsoleResult("exit") + return None + + def _resolve_command(self, tokens: Sequence[str]) -> tuple[ConsoleCommand, list[str]]: + rejected = self._rejection_for(tokens) + if rejected: + raise ConsoleCommandError(rejected) + + for size in range(min(len(tokens), 3), 0, -1): + key = tuple(tokens[:size]) + command = self.commands.get(key) + if command: + if self.context not in command.contexts: + raise ConsoleCommandError( + f"`hermes {command.usage}` is not available in " + f"{self.context} Hermes Console." + ) + self._enforce_context_policy(command, list(tokens[size:])) + return command, list(tokens[size:]) + + available = [ + " ".join(path) + for path, command in self.commands.items() + if self.context in command.contexts + ] + probe = " ".join(tokens[:2]) if len(tokens) > 1 else tokens[0] + suggestions = difflib.get_close_matches(probe, available, n=3, cutoff=0.45) + suffix = f" Did you mean: {', '.join(suggestions)}?" if suggestions else "" + raise ConsoleCommandError(f"Unsupported Hermes Console command: {probe}.{suffix}") + + def _enforce_context_policy(self, command: ConsoleCommand, args: list[str]) -> None: + if self.context != "hosted": + return + _enforce_hosted_line_policy(command.path, args) + + def _rejection_for(self, tokens: Sequence[str]) -> str: + first = tokens[0] + if first.startswith("-"): + return f"{first} is not available in Hermes Console." + blocked_top = { + "acp", + "chat", + "claw", + "completion", + "dashboard", + "desktop", + "fallback", + "gateway", + "gui", + "login", + "logout", + "model", + "moa", + "oneshot", + "postinstall", + "proxy", + "serve", + "setup", + "uninstall", + "update", + "whatsapp", + "whatsapp-cloud", + } + if first in blocked_top: + return f"`hermes {first}` is not available in Hermes Console." + blocked_pairs = { + ("config", "edit"): "`config edit` opens an editor and is not available in Hermes Console.", + ("mcp", "serve"): "`mcp serve` starts a server and is not available in Hermes Console.", + ("profile", "alias"): "`profile alias` creates shell wrappers and is not available in Hermes Console.", + ("skills", "config"): "`skills config` is interactive and is not available in Hermes Console.", + ("skills", "publish"): "`skills publish` is not available in Hermes Console.", + ("portal", "login"): "`portal login` is interactive and is not available in Hermes Console.", + ("portal", "open"): "`portal open` opens a browser and is not available in Hermes Console.", + ("kanban", "tail"): "`kanban tail` streams output and is not available in Hermes Console.", + ("kanban", "watch"): "`kanban watch` streams output and is not available in Hermes Console.", + ("kanban", "daemon"): "`kanban daemon` starts a service and is not available in Hermes Console.", + ("kanban", "dispatcher"): "`kanban dispatcher` starts a worker and is not available in Hermes Console.", + ("kanban", "swarm"): "`kanban swarm` starts agent work and is not available in Hermes Console.", + ("kanban", "decompose"): "`kanban decompose` starts agent work and is not available in Hermes Console.", + ("kanban", "specify"): "`kanban specify` starts agent work and is not available in Hermes Console.", + ("kanban", "gc"): "`kanban gc` is not available in Hermes Console.", + } + if len(tokens) >= 2: + pair = (tokens[0], tokens[1]) + if pair in blocked_pairs: + return blocked_pairs[pair] + if tuple(tokens[:2]) in {("sessions", "delete"), ("sessions", "prune")}: + return "`sessions delete` and `sessions prune` are not available in Hermes Console." + return "" + + def _help_result(self) -> ConsoleResult: + return ConsoleResult("ok", output=self.help_text()) + + def _cap_output(self, output: str) -> str: + if len(output) <= self.output_limit: + return output + omitted = len(output) - self.output_limit + return f"{output[:self.output_limit]}\n... output truncated ({omitted} bytes omitted)" + + +def _expect_no_args(args: Sequence[str], usage: str) -> None: + if args: + raise ConsoleCommandError(f"Usage: {usage}") + + +HOSTED_CONFIG_ALLOWED_PREFIXES = ( + "display.", + "ui.", + "tts.", + "voice.", + "speech.", + "sessions.", + "cron.", +) +HOSTED_CONFIG_ALLOWED_KEYS = { + "display.interface", +} +HOSTED_CONFIG_BLOCKED_PREFIXES = ( + "auth.", + "dashboard.", + "gateway.", + "managed.", + "model.", + "portal.", + "provider.", + "providers.", + "tool_gateway.", + "custom_providers.", + "mcp_servers.", +) +HOSTED_CONFIG_BLOCKED_NAMES = { + "portal_url", + "portal.url", + "portal.base_url", + "inference_url", + "inference.url", + "inference.base_url", + "nous.portal_url", + "nous.inference_url", + "openrouter_api_key", + "openai_api_key", + "anthropic_api_key", +} + + +def _flag_present(args: Sequence[str], flag: str) -> bool: + return any(arg == flag or arg.startswith(f"{flag}=") for arg in args) + + +def _flag_value(args: Sequence[str], flag: str) -> str | None: + for index, arg in enumerate(args): + if arg == flag: + if index + 1 < len(args): + return args[index + 1] + return "" + prefix = f"{flag}=" + if arg.startswith(prefix): + return arg[len(prefix) :] + return None + + +def _hosted_config_key_allowed(key: str) -> bool: + normalized = key.strip().lower() + if normalized in HOSTED_CONFIG_BLOCKED_NAMES: + return False + if normalized.startswith(HOSTED_CONFIG_BLOCKED_PREFIXES): + return False + return normalized in HOSTED_CONFIG_ALLOWED_KEYS or normalized.startswith( + HOSTED_CONFIG_ALLOWED_PREFIXES + ) + + +def _enforce_hosted_line_policy(path: tuple[str, ...], args: Sequence[str]) -> None: + if path == ("config", "set"): + key = args[0] if args else "" + if key and not _hosted_config_key_allowed(key): + raise ConsoleCommandError( + f"`config set {key}` is not available in hosted Hermes Console. " + "Use the dashboard setting for hosted account/provider changes." + ) + return + + if path == ("mcp", "add"): + if _flag_present(args, "--command") or _flag_present(args, "--args"): + raise ConsoleCommandError( + "Hosted Hermes Console does not add stdio MCP servers. " + "Use catalog install or an HTTP/SSE URL." + ) + if _flag_present(args, "--preset"): + raise ConsoleCommandError( + "Hosted Hermes Console does not add MCP presets directly. " + "Use `mcp install <catalog-name>`." + ) + url = _flag_value(args, "--url") + if not url: + raise ConsoleCommandError( + "Hosted Hermes Console requires `mcp add` to use --url with " + "an HTTP/SSE endpoint." + ) + scheme = urlparse(url).scheme.lower() + if scheme not in {"http", "https"}: + raise ConsoleCommandError( + "Hosted Hermes Console only accepts http:// or https:// MCP URLs." + ) + return + + if path in {("cron", "create"), ("cron", "edit")}: + for flag in ("--script", "--no-agent", "--workdir"): + if _flag_present(args, flag): + raise ConsoleCommandError( + f"`cron {' '.join(path[1:])} {flag}` is not available in " + "hosted Hermes Console." + ) + + +def _apply_confirmed_defaults(args: argparse.Namespace, context: ConsoleContext) -> None: + """Skip nested prompts after the console-level confirmation has happened.""" + + for attr in ("yes",): + if hasattr(args, attr): + setattr(args, attr, True) + if getattr(args, "_console_command", None) == "import": + setattr(args, "force", True) + if getattr(args, "checkpoints_command", None) in {"clear", "clear-legacy"}: + setattr(args, "force", True) + if getattr(args, "plugins_action", None) == "install": + if not getattr(args, "enable", False) and not getattr(args, "no_enable", False): + setattr(args, "no_enable", True) + if getattr(args, "auth_action", None) == "add": + auth_type = getattr(args, "auth_type", None) + if auth_type in {"api-key", "api_key"} and not getattr(args, "api_key", None): + raise ConsoleCommandError("auth add --type api-key requires --api-key in Hermes Console.") + if getattr(args, "import_name", None) is not None: + # profile import has no prompt flag; leave it alone. + return + if getattr(args, "skills_action", None) in { + "install", + "reset", + "opt-out", + "repair-official", + }: + setattr(args, "yes", True) + if getattr(args, "memory_command", None) == "reset": + setattr(args, "yes", True) + + +def _status(_engine: HermesConsoleEngine, args: list[str]) -> str: + _expect_no_args(args, "status") + from types import SimpleNamespace + + from hermes_cli.status import show_status + + return _capture_output(lambda: show_status(SimpleNamespace(all=False, deep=False))) + + +def _doctor(_engine: HermesConsoleEngine, args: list[str]) -> str: + _expect_no_args(args, "doctor") + from types import SimpleNamespace + + from hermes_cli.doctor import run_doctor + + return _capture_output(lambda: run_doctor(SimpleNamespace(fix=False, ack=None))) + + +def _logs(_engine: HermesConsoleEngine, args: list[str]) -> str: + if "-f" in args or "--follow" in args: + raise ConsoleCommandError("`logs -f` is not available in Hermes Console.") + parser = _ArgumentParser(prog="logs", add_help=False) + parser.add_argument("log_name", nargs="?", default="agent") + parser.add_argument("-n", "--lines", type=int, default=50) + parser.add_argument("--level") + parser.add_argument("--session") + parser.add_argument("--since") + parser.add_argument("--component") + ns = parser.parse_args(args) + if ns.lines < 1 or ns.lines > 500: + raise ConsoleCommandError("logs --lines must be between 1 and 500") + + from hermes_cli.logs import list_logs, tail_log + + if ns.log_name == "list": + return _capture_output(list_logs) + return _capture_output( + lambda: tail_log( + ns.log_name, + num_lines=ns.lines, + follow=False, + level=ns.level, + session=ns.session, + since=ns.since, + component=ns.component, + ) + ) + + +def _sessions_list(_engine: HermesConsoleEngine, args: list[str]) -> str: + parser = _ArgumentParser(prog="sessions list", add_help=False) + parser.add_argument("--limit", type=int, default=20) + ns = parser.parse_args(args) + if ns.limit < 1 or ns.limit > 200: + raise ConsoleCommandError("sessions list --limit must be between 1 and 200") + + from hermes_state import SessionDB + + db = SessionDB() + try: + sessions = db.list_sessions_rich( + exclude_sources=["tool"], + limit=ns.limit, + order_by_last_active=True, + ) + finally: + db.close() + return _format_sessions(sessions) + + +def _sessions_stats(_engine: HermesConsoleEngine, args: list[str]) -> str: + _expect_no_args(args, "sessions stats") + from hermes_state import SessionDB + + db = SessionDB() + try: + total = db.session_count() + listable = db.session_count(exclude_children=True, exclude_sources=["tool"]) + messages = db.message_count() + lines = [ + f"Total sessions: {total}", + f"Listable sessions: {listable}", + f"Total messages: {messages}", + ] + for source in ["cli", "tui", "telegram", "discord", "slack", "cron"]: + count = db.session_count(source=source) + if count: + lines.append(f" {source}: {count}") + return "\n".join(lines) + finally: + db.close() + + +def _config_show(_engine: HermesConsoleEngine, args: list[str]) -> str: + _expect_no_args(args, "config show") + from hermes_cli.config import show_config + + return _capture_output(show_config) + + +def _config_path(_engine: HermesConsoleEngine, args: list[str]) -> str: + _expect_no_args(args, "config path") + from hermes_cli.config import get_config_path + + return str(get_config_path()) + + +def _config_set(_engine: HermesConsoleEngine, args: list[str]) -> str: + if len(args) < 2: + raise ConsoleCommandError("Usage: config set <key> <value>") + key = args[0] + value = " ".join(args[1:]) + from hermes_cli.config import set_config_value + + return _capture_output(lambda: set_config_value(key, value)) + + +def _config_migrate(_engine: HermesConsoleEngine, args: list[str]) -> str: + _expect_no_args(args, "config migrate") + + def _run() -> None: + from hermes_cli.config import migrate_config + + results = migrate_config(interactive=False, quiet=False) + if results.get("env_added") or results.get("config_added"): + print("Configuration updated.") + else: + print("Configuration is up to date.") + warnings = results.get("warnings") or [] + for warning in warnings: + print(f"Warning: {warning}") + + return _capture_output(_run) + + +def _sessions_export(_engine: HermesConsoleEngine, args: list[str]) -> str: + parser = _ArgumentParser(prog="sessions export", add_help=False) + parser.add_argument("output") + parser.add_argument("--source") + parser.add_argument("--session-id") + ns = parser.parse_args(args) + + def _run() -> None: + from hermes_state import SessionDB + + db = SessionDB() + try: + if ns.session_id: + resolved_session_id = db.resolve_session_id(ns.session_id) + if not resolved_session_id: + raise ConsoleCommandError(f"Session '{ns.session_id}' not found.") + data = db.export_session(resolved_session_id) + if not data: + raise ConsoleCommandError(f"Session '{ns.session_id}' not found.") + rows = [data] + else: + rows = db.export_all(source=ns.source) + + lines = [json.dumps(row, ensure_ascii=False) for row in rows] + text = "\n".join(lines) + if text: + text += "\n" + if ns.output == "-": + sys.stdout.write(text) + else: + Path(ns.output).expanduser().write_text(text, encoding="utf-8") + print(f"Exported {len(rows)} session(s) to {ns.output}") + finally: + db.close() + + return _capture_output(_run) + + +def _sessions_rename(_engine: HermesConsoleEngine, args: list[str]) -> str: + parser = _ArgumentParser(prog="sessions rename", add_help=False) + parser.add_argument("session_id") + parser.add_argument("title", nargs="+") + ns = parser.parse_args(args) + + def _run() -> None: + from hermes_state import SessionDB + + db = SessionDB() + try: + resolved_session_id = db.resolve_session_id(ns.session_id) + if not resolved_session_id: + raise ConsoleCommandError(f"Session '{ns.session_id}' not found.") + title = " ".join(ns.title) + if not db.set_session_title(resolved_session_id, title): + raise ConsoleCommandError(f"Session '{ns.session_id}' not found.") + print(f"Session '{resolved_session_id}' renamed to: {title}") + finally: + db.close() + + return _capture_output(_run) + + +def _sessions_optimize(_engine: HermesConsoleEngine, args: list[str]) -> str: + _expect_no_args(args, "sessions optimize") + + def _run() -> None: + from hermes_state import SessionDB + + db = SessionDB() + try: + count = db.vacuum() + print(f"Optimized {count} FTS index(es).") + finally: + db.close() + + return _capture_output(_run) + + +def _sessions_repair(_engine: HermesConsoleEngine, args: list[str]) -> str: + parser = _ArgumentParser(prog="sessions repair", add_help=False) + parser.add_argument("--check-only", action="store_true") + parser.add_argument("--no-backup", action="store_true") + ns = parser.parse_args(args) + + def _run() -> None: + from hermes_state import DEFAULT_DB_PATH, _db_opens_cleanly, repair_state_db_schema + + db_path = DEFAULT_DB_PATH + if not db_path.exists(): + print(f"No session database at {db_path} (nothing to repair).") + return + reason = _db_opens_cleanly(db_path) + if reason is None: + print(f"{db_path} opens cleanly; no repair needed.") + return + print(f"{db_path} does not open cleanly: {reason}") + if ns.check_only: + return + report = repair_state_db_schema(db_path, backup=not ns.no_backup) + if report.get("repaired"): + if report.get("backup_path"): + print(f"backup: {report['backup_path']}") + print(f"strategy: {report.get('strategy')}") + print("Repaired session database.") + return + raise ConsoleCommandError(f"Repair failed: {report.get('error')}") + + return _capture_output(_run) + + +def _profile_status(_engine: HermesConsoleEngine, args: list[str]) -> str: + _expect_no_args(args, "profile") + return _dispatch_extracted_subcommand( + root="profile", + fixed=(), + args=(), + module_name="hermes_cli.subcommands.profile", + builder_name="build_profile_parser", + main_handler_name="cmd_profile", + console_context=_engine.context, + ) + + +def _cron_list(_engine: HermesConsoleEngine, args: list[str]) -> str: + parser = _ArgumentParser(prog="cron list", add_help=False) + parser.add_argument("--all", action="store_true") + ns = parser.parse_args(args) + from hermes_cli.cron import cron_list + + return _capture_output(lambda: cron_list(show_all=ns.all)) + + +def _cron_status(_engine: HermesConsoleEngine, args: list[str]) -> str: + _expect_no_args(args, "cron status") + from hermes_cli.cron import cron_status + + return _capture_output(cron_status) + + +def _cron_pause(_engine: HermesConsoleEngine, args: list[str]) -> str: + if len(args) != 1: + raise ConsoleCommandError("Usage: cron pause <job>") + from cron.jobs import AmbiguousJobReference, pause_job + + try: + job = pause_job(args[0], reason="paused from hermes console") + except AmbiguousJobReference as exc: + raise ConsoleCommandError(str(exc)) from exc + if not job: + raise ConsoleCommandError(f"Job not found: {args[0]}") + return _format_job(job, "Paused") + + +def _cron_resume(_engine: HermesConsoleEngine, args: list[str]) -> str: + if len(args) != 1: + raise ConsoleCommandError("Usage: cron resume <job>") + from cron.jobs import AmbiguousJobReference, resume_job + + try: + job = resume_job(args[0]) + except AmbiguousJobReference as exc: + raise ConsoleCommandError(str(exc)) from exc + if not job: + raise ConsoleCommandError(f"Job not found: {args[0]}") + return _format_job(job, "Resumed") + + +def _cron_run(_engine: HermesConsoleEngine, args: list[str]) -> str: + if len(args) != 1: + raise ConsoleCommandError("Usage: cron run <job>") + from cron.jobs import AmbiguousJobReference, trigger_job + + try: + job = trigger_job(args[0]) + except AmbiguousJobReference as exc: + raise ConsoleCommandError(str(exc)) from exc + if not job: + raise ConsoleCommandError(f"Job not found: {args[0]}") + return _format_job(job, "Triggered") + + +def run_console_repl( + *, + stdin=None, + stdout=None, + stderr=None, + interactive: bool | None = None, +) -> int: + """Run the local ``hermes console`` REPL.""" + + stdin = stdin or sys.stdin + stdout = stdout or sys.stdout + stderr = stderr or sys.stderr + if interactive is None: + interactive = bool(getattr(stdin, "isatty", lambda: False)()) + + engine = HermesConsoleEngine() + if interactive: + print("Hermes Console. Type `help` for commands, `exit` to quit.", file=stdout) + + while True: + if interactive: + print("hermes> ", end="", file=stdout, flush=True) + line = stdin.readline() + if line == "": + if interactive: + print(file=stdout) + return 0 + + result = engine.execute(line) + if result.status == "confirm_required": + if not interactive: + print( + f"Confirmation required: {result.confirmation_message}", + file=stderr, + ) + return 1 + print(f"{result.confirmation_message} [y/N] ", end="", file=stdout, flush=True) + answer = stdin.readline() + if answer.strip().lower() not in {"y", "yes"}: + print("Cancelled.", file=stdout) + continue + result = engine.execute(result.command, confirmed=True) + + if result.output: + stream = stderr if result.status == "error" else stdout + print(result.output, file=stream) + if result.status == "exit": + return 0 diff --git a/hermes_cli/main.py b/hermes_cli/main.py index 4400ee9a2..4e483d318 100644 --- a/hermes_cli/main.py +++ b/hermes_cli/main.py @@ -287,6 +287,7 @@ from hermes_cli.subcommands.debug import build_debug_parser from hermes_cli.subcommands.backup import build_backup_parser from hermes_cli.subcommands.import_cmd import build_import_cmd_parser from hermes_cli.subcommands.config import build_config_parser +from hermes_cli.subcommands.console import build_console_parser from hermes_cli.subcommands.version import build_version_parser from hermes_cli.subcommands.update import build_update_parser from hermes_cli.subcommands.uninstall import build_uninstall_parser @@ -12150,6 +12151,13 @@ def cmd_logs(args): ) +def cmd_console(args): + """Open the safe Hermes command console.""" + from hermes_cli.console_engine import run_console_repl + + return run_console_repl() + + def _build_provider_choices() -> list[str]: """Build the --provider choices list from CANONICAL_PROVIDERS + 'auto'.""" try: @@ -12179,7 +12187,7 @@ _BUILTIN_SUBCOMMANDS = frozenset( { "acp", "auth", "backup", "bundles", "checkpoints", "claw", "completion", "computer-use", - "config", "cron", "curator", "dashboard", "serve", "debug", "doctor", + "config", "console", "cron", "curator", "dashboard", "serve", "debug", "doctor", "dump", "fallback", "gateway", "hooks", "import", "insights", "gui", "desktop", "kanban", "login", "logout", "logs", "lsp", "mcp", "memory", "migrate", "moa", "journey", "memory-graph", "learning", @@ -13002,6 +13010,11 @@ def main(): # ========================================================================= build_config_parser(subparsers, cmd_config=cmd_config) + # ========================================================================= + # console command (parser built in hermes_cli/subcommands/console.py) + # ========================================================================= + build_console_parser(subparsers, cmd_console=cmd_console) + # ========================================================================= # pairing command (parser built in hermes_cli/subcommands/pairing.py) # ========================================================================= diff --git a/hermes_cli/subcommands/console.py b/hermes_cli/subcommands/console.py new file mode 100644 index 000000000..f952e3706 --- /dev/null +++ b/hermes_cli/subcommands/console.py @@ -0,0 +1,18 @@ +"""``hermes console`` subcommand parser.""" + +from __future__ import annotations + +from typing import Callable + + +def build_console_parser(subparsers, *, cmd_console: Callable) -> None: + """Attach the safe Hermes Console REPL subcommand.""" + console_parser = subparsers.add_parser( + "console", + help="Open the safe Hermes command console", + description=( + "Open a curated Hermes command REPL. This is not a raw shell and " + "does not expose the full Hermes CLI." + ), + ) + console_parser.set_defaults(func=cmd_console) diff --git a/tests/hermes_cli/test_console_engine.py b/tests/hermes_cli/test_console_engine.py new file mode 100644 index 000000000..9f9a835e1 --- /dev/null +++ b/tests/hermes_cli/test_console_engine.py @@ -0,0 +1,593 @@ +from __future__ import annotations + +import io +import sys +from pathlib import Path + +import pytest + +from hermes_cli.console_engine import HermesConsoleEngine, run_console_repl + + +EXPECTED_CONSOLE_COMMANDS = { + ("status",), + ("doctor",), + ("logs",), + ("version",), + ("dump",), + ("debug", "share"), + ("debug", "delete"), + ("prompt-size",), + ("insights",), + ("security", "audit"), + ("portal", "info"), + ("portal", "tools"), + ("backup",), + ("import",), + ("send",), + ("config", "show"), + ("config", "path"), + ("config", "env-path"), + ("config", "check"), + ("config", "migrate"), + ("config", "set"), + ("sessions", "list"), + ("sessions", "stats"), + ("sessions", "export"), + ("sessions", "rename"), + ("sessions", "optimize"), + ("sessions", "repair"), + ("cron", "list"), + ("cron", "status"), + ("cron", "create"), + ("cron", "edit"), + ("cron", "pause"), + ("cron", "resume"), + ("cron", "run"), + ("cron", "remove"), + ("cron", "tick"), + ("profile",), + ("profile", "list"), + ("profile", "show"), + ("profile", "info"), + ("profile", "create"), + ("profile", "use"), + ("profile", "describe"), + ("profile", "rename"), + ("profile", "delete"), + ("profile", "export"), + ("profile", "import"), + ("profile", "install"), + ("profile", "update"), + ("tools", "list"), + ("tools", "enable"), + ("tools", "disable"), + ("tools", "post-setup"), + ("plugins", "list"), + ("plugins", "enable"), + ("plugins", "disable"), + ("plugins", "install"), + ("plugins", "update"), + ("plugins", "remove"), + ("skills", "browse"), + ("skills", "search"), + ("skills", "inspect"), + ("skills", "list"), + ("skills", "check"), + ("skills", "list-modified"), + ("skills", "diff"), + ("skills", "install"), + ("skills", "update"), + ("skills", "audit"), + ("skills", "uninstall"), + ("skills", "reset"), + ("skills", "opt-in"), + ("skills", "opt-out"), + ("skills", "repair-official"), + ("skills", "snapshot", "export"), + ("skills", "snapshot", "import"), + ("skills", "tap", "list"), + ("skills", "tap", "add"), + ("skills", "tap", "remove"), + ("mcp", "list"), + ("mcp", "catalog"), + ("mcp", "test"), + ("mcp", "add"), + ("mcp", "remove"), + ("mcp", "install"), + ("mcp", "login"), + ("mcp", "reauth"), + ("mcp", "configure"), + ("mcp", "picker"), + ("memory", "status"), + ("memory", "off"), + ("memory", "reset"), + ("auth", "list"), + ("auth", "status"), + ("auth", "reset"), + ("auth", "add"), + ("auth", "remove"), + ("auth", "logout"), + ("auth", "spotify", "status"), + ("auth", "spotify", "login"), + ("auth", "spotify", "logout"), + ("pairing", "list"), + ("pairing", "approve"), + ("pairing", "revoke"), + ("pairing", "clear-pending"), + ("webhook", "list"), + ("webhook", "subscribe"), + ("webhook", "remove"), + ("webhook", "test"), + ("hooks", "list"), + ("hooks", "test"), + ("hooks", "doctor"), + ("hooks", "revoke"), + ("slack", "manifest"), + ("project", "list"), + ("project", "show"), + ("project", "create"), + ("project", "add-folder"), + ("project", "remove-folder"), + ("project", "rename"), + ("project", "set-primary"), + ("project", "use"), + ("project", "archive"), + ("project", "restore"), + ("project", "bind-board"), + ("kanban", "init"), + ("kanban", "boards", "list"), + ("kanban", "boards", "create"), + ("kanban", "boards", "rm"), + ("kanban", "boards", "switch"), + ("kanban", "boards", "current"), + ("kanban", "boards", "rename"), + ("kanban", "boards", "set-workdir"), + ("kanban", "create"), + ("kanban", "list"), + ("kanban", "show"), + ("kanban", "assign"), + ("kanban", "reclaim"), + ("kanban", "reassign"), + ("kanban", "diagnose"), + ("kanban", "link"), + ("kanban", "unlink"), + ("kanban", "claim"), + ("kanban", "comment"), + ("kanban", "complete"), + ("kanban", "edit"), + ("kanban", "block"), + ("kanban", "schedule"), + ("kanban", "unblock"), + ("kanban", "promote"), + ("kanban", "archive"), + ("kanban", "stats"), + ("kanban", "runs"), + ("kanban", "heartbeat"), + ("kanban", "assignments"), + ("kanban", "context"), + ("bundles", "list"), + ("bundles", "show"), + ("bundles", "create"), + ("bundles", "delete"), + ("bundles", "reload"), + ("checkpoints", "status"), + ("checkpoints", "list"), + ("checkpoints", "prune"), + ("checkpoints", "clear"), + ("checkpoints", "clear-legacy"), + ("curator", "status"), + ("curator", "run"), + ("curator", "pause"), + ("curator", "resume"), + ("curator", "pin"), + ("curator", "unpin"), + ("curator", "restore"), + ("curator", "list-archived"), + ("curator", "archive"), + ("curator", "prune"), + ("curator", "backup"), + ("curator", "rollback"), + ("pets", "list"), + ("pets", "install"), + ("pets", "select"), + ("pets", "show"), + ("pets", "off"), + ("pets", "scale"), + ("pets", "remove"), + ("pets", "doctor"), +} + + +MUTATING_CONFIRMATION_SMOKE_COMMANDS = [ + "config set console.test true", + "config migrate", + "sessions rename abc123 new title", + "sessions optimize", + "cron create 'every 1h' 'say hello'", + "cron remove abc123", + "profile create tester --no-alias --no-skills", + "profile delete tester", + "tools disable web", + "plugins install owner/repo --no-enable", + "skills install openai/skills/example", + "mcp add demo --url https://example.com/sse", + "mcp configure github", + "mcp picker", + "backup --quick -o /tmp/hermes-console-test.zip", + "import /tmp/hermes-console-test.zip", + "send --to telegram hello", + "memory reset --target memory", + "auth remove openrouter 1", + "pairing approve abc123", + "webhook subscribe test --prompt hello", + "hooks test pre_tool_call", + "project create demo", + "kanban create 'demo task'", + "bundles create demo --skill skill-a", + "checkpoints prune", + "curator pause", + "pets install cat", +] + + +def test_console_parses_bare_and_hermes_prefixed_commands(_isolate_hermes_home): + engine = HermesConsoleEngine() + + bare = engine.execute("config path") + prefixed = engine.execute("hermes config path") + + assert bare.status == "ok" + assert prefixed.status == "ok" + assert bare.output == prefixed.output + assert bare.output.endswith("config.yaml") + + +def test_console_registry_covers_non_admin_cli_surface(): + registered = set(HermesConsoleEngine().commands) + + missing = EXPECTED_CONSOLE_COMMANDS - registered + + assert missing == set() + + +EXPECTED_HOSTED_CONSOLE_COMMANDS = { + ("status",), + ("doctor",), + ("logs",), + ("version",), + ("prompt-size",), + ("insights",), + ("security", "audit"), + ("portal", "info"), + ("portal", "tools"), + ("send",), + ("config", "show"), + ("config", "path"), + ("config", "env-path"), + ("config", "check"), + ("config", "migrate"), + ("config", "set"), + ("sessions", "list"), + ("sessions", "stats"), + ("sessions", "export"), + ("sessions", "rename"), + ("sessions", "optimize"), + ("sessions", "repair"), + ("cron", "list"), + ("cron", "status"), + ("cron", "create"), + ("cron", "edit"), + ("cron", "pause"), + ("cron", "resume"), + ("cron", "run"), + ("cron", "remove"), + ("cron", "tick"), + ("profile",), + ("profile", "list"), + ("profile", "show"), + ("profile", "info"), + ("tools", "list"), + ("tools", "enable"), + ("tools", "disable"), + ("tools", "post-setup"), + ("skills", "browse"), + ("skills", "search"), + ("skills", "inspect"), + ("skills", "list"), + ("skills", "check"), + ("skills", "list-modified"), + ("skills", "diff"), + ("skills", "install"), + ("skills", "update"), + ("skills", "audit"), + ("skills", "uninstall"), + ("skills", "reset"), + ("skills", "opt-in"), + ("skills", "opt-out"), + ("skills", "repair-official"), + ("skills", "snapshot", "export"), + ("skills", "tap", "list"), + ("mcp", "list"), + ("mcp", "catalog"), + ("mcp", "test"), + ("mcp", "add"), + ("mcp", "remove"), + ("mcp", "install"), + ("mcp", "login"), + ("mcp", "reauth"), + ("mcp", "configure"), + ("mcp", "picker"), + ("memory", "status"), + ("auth", "list"), + ("auth", "status"), + ("auth", "reset"), + ("auth", "spotify", "status"), + ("pairing", "list"), + ("pairing", "approve"), + ("pairing", "revoke"), + ("pairing", "clear-pending"), + ("webhook", "list"), + ("webhook", "subscribe"), + ("webhook", "remove"), + ("webhook", "test"), +} + + +def test_hosted_console_registry_exposes_only_hosted_safe_surface(): + engine = HermesConsoleEngine(context="hosted") + hosted = { + path for path, command in engine.commands.items() if "hosted" in command.contexts + } + + assert hosted == EXPECTED_HOSTED_CONSOLE_COMMANDS + + +@pytest.mark.parametrize( + "line", + [ + "portal login", + "auth add nous --type oauth", + "auth logout nous", + "profile create tester", + "profile use default", + "plugins list", + "plugins install owner/repo", + "kanban list", + "hooks list", + "checkpoints clear", + "curator pause", + "pets install cat", + "backup --quick", + "import /tmp/hermes-console-test.zip", + "mcp serve", + "model", + "setup", + "dashboard", + "gateway restart", + "update", + "uninstall", + ], +) +def test_hosted_console_rejects_local_only_or_dangerous_commands(line): + result = HermesConsoleEngine(context="hosted").execute(line) + + assert result.status == "error" + assert result.output + + +@pytest.mark.parametrize( + "line", + [ + "mcp add demo --url https://example.com/sse", + "mcp install n8n", + "mcp configure github", + "mcp picker", + "config set display.interface cli", + "cron create 'every 1h' 'say hello'", + ], +) +def test_hosted_console_allows_guarded_useful_commands_before_confirmation(line): + result = HermesConsoleEngine(context="hosted").execute(line) + + assert result.status == "confirm_required" + + +@pytest.mark.parametrize( + "line", + [ + "mcp add local --command npx --args foo", + "mcp add local --preset unsafe", + "mcp add local --url file:///tmp/server", + "config set model.provider openrouter", + "config set portal.url https://evil.example", + "cron create 'every 1h' 'say hello' --script scripts/ping.py", + "cron create 'every 1h' 'say hello' --no-agent", + "cron edit abc123 --workdir /tmp/project", + ], +) +def test_hosted_console_blocks_known_footgun_arguments_before_confirmation(line): + result = HermesConsoleEngine(context="hosted").execute(line) + + assert result.status == "error" + assert result.output + + +@pytest.mark.parametrize( + "line", + [ + "sessions delete abc123", + "sessions prune --older-than 1", + "chat", + "--cli", + "--tui", + "oneshot hello", + "model", + "setup", + "postinstall", + "fallback add", + "moa configure", + "claw migrate", + "gateway restart", + "gateway start", + "gateway stop", + "dashboard", + "serve", + "proxy start", + "mcp serve", + "skills config", + "skills publish ./skill", + "completion bash", + "acp", + "update", + "uninstall", + "gui", + "desktop", + "login", + "logout", + "--tui", + "logs | cat", + "config show > out.txt", + ], +) +def test_console_rejects_destructive_and_shell_like_commands(line): + result = HermesConsoleEngine().execute(line) + + assert result.status == "error" + assert result.output + + +@pytest.mark.parametrize("line", MUTATING_CONFIRMATION_SMOKE_COMMANDS) +def test_mutating_console_commands_require_confirmation(line): + result = HermesConsoleEngine().execute(line) + + assert result.status == "confirm_required" + assert result.confirmation_message + + +def test_help_lists_supported_commands_and_not_full_cli(): + result = HermesConsoleEngine().execute("help") + + assert result.status == "ok" + assert "sessions list" in result.output + assert "config set" in result.output + assert "dashboard" not in result.output + assert "gateway restart" not in result.output + + +def test_config_set_requires_confirmation_then_writes(_isolate_hermes_home): + engine = HermesConsoleEngine() + + pending = engine.execute("config set console.test true") + assert pending.status == "confirm_required" + + from hermes_cli.config import read_raw_config + + assert read_raw_config() == {} + + result = engine.execute("config set console.test true", confirmed=True) + + assert result.status == "ok" + assert "console.test" in result.output + assert read_raw_config()["console"]["test"] is True + + +def test_sessions_list_and_stats_use_isolated_session_store(_isolate_hermes_home): + from hermes_state import SessionDB + + db = SessionDB() + try: + db.create_session("chat-session", source="cli", model="test/model") + db.create_session("tool-session", source="tool", model="test/model") + finally: + db.close() + + engine = HermesConsoleEngine() + listed = engine.execute("sessions list --limit 10") + stats = engine.execute("sessions stats") + + assert listed.status == "ok" + assert "chat-session" in listed.output + assert "tool-session" not in listed.output + assert "Total sessions: 2" in stats.output + assert "Listable sessions: 1" in stats.output + + +def test_cron_pause_resume_and_run_require_confirmation(_isolate_hermes_home): + from cron.jobs import create_job, get_job + + job = create_job(prompt="say hello", schedule="every 1h", name="alpha") + engine = HermesConsoleEngine() + + pending = engine.execute(f"cron pause {job['id']}") + assert pending.status == "confirm_required" + stored = get_job(job["id"]) + assert stored is not None + assert stored["state"] == "scheduled" + + paused = engine.execute(f"cron pause {job['id']}", confirmed=True) + assert paused.status == "ok" + stored = get_job(job["id"]) + assert stored is not None + assert stored["state"] == "paused" + + resumed = engine.execute("cron resume alpha", confirmed=True) + assert resumed.status == "ok" + stored = get_job(job["id"]) + assert stored is not None + assert stored["state"] == "scheduled" + + triggered = engine.execute("cron run alpha", confirmed=True) + assert triggered.status == "ok" + assert "Triggered job" in triggered.output + + +def test_repl_runs_non_interactive_lines_without_prompts(_isolate_hermes_home): + stdin = io.StringIO("help\nexit\n") + stdout = io.StringIO() + stderr = io.StringIO() + + code = run_console_repl( + stdin=stdin, + stdout=stdout, + stderr=stderr, + interactive=False, + ) + + assert code == 0 + assert "Hermes Console" in stdout.getvalue() + assert "hermes>" not in stdout.getvalue() + assert stderr.getvalue() == "" + + +def test_repl_refuses_non_interactive_confirmation(_isolate_hermes_home): + stdin = io.StringIO("config set console.test true\n") + stdout = io.StringIO() + stderr = io.StringIO() + + code = run_console_repl( + stdin=stdin, + stdout=stdout, + stderr=stderr, + interactive=False, + ) + + assert code == 1 + assert "Confirmation required" in stderr.getvalue() + + +def test_main_console_subcommand_smoke(_isolate_hermes_home): + import subprocess + + result = subprocess.run( + [sys.executable, "-m", "hermes_cli.main", "console"], + cwd=Path(__file__).resolve().parents[2], + input="help\nexit\n", + text=True, + capture_output=True, + timeout=20, + check=False, + ) + + assert result.returncode == 0 + assert "Hermes Console" in result.stdout From 4493bba90100455cfbd90591979de54de4012556 Mon Sep 17 00:00:00 2001 From: Shannon Sands <shannon.sands.1979@gmail.com> Date: Tue, 30 Jun 2026 16:05:52 +1000 Subject: [PATCH 40/46] Add dashboard Hermes console websocket --- hermes_cli/dashboard_auth/routes.py | 3 +- hermes_cli/web_server.py | 542 ++++++++++++++++++ .../hermes_cli/test_dashboard_auth_ws_auth.py | 15 +- .../hermes_cli/test_web_server_console_ws.py | 134 +++++ 4 files changed, 686 insertions(+), 8 deletions(-) create mode 100644 tests/hermes_cli/test_web_server_console_ws.py diff --git a/hermes_cli/dashboard_auth/routes.py b/hermes_cli/dashboard_auth/routes.py index 568a11957..9e80f2583 100644 --- a/hermes_cli/dashboard_auth/routes.py +++ b/hermes_cli/dashboard_auth/routes.py @@ -608,7 +608,8 @@ async def api_auth_ws_ticket(request: Request): Browsers cannot set ``Authorization`` on a WebSocket upgrade, so in gated mode the SPA POSTs this endpoint to get a ``?ticket=`` value to - append to ``/api/pty``, ``/api/ws``, ``/api/pub``, or ``/api/events``. + append to ``/api/pty``, ``/api/console``, ``/api/ws``, ``/api/pub``, or + ``/api/events``. The ticket has a 30-second TTL and is single-use. Calling this endpoint multiple times in quick succession (e.g. one ticket per WS) is the diff --git a/hermes_cli/web_server.py b/hermes_cli/web_server.py index f81353f6a..6c19c1868 100644 --- a/hermes_cli/web_server.py +++ b/hermes_cli/web_server.py @@ -12628,6 +12628,548 @@ def _ws_close_reason(text: str) -> str: return encoded[:120].decode("utf-8", "ignore") + "..." +# --------------------------------------------------------------------------- +# /api/console — safe Hermes Console command WebSocket. +# +# Unlike /api/pty, this endpoint never spawns a PTY, shell, or full Hermes CLI +# subprocess. It runs the curated console engine in-process and exchanges +# structured JSON frames with the dashboard xterm overlay. +# --------------------------------------------------------------------------- + +_CONSOLE_PROMPT = "hermes> " +_CONSOLE_COMMAND_TIMEOUT_SECONDS = 60.0 +_CONSOLE_OUTPUT_LIMIT = 50000 + + +def _dashboard_console_context() -> str: + """Choose local vs hosted command policy for the dashboard console.""" + return "hosted" if _default_hermes_root_is_opt_data() else "local" + + +def _console_profile_from_ws(ws: WebSocket) -> Optional[str]: + profile = (ws.query_params.get("profile") or "").strip() + return profile or None + + +def _execute_console_line( + engine: Any, + line: str, + *, + confirmed: bool, + profile: Optional[str], +) -> Any: + # _profile_scope swaps process-global skill module paths; keep it inside + # the worker thread and never hold it across awaits. + with _profile_scope(profile): + return engine.execute(line, confirmed=confirmed) + + +async def _console_send( + ws: WebSocket, + send_lock: asyncio.Lock, + payload: Dict[str, Any], +) -> None: + async with send_lock: + await ws.send_json(payload) + + +async def _console_send_result( + ws: WebSocket, + send_lock: asyncio.Lock, + result: Any, + *, + command_id: int, +) -> None: + command = result.command or "" + status = result.status + if status == "ok": + if result.output: + await _console_send( + ws, + send_lock, + { + "type": "output", + "id": command_id, + "stream": "stdout", + "data": result.output, + "command": command, + }, + ) + await _console_send( + ws, + send_lock, + { + "type": "complete", + "id": command_id, + "status": "ok", + "command": command, + "prompt": _CONSOLE_PROMPT, + }, + ) + return + + if status == "error": + await _console_send( + ws, + send_lock, + { + "type": "error", + "id": command_id, + "message": result.output or "Command failed.", + "command": command, + }, + ) + await _console_send( + ws, + send_lock, + { + "type": "complete", + "id": command_id, + "status": "error", + "command": command, + "prompt": _CONSOLE_PROMPT, + }, + ) + return + + if status == "confirm_required": + await _console_send( + ws, + send_lock, + { + "type": "confirm_required", + "id": command_id, + "command": command, + "message": result.confirmation_message or f"Run `{command}`?", + "prompt": _CONSOLE_PROMPT, + }, + ) + await _console_send( + ws, + send_lock, + { + "type": "complete", + "id": command_id, + "status": "confirm_required", + "command": command, + "prompt": _CONSOLE_PROMPT, + }, + ) + return + + if status == "clear": + await _console_send(ws, send_lock, {"type": "clear", "id": command_id}) + await _console_send( + ws, + send_lock, + { + "type": "complete", + "id": command_id, + "status": "clear", + "command": command, + "prompt": _CONSOLE_PROMPT, + }, + ) + return + + if status == "exit": + await _console_send( + ws, + send_lock, + { + "type": "complete", + "id": command_id, + "status": "exit", + "command": command, + "prompt": "", + }, + ) + return + + await _console_send( + ws, + send_lock, + { + "type": "error", + "id": command_id, + "message": f"Unknown console result status: {status}", + "command": command, + }, + ) + + +def _console_json_payload(msg: Any) -> tuple[Optional[dict[str, Any]], Optional[str]]: + raw: str | bytes | None = msg.get("text") + if raw is None: + raw = msg.get("bytes") + if raw is None: + return None, None + if isinstance(raw, bytes): + try: + raw = raw.decode("utf-8") + except UnicodeDecodeError: + return None, "Console frames must be UTF-8 JSON." + try: + payload = json.loads(raw) + except json.JSONDecodeError: + return None, "Console frames must be JSON objects." + if not isinstance(payload, dict): + return None, "Console frames must be JSON objects." + return payload, None + + +@app.websocket("/api/console") +async def console_ws(ws: WebSocket) -> None: + peer = ws.client.host if ws.client else "?" + + if not _DASHBOARD_EMBEDDED_CHAT_ENABLED: + _log.info("console refused: embedded chat disabled peer=%s", peer) + await ws.close(code=4404, reason="embedded chat disabled") + return + + auth_reason, cred = _ws_auth_reason(ws) + mode = _ws_auth_mode() + if auth_reason is not None: + _log.warning( + "console auth rejected reason=%s mode=%s cred=%s peer=%s", + auth_reason, mode, cred, peer, + ) + await ws.close(code=4401, reason=_ws_close_reason(f"auth: {auth_reason}")) + return + + host_origin_reason = _ws_host_origin_reason(ws) + if host_origin_reason is not None: + _log.warning("console refused: %s peer=%s", host_origin_reason, peer) + await ws.close(code=4403, reason=_ws_close_reason(host_origin_reason)) + return + + client_reason = _ws_client_reason(ws) + if client_reason is not None: + _log.warning("console refused: %s", client_reason) + await ws.close(code=4408, reason=_ws_close_reason(client_reason)) + return + + await ws.accept() + + profile = _console_profile_from_ws(ws) + context = _dashboard_console_context() + send_lock = asyncio.Lock() + + try: + from hermes_cli.console_engine import HermesConsoleEngine + + engine = HermesConsoleEngine( + output_limit=_CONSOLE_OUTPUT_LIMIT, + context=context, # type: ignore[arg-type] + ) + if profile and profile.lower() != "current": + _resolve_profile_dir(profile) + except HTTPException as exc: + await _console_send( + ws, + send_lock, + { + "type": "error", + "message": str(exc.detail), + "prompt": "", + }, + ) + await ws.close(code=4400, reason=_ws_close_reason(str(exc.detail))) + return + except Exception as exc: + _log.exception("console failed to initialize") + await _console_send( + ws, + send_lock, + { + "type": "error", + "message": f"Console unavailable: {exc}", + "prompt": "", + }, + ) + await ws.close(code=1011) + return + + _log.info( + "console accepted peer=%s mode=%s cred=%s context=%s profile=%s", + peer, + mode, + cred, + context, + profile or "current", + ) + await _console_send( + ws, + send_lock, + { + "type": "ready", + "context": context, + "profile": profile or "current", + "prompt": _CONSOLE_PROMPT, + }, + ) + + active_task: asyncio.Task | None = None + pending_confirmation: Optional[str] = None + command_generation = 0 + + async def run_command(line: str, *, confirmed: bool, command_id: int) -> None: + nonlocal active_task, pending_confirmation, command_generation + try: + result = await asyncio.wait_for( + asyncio.to_thread( + _execute_console_line, + engine, + line, + confirmed=confirmed, + profile=profile, + ), + timeout=_CONSOLE_COMMAND_TIMEOUT_SECONDS, + ) + except asyncio.CancelledError: + raise + except asyncio.TimeoutError: + if command_id == command_generation: + pending_confirmation = None + await _console_send( + ws, + send_lock, + { + "type": "error", + "id": command_id, + "message": ( + "Command timed out. Hermes Console returned to the prompt." + ), + "command": line, + }, + ) + await _console_send( + ws, + send_lock, + { + "type": "complete", + "id": command_id, + "status": "timeout", + "command": line, + "prompt": _CONSOLE_PROMPT, + }, + ) + except Exception as exc: + if command_id == command_generation: + pending_confirmation = None + _log.exception("console command failed") + await _console_send( + ws, + send_lock, + { + "type": "error", + "id": command_id, + "message": str(exc) or exc.__class__.__name__, + "command": line, + }, + ) + await _console_send( + ws, + send_lock, + { + "type": "complete", + "id": command_id, + "status": "error", + "command": line, + "prompt": _CONSOLE_PROMPT, + }, + ) + else: + if command_id != command_generation: + return + pending_confirmation = ( + result.command if result.status == "confirm_required" else None + ) + await _console_send_result( + ws, + send_lock, + result, + command_id=command_id, + ) + if result.status == "exit": + await ws.close(code=1000) + finally: + if command_id == command_generation: + active_task = None + + async def start_command(line: str, *, confirmed: bool = False) -> None: + nonlocal active_task, command_generation + command_generation += 1 + command_id = command_generation + active_task = asyncio.create_task( + run_command(line, confirmed=confirmed, command_id=command_id) + ) + + try: + while True: + try: + msg = await ws.receive() + except RuntimeError: + break + msg_type = msg.get("type") + if msg_type == "websocket.disconnect": + break + + payload, error = _console_json_payload(msg) + if error: + await _console_send( + ws, + send_lock, + { + "type": "error", + "message": error, + "prompt": _CONSOLE_PROMPT, + }, + ) + continue + if payload is None: + continue + + frame_type = str(payload.get("type") or "").strip().lower() + if frame_type == "ping": + await _console_send( + ws, + send_lock, + { + "type": "pong", + "prompt": _CONSOLE_PROMPT, + }, + ) + continue + + if frame_type == "cancel": + if active_task and not active_task.done(): + command_generation += 1 + active_task.cancel() + active_task = None + pending_confirmation = None + await _console_send( + ws, + send_lock, + { + "type": "complete", + "status": "cancelled", + "prompt": _CONSOLE_PROMPT, + }, + ) + elif pending_confirmation: + pending_confirmation = None + await _console_send( + ws, + send_lock, + { + "type": "complete", + "status": "cancelled", + "prompt": _CONSOLE_PROMPT, + }, + ) + else: + await _console_send( + ws, + send_lock, + { + "type": "complete", + "status": "idle", + "prompt": _CONSOLE_PROMPT, + }, + ) + continue + + if active_task and not active_task.done(): + await _console_send( + ws, + send_lock, + { + "type": "error", + "message": "A console command is already running.", + "prompt": _CONSOLE_PROMPT, + }, + ) + continue + + if frame_type == "confirm": + command = str(payload.get("command") or pending_confirmation or "").strip() + if not pending_confirmation: + await _console_send( + ws, + send_lock, + { + "type": "error", + "message": "No command is waiting for confirmation.", + "prompt": _CONSOLE_PROMPT, + }, + ) + continue + if command != pending_confirmation: + await _console_send( + ws, + send_lock, + { + "type": "error", + "message": "Confirmation does not match the pending command.", + "prompt": _CONSOLE_PROMPT, + }, + ) + continue + pending_confirmation = None + await start_command(command, confirmed=True) + continue + + if frame_type in {"input", "command"}: + line = str(payload.get("line") or payload.get("command") or "").strip() + if not line: + await _console_send( + ws, + send_lock, + { + "type": "complete", + "status": "ok", + "prompt": _CONSOLE_PROMPT, + }, + ) + continue + if pending_confirmation: + await _console_send( + ws, + send_lock, + { + "type": "error", + "message": ( + "Confirm or cancel the pending command before " + "running another one." + ), + "prompt": _CONSOLE_PROMPT, + }, + ) + continue + await start_command(line) + continue + + await _console_send( + ws, + send_lock, + { + "type": "error", + "message": f"Unsupported console frame: {frame_type or '?'}", + "prompt": _CONSOLE_PROMPT, + }, + ) + except WebSocketDisconnect: + pass + finally: + if active_task and not active_task.done(): + active_task.cancel() + try: + await active_task + except (asyncio.CancelledError, Exception): + pass + + @app.websocket("/api/pty") async def pty_ws(ws: WebSocket) -> None: peer = ws.client.host if ws.client else "?" diff --git a/tests/hermes_cli/test_dashboard_auth_ws_auth.py b/tests/hermes_cli/test_dashboard_auth_ws_auth.py index c10d8839f..2d28bcf1d 100644 --- a/tests/hermes_cli/test_dashboard_auth_ws_auth.py +++ b/tests/hermes_cli/test_dashboard_auth_ws_auth.py @@ -1,9 +1,9 @@ """Tests for the WS-upgrade auth helper (Phase 5 task 5.2). -The dashboard's four WS endpoints (``/api/pty``, ``/api/ws``, ``/api/pub``, -``/api/events``) share an auth gate: ``_ws_auth_ok``. In loopback mode it -accepts ``?token=<_SESSION_TOKEN>``; in gated mode it accepts a single-use -``?ticket=`` minted by ``POST /api/auth/ws-ticket``. +The dashboard's WS endpoints (``/api/pty``, ``/api/console``, ``/api/ws``, +``/api/pub``, ``/api/events``) share an auth gate: ``_ws_auth_ok``. In +loopback mode it accepts ``?token=<_SESSION_TOKEN>``; in gated mode it accepts +a single-use ``?ticket=`` minted by ``POST /api/auth/ws-ticket``. These tests exercise the helper at the unit level (no actual WS upgrade) plus the ticket-mint endpoint under realistic gated-mode setup. We don't @@ -315,9 +315,10 @@ class TestWsRequestIsAllowedGated: (intended only for unauthenticated loopback dev) must not also reject those upgrades: the OAuth gate + single-use ticket is the auth. - Regression coverage: every WS endpoint (``/api/pty``, ``/api/ws``, - ``/api/pub``, ``/api/events``) calls ``_ws_request_is_allowed`` after - ``_ws_auth_ok``. If the peer-IP check rejects gated mode, the chat + Regression coverage: every WS endpoint (``/api/pty``, ``/api/console``, + ``/api/ws``, ``/api/pub``, ``/api/events``) calls + ``_ws_request_is_allowed`` after ``_ws_auth_ok``. If the peer-IP check + rejects gated mode, the chat tab + sidebar tool feed silently fail to connect even after a successful OAuth login. """ diff --git a/tests/hermes_cli/test_web_server_console_ws.py b/tests/hermes_cli/test_web_server_console_ws.py new file mode 100644 index 000000000..538251ec7 --- /dev/null +++ b/tests/hermes_cli/test_web_server_console_ws.py @@ -0,0 +1,134 @@ +"""Dashboard Hermes Console websocket tests.""" + +from __future__ import annotations + +import time +from urllib.parse import urlencode + +import pytest +from starlette.testclient import TestClient +from starlette.websockets import WebSocketDisconnect + +from hermes_cli import web_server + + +@pytest.fixture +def console_client(monkeypatch, _isolate_hermes_home): + previous_auth_required = getattr(web_server.app.state, "auth_required", None) + previous_bound_host = getattr(web_server.app.state, "bound_host", None) + web_server.app.state.auth_required = False + web_server.app.state.bound_host = None + monkeypatch.setattr(web_server, "_DASHBOARD_EMBEDDED_CHAT_ENABLED", True) + + client = TestClient(web_server.app) + try: + yield client + finally: + close = getattr(client, "close", None) + if close is not None: + close() + if previous_auth_required is None: + if hasattr(web_server.app.state, "auth_required"): + delattr(web_server.app.state, "auth_required") + else: + web_server.app.state.auth_required = previous_auth_required + if previous_bound_host is None: + if hasattr(web_server.app.state, "bound_host"): + delattr(web_server.app.state, "bound_host") + else: + web_server.app.state.bound_host = previous_bound_host + + +def _url(token: str | None = None, **params: str) -> str: + query = {"token": web_server._SESSION_TOKEN, **params} + if token is not None: + query["token"] = token + return f"/api/console?{urlencode(query)}" + + +def _recv_until(conn, frame_type: str, *, status: str | None = None) -> dict: + deadline = time.monotonic() + 5.0 + while time.monotonic() < deadline: + frame = conn.receive_json() + if frame.get("type") != frame_type: + continue + if status is not None and frame.get("status") != status: + continue + return frame + raise AssertionError(f"Timed out waiting for {frame_type} frame") + + +def test_console_ws_rejects_missing_or_bad_token(console_client): + with pytest.raises(WebSocketDisconnect) as exc: + with console_client.websocket_connect("/api/console"): + pass + assert exc.value.code == 4401 + + with pytest.raises(WebSocketDisconnect) as exc: + with console_client.websocket_connect(_url(token="wrong")): + pass + assert exc.value.code == 4401 + + +def test_console_ws_runs_read_only_command(console_client): + with console_client.websocket_connect(_url()) as conn: + ready = conn.receive_json() + assert ready["type"] == "ready" + assert ready["context"] == "local" + assert ready["prompt"] == "hermes> " + + conn.send_json({"type": "input", "line": "help"}) + + output = _recv_until(conn, "output") + assert "Hermes Console" in output["data"] + complete = _recv_until(conn, "complete", status="ok") + assert complete["prompt"] == "hermes> " + + +def test_console_ws_confirmed_command_executes_after_confirmation(console_client): + from hermes_cli.config import load_config + + with console_client.websocket_connect(_url()) as conn: + assert conn.receive_json()["type"] == "ready" + conn.send_json({"type": "input", "line": "config set display.interface cli"}) + + confirmation = _recv_until(conn, "confirm_required") + assert confirmation["command"] == "config set display.interface cli" + assert confirmation["message"] + + conn.send_json({"type": "confirm", "command": confirmation["command"]}) + _recv_until(conn, "complete", status="ok") + + assert load_config()["display"]["interface"] == "cli" + + +def test_console_ws_uses_hosted_context_for_opt_data_policy(console_client, monkeypatch): + monkeypatch.setattr(web_server, "_default_hermes_root_is_opt_data", lambda: True) + + with console_client.websocket_connect(_url()) as conn: + ready = conn.receive_json() + assert ready["type"] == "ready" + assert ready["context"] == "hosted" + + conn.send_json({"type": "input", "line": "profile create nope"}) + + error = _recv_until(conn, "error") + assert "hosted Hermes Console" in error["message"] + + +def test_console_ws_cancel_returns_to_prompt(console_client, monkeypatch): + from hermes_cli.console_engine import ConsoleResult, HermesConsoleEngine + + def slow_execute(self, line: str, *, confirmed: bool = False): + time.sleep(0.5) + return ConsoleResult("ok", output="late", command=line) + + monkeypatch.setattr(HermesConsoleEngine, "execute", slow_execute) + + with console_client.websocket_connect(_url()) as conn: + assert conn.receive_json()["type"] == "ready" + conn.send_json({"type": "input", "line": "status"}) + conn.send_json({"type": "cancel"}) + + complete = _recv_until(conn, "complete", status="cancelled") + assert complete["prompt"] == "hermes> " From f7d90edd8be5bd6d58c9dfd494c1199cc73eb4c3 Mon Sep 17 00:00:00 2001 From: Shannon Sands <shannon.sands.1979@gmail.com> Date: Wed, 1 Jul 2026 09:45:40 +1000 Subject: [PATCH 41/46] Add dashboard Hermes console UI --- hermes_cli/console_engine.py | 168 ++++++- tests/hermes_cli/test_console_engine.py | 57 +++ web/src/components/HermesConsoleModal.tsx | 538 ++++++++++++++++++++++ web/src/pages/SystemPage.tsx | 9 + 4 files changed, 769 insertions(+), 3 deletions(-) create mode 100644 web/src/components/HermesConsoleModal.tsx diff --git a/hermes_cli/console_engine.py b/hermes_cli/console_engine.py index e89ed2bc2..00e26300a 100644 --- a/hermes_cli/console_engine.py +++ b/hermes_cli/console_engine.py @@ -13,6 +13,7 @@ import importlib import difflib import io import json +import re import shlex import sys from dataclasses import dataclass, replace @@ -72,6 +73,51 @@ def _capture_output(fn: Callable[[], object]) -> str: return text.rstrip() +_ANSI_RE = re.compile(r"\x1b\[[0-?]*[ -/]*[@-~]") + + +def _strip_ansi(text: str) -> str: + return _ANSI_RE.sub("", text) + + +def _is_status_footer_rule(line: str) -> bool: + stripped = _strip_ansi(line).strip() + if len(stripped) < 8: + return False + normalized = stripped.replace("\u2500", "-") + return set(normalized) <= {"-"} + + +def _strip_console_status_footer(text: str) -> str: + lines = text.splitlines() + while lines and not _strip_ansi(lines[-1]).strip(): + lines.pop() + if len(lines) < 2: + return text.rstrip() + + last = _strip_ansi(lines[-1]).strip() + prev = _strip_ansi(lines[-2]).strip() + if not ( + prev.startswith("Run 'hermes doctor'") + and last.startswith("Run 'hermes setup'") + ): + return text.rstrip() + + lines = lines[:-2] + while lines and not _strip_ansi(lines[-1]).strip(): + lines.pop() + if lines and _is_status_footer_rule(lines[-1]): + lines.pop() + return "\n".join(lines).rstrip() + + +def _table_summary(summary: str, *, limit: int = 76) -> str: + summary = " ".join(summary.split()) + if len(summary) <= limit: + return summary + return f"{summary[: limit - 3].rstrip()}..." + + def _split_line(line: str) -> list[str]: try: return shlex.split(line, comments=False, posix=True) @@ -199,6 +245,112 @@ def _parser_root() -> tuple[_ArgumentParser, argparse._SubParsersAction]: return parser, subparsers +def _subparser_actions(parser: argparse.ArgumentParser) -> list[argparse._SubParsersAction]: + return [ + action + for action in parser._actions + if isinstance(action, argparse._SubParsersAction) + ] + + +def _choice_help(action: argparse._SubParsersAction, name: str) -> str: + for choice in action._choices_actions: + if getattr(choice, "dest", None) == name or getattr(choice, "metavar", None) == name: + help_text = getattr(choice, "help", None) + if help_text and help_text is not argparse.SUPPRESS: + return str(help_text) + return "" + + +def _clean_summary(text: str | None) -> str: + if not text: + return "" + if text is argparse.SUPPRESS: + return "" + summary = " ".join(str(text).split()) + if not summary: + return "" + if summary.startswith("Run `hermes "): + return "" + return summary + + +def _summaries_from_parser(parser: argparse.ArgumentParser) -> dict[tuple[str, ...], str]: + summaries: dict[tuple[str, ...], str] = {} + + def walk(current: argparse.ArgumentParser, path: tuple[str, ...]) -> None: + for action in _subparser_actions(current): + for name, child in action.choices.items(): + child_path = (*path, name) + summary = _clean_summary(_choice_help(action, name)) or _clean_summary( + child.description + ) + if summary: + summaries.setdefault(child_path, summary) + walk(child, child_path) + + walk(parser, ()) + return summaries + + +def _noop_console_command(_args: argparse.Namespace) -> None: + return None + + +def _extracted_summaries( + module_name: str, + builder_name: str, + main_handler_name: str, +) -> dict[tuple[str, ...], str]: + try: + parser, subparsers = _parser_root() + module = importlib.import_module(module_name) + builder = getattr(module, builder_name) + builder(subparsers, **{main_handler_name: _noop_console_command}) + return _summaries_from_parser(parser) + except Exception: + return {} + + +def _registered_summaries( + root: str, + module_name: str, + register_name: str, +) -> dict[tuple[str, ...], str]: + try: + parser, subparsers = _parser_root() + module = importlib.import_module(module_name) + top_parser = subparsers.add_parser(root) + register = getattr(module, register_name) + register(top_parser) + return _summaries_from_parser(parser) + except Exception: + return {} + + +def _builder_summaries( + module_name: str, + builder_name: str, +) -> dict[tuple[str, ...], str]: + try: + parser, subparsers = _parser_root() + module = importlib.import_module(module_name) + getattr(module, builder_name)(subparsers) + return _summaries_from_parser(parser) + except Exception: + return {} + + +def _adder_summaries(module_name: str, add_name: str) -> dict[tuple[str, ...], str]: + try: + parser, subparsers = _parser_root() + module = importlib.import_module(module_name) + getattr(module, add_name)(subparsers) + return _summaries_from_parser(parser) + except Exception: + return {} + + def _invoke_namespace(args: argparse.Namespace) -> object: func = getattr(args, "func", None) if not callable(func): @@ -399,6 +551,7 @@ def _register_command_family( mutating: Iterable[Sequence[str]] = (), hosted: Iterable[Sequence[str]] = (), summary: str = "", + summaries: dict[tuple[str, ...], str] | None = None, confirmation: str = "", ) -> None: mutating_paths = {tuple(path) for path in mutating} @@ -407,10 +560,11 @@ def _register_command_family( child_key = tuple(child_path) full_path = (root, *tuple(child_path)) usage = " ".join(full_path) + command_summary = summary or (summaries or {}).get(full_path) or f"Run `hermes {usage}`." engine.register( full_path, usage, - summary or f"Run `hermes {usage}`.", + command_summary, handler_factory(tuple(child_path)), mutating=child_key in mutating_paths, confirmation=confirmation or f"Run `hermes {usage}`?", @@ -485,7 +639,7 @@ class HermesConsoleEngine: if self.context not in command.contexts: continue marker = " *" if command.mutating else " " - lines.append(f"{marker} {command.usage:<32} {command.summary}") + lines.append(f"{marker} {command.usage:<32} {_table_summary(command.summary)}") lines.extend( [ "", @@ -790,11 +944,13 @@ class HermesConsoleEngine: } for root, (module, builder, main_handler, paths, mutating) in extracted.items(): + summaries = _extracted_summaries(module, builder, main_handler) _register_command_family( self, root=root, paths=paths, mutating=mutating, + summaries=summaries, handler_factory=lambda fixed, root=root, module=module, builder=builder, main_handler=main_handler: _extracted_handler( root, fixed, @@ -866,6 +1022,7 @@ class HermesConsoleEngine: self, root="portal", paths=portal_paths, + summaries=_adder_summaries("hermes_cli.portal_cli", "add_parser"), handler_factory=lambda fixed: _adder_handler( "portal", fixed, @@ -890,6 +1047,7 @@ class HermesConsoleEngine: ("restore",), ("bind-board",), ], + summaries=_builder_summaries("hermes_cli.projects_cmd", "build_parser"), mutating=[ ("create",), ("add-folder",), @@ -946,6 +1104,7 @@ class HermesConsoleEngine: ("assignments",), ("context",), ], + summaries=_builder_summaries("hermes_cli.kanban", "build_parser"), mutating=[ ("init",), ("boards", "create"), @@ -1033,11 +1192,13 @@ class HermesConsoleEngine: ), } for root, (module, register, handler_name, paths, mutating) in registered.items(): + summaries = _registered_summaries(root, module, register) _register_command_family( self, root=root, paths=paths, mutating=mutating, + summaries=summaries, handler_factory=lambda fixed, root=root, module=module, register=register, handler_name=handler_name: _registered_handler( root, fixed, @@ -1349,7 +1510,8 @@ def _status(_engine: HermesConsoleEngine, args: list[str]) -> str: from hermes_cli.status import show_status - return _capture_output(lambda: show_status(SimpleNamespace(all=False, deep=False))) + output = _capture_output(lambda: show_status(SimpleNamespace(all=False, deep=False))) + return _strip_console_status_footer(output) def _doctor(_engine: HermesConsoleEngine, args: list[str]) -> str: diff --git a/tests/hermes_cli/test_console_engine.py b/tests/hermes_cli/test_console_engine.py index 9f9a835e1..59056d2b2 100644 --- a/tests/hermes_cli/test_console_engine.py +++ b/tests/hermes_cli/test_console_engine.py @@ -243,6 +243,63 @@ def test_console_parses_bare_and_hermes_prefixed_commands(_isolate_hermes_home): assert bare.output.endswith("config.yaml") +def test_console_status_hides_cli_next_step_footer( + monkeypatch: pytest.MonkeyPatch, + _isolate_hermes_home, +): + import hermes_cli.status as status_mod + + def fake_show_status(_args): + print("◆ Sessions") + print("Active: 3 session(s)") + print() + rule = "\u2500" * 60 + print(f"\x1b[2m{rule}\x1b[0m") + print("\x1b[2m Run 'hermes doctor' for detailed diagnostics\x1b[0m") + print("\x1b[2m Run 'hermes setup' to configure\x1b[0m") + print() + + monkeypatch.setattr(status_mod, "show_status", fake_show_status) + + result = HermesConsoleEngine().execute("status") + + assert result.status == "ok" + assert "Sessions" in result.output + assert "Active: 3 session(s)" in result.output + assert "hermes doctor" not in result.output + assert "hermes setup" not in result.output + assert "\u2500" not in result.output + + +def test_console_help_uses_cli_subcommand_summaries(): + help_text = HermesConsoleEngine().help_text() + + assert "skills list" in help_text + assert "List installed skills" in help_text + assert "Show all tools and their enabled/disabled status" in help_text + assert "Remove an MCP server" in help_text + assert "Check pet setup + terminal graphics support" in help_text + assert "Run `hermes skills list`" not in help_text + assert "Run `hermes tools list`" not in help_text + + +def test_console_help_table_keeps_long_summaries_compact(): + help_text = HermesConsoleEngine().help_text() + + slack_line = next( + line for line in help_text.splitlines() if line.strip().startswith("slack manifest") + ) + + assert len(slack_line) <= 112 + assert slack_line.endswith("...") + + +def test_console_help_for_command_uses_cli_summary(): + help_text = HermesConsoleEngine().help_text("skills list") + + assert help_text == "skills list\nList installed skills" + + def test_console_registry_covers_non_admin_cli_surface(): registered = set(HermesConsoleEngine().commands) diff --git a/web/src/components/HermesConsoleModal.tsx b/web/src/components/HermesConsoleModal.tsx new file mode 100644 index 000000000..fd63b38b8 --- /dev/null +++ b/web/src/components/HermesConsoleModal.tsx @@ -0,0 +1,538 @@ +import { useCallback, useEffect, useRef, useState } from "react"; +import { createPortal } from "react-dom"; +import { FitAddon } from "@xterm/addon-fit"; +import { Unicode11Addon } from "@xterm/addon-unicode11"; +import { WebLinksAddon } from "@xterm/addon-web-links"; +import { Terminal as XtermTerminal } from "@xterm/xterm"; +import "@xterm/xterm/css/xterm.css"; +import { Terminal, X } from "lucide-react"; +import { Badge } from "@nous-research/ui/ui/components/badge"; +import { Button } from "@nous-research/ui/ui/components/button"; +import { useModalBehavior } from "@/hooks/useModalBehavior"; +import { useProfileScope } from "@/contexts/useProfileScope"; +import { api } from "@/lib/api"; +import { cn, themedBody } from "@/lib/utils"; +import { useTheme } from "@/themes"; + +type ConsoleFrame = + | { + type: "ready"; + context?: string; + profile?: string; + prompt?: string; + } + | { + type: "output"; + data?: string; + stream?: string; + } + | { + type: "error"; + message?: string; + } + | { + type: "confirm_required"; + command?: string; + message?: string; + prompt?: string; + } + | { + type: "complete"; + status?: string; + prompt?: string; + } + | { + type: "clear"; + } + | { + type: "pong"; + }; + +type ConnectionState = "connecting" | "ready" | "running" | "closed" | "error"; + +interface HermesConsoleModalProps { + open: boolean; + onClose: () => void; +} + +function buildTerminalTheme(background: string, foreground: string) { + return { + background, + foreground, + cursor: foreground, + cursorAccent: background, + selectionBackground: "rgba(255, 255, 255, 0.25)", + black: "#000000", + red: "#ff5f67", + green: "#5fffb0", + yellow: "#ffd166", + blue: "#7aa2ff", + magenta: "#d597ff", + cyan: "#58e6ff", + white: foreground, + brightBlack: "#666666", + brightRed: "#ff8b90", + brightGreen: "#8dffc8", + brightYellow: "#ffe08a", + brightBlue: "#9dbaff", + brightMagenta: "#e4b7ff", + brightCyan: "#8ef0ff", + brightWhite: "#ffffff", + }; +} + +function normalizeTerminalText(text: string): string { + return text.replace(/\r?\n/g, "\r\n"); +} + +function writeLine(term: XtermTerminal, text = ""): void { + term.write(`${normalizeTerminalText(text)}\r\n`); +} + +function writeBlock(term: XtermTerminal, text: string): void { + const normalized = normalizeTerminalText(text); + term.write(normalized.endsWith("\r\n") ? normalized : `${normalized}\r\n`); +} + +function isPrintable(data: string): boolean { + return data >= " " || data === "\t"; +} + +export function HermesConsoleModal({ open, onClose }: HermesConsoleModalProps) { + const modalRef = useModalBehavior({ open, onClose }); + const hostRef = useRef<HTMLDivElement | null>(null); + const termRef = useRef<XtermTerminal | null>(null); + const wsRef = useRef<WebSocket | null>(null); + const lineRef = useRef(""); + const promptRef = useRef("hermes> "); + const inputPromptRef = useRef("hermes> "); + const historyRef = useRef<string[]>([]); + const historyIndexRef = useRef<number | null>(null); + const activeCommandRef = useRef(false); + const pendingCommandRef = useRef<string | null>(null); + const hasReadyFrameRef = useRef(false); + const [connectionState, setConnectionState] = + useState<ConnectionState>("connecting"); + const [consoleContext, setConsoleContext] = useState("pending"); + const [consoleProfile, setConsoleProfile] = useState("current"); + const { profile } = useProfileScope(); + const { theme } = useTheme(); + + const redrawInput = useCallback((line = lineRef.current) => { + const term = termRef.current; + if (!term) return; + lineRef.current = line; + term.write(`\r\x1b[2K${inputPromptRef.current}${line}`); + }, []); + + const showPrompt = useCallback(() => { + const term = termRef.current; + if (!term) return; + lineRef.current = ""; + historyIndexRef.current = null; + inputPromptRef.current = promptRef.current; + term.write(inputPromptRef.current); + }, []); + + const sendFrame = useCallback((payload: Record<string, unknown>) => { + const ws = wsRef.current; + if (!ws || ws.readyState !== WebSocket.OPEN) return false; + ws.send(JSON.stringify(payload)); + return true; + }, []); + + const cancelCommand = useCallback(() => { + pendingCommandRef.current = null; + activeCommandRef.current = false; + sendFrame({ type: "cancel" }); + }, [sendFrame]); + + const submitLine = useCallback( + (rawLine: string) => { + const term = termRef.current; + if (!term) return; + const line = rawLine.trim(); + term.write("\r\n"); + lineRef.current = ""; + historyIndexRef.current = null; + + const pending = pendingCommandRef.current; + if (pending) { + const answer = line.toLowerCase(); + if (answer === "y" || answer === "yes") { + pendingCommandRef.current = null; + activeCommandRef.current = true; + setConnectionState("running"); + sendFrame({ type: "confirm", command: pending }); + return; + } + cancelCommand(); + return; + } + + if (!line) { + showPrompt(); + return; + } + + historyRef.current = [...historyRef.current, line].slice(-200); + activeCommandRef.current = true; + setConnectionState("running"); + if (!sendFrame({ type: "input", line })) { + activeCommandRef.current = false; + writeLine(term, "\x1b[31mConsole is not connected.\x1b[0m"); + showPrompt(); + } + }, + [cancelCommand, sendFrame, showPrompt], + ); + + const recallHistory = useCallback( + (direction: -1 | 1) => { + const history = historyRef.current; + if (!history.length) return; + const current = historyIndexRef.current; + if (current === null) { + if (direction > 0) return; + historyIndexRef.current = history.length - 1; + } else { + const next = current + direction; + if (next < 0) historyIndexRef.current = 0; + else if (next >= history.length) { + historyIndexRef.current = null; + redrawInput(""); + return; + } else { + historyIndexRef.current = next; + } + } + const idx = historyIndexRef.current; + redrawInput(idx === null ? "" : history[idx] ?? ""); + }, + [redrawInput], + ); + + const handleInputData = useCallback( + (data: string) => { + const term = termRef.current; + if (!term) return; + + if (data === "\x1b[A") { + recallHistory(-1); + return; + } + if (data === "\x1b[B") { + recallHistory(1); + return; + } + + for (const ch of data) { + if (ch === "\u0003") { + term.write("^C\r\n"); + if (activeCommandRef.current || pendingCommandRef.current) { + cancelCommand(); + } else { + showPrompt(); + } + continue; + } + if (ch === "\u000c") { + term.clear(); + showPrompt(); + continue; + } + if (activeCommandRef.current) { + term.write("\x07"); + continue; + } + if (ch === "\r" || ch === "\n") { + submitLine(lineRef.current); + continue; + } + if (ch === "\u007f" || ch === "\b") { + if (lineRef.current.length > 0) { + lineRef.current = lineRef.current.slice(0, -1); + term.write("\b \b"); + } + continue; + } + if (ch === "\x1b") { + continue; + } + if (isPrintable(ch)) { + lineRef.current += ch; + term.write(ch); + } + } + }, + [cancelCommand, recallHistory, showPrompt, submitLine], + ); + + const handleFrame = useCallback( + (frame: ConsoleFrame) => { + const term = termRef.current; + if (!term) return; + + if (frame.type === "ready") { + const nextPrompt = frame.prompt || "hermes> "; + promptRef.current = nextPrompt; + inputPromptRef.current = nextPrompt; + hasReadyFrameRef.current = true; + setConsoleContext(frame.context || "local"); + setConsoleProfile(frame.profile || "current"); + activeCommandRef.current = false; + setConnectionState("ready"); + term.clear(); + showPrompt(); + return; + } + + if (frame.type === "output") { + if (frame.data) writeBlock(term, frame.data); + return; + } + + if (frame.type === "error") { + writeLine(term, `\x1b[31m${frame.message || "Command failed."}\x1b[0m`); + return; + } + + if (frame.type === "confirm_required") { + pendingCommandRef.current = frame.command || ""; + activeCommandRef.current = false; + setConnectionState("ready"); + if (frame.message) { + writeLine(term, `\x1b[33m${frame.message}\x1b[0m`); + } + inputPromptRef.current = "Confirm? [y/N] "; + lineRef.current = ""; + term.write(inputPromptRef.current); + return; + } + + if (frame.type === "complete") { + activeCommandRef.current = false; + if (frame.prompt) promptRef.current = frame.prompt; + if (frame.status === "confirm_required") return; + if (frame.status === "exit") { + setConnectionState("closed"); + wsRef.current?.close(); + return; + } + if (frame.status === "timeout") { + writeLine(term, "\x1b[31mCommand timed out.\x1b[0m"); + } + if (frame.status === "cancelled") { + writeLine(term, "\x1b[33mCancelled.\x1b[0m"); + } + pendingCommandRef.current = null; + setConnectionState("ready"); + showPrompt(); + return; + } + + if (frame.type === "clear") { + term.clear(); + showPrompt(); + } + }, + [showPrompt], + ); + + useEffect(() => { + if (!open) return; + const host = hostRef.current; + if (!host) return; + + let cancelled = false; + let resizeFrame = 0; + const term = new XtermTerminal({ + allowProposedApi: true, + cursorBlink: true, + fontFamily: + "'JetBrains Mono', 'Cascadia Mono', 'Fira Code', 'MesloLGS NF', 'Source Code Pro', Menlo, Consolas, 'DejaVu Sans Mono', monospace", + fontSize: 13, + lineHeight: 1.25, + letterSpacing: 0, + macOptionIsMeta: true, + scrollback: 3000, + theme: buildTerminalTheme( + theme.terminalBackground ?? "#000000", + theme.terminalForeground ?? "#f0e6d2", + ), + }); + termRef.current = term; + + const fit = new FitAddon(); + term.loadAddon(fit); + const unicode11 = new Unicode11Addon(); + term.loadAddon(unicode11); + term.unicode.activeVersion = "11"; + term.loadAddon(new WebLinksAddon()); + term.open(host); + term.focus(); + + const fitTerminal = () => { + if (!host.isConnected || host.clientWidth <= 0 || host.clientHeight <= 0) { + return; + } + try { + fit.fit(); + } catch { + /* fit can fail while the modal is closing */ + } + }; + const scheduleFit = () => { + if (resizeFrame) return; + resizeFrame = requestAnimationFrame(() => { + resizeFrame = 0; + fitTerminal(); + }); + }; + const ro = new ResizeObserver(scheduleFit); + ro.observe(host); + scheduleFit(); + + const dataDisposable = term.onData(handleInputData); + setConnectionState("connecting"); + setConsoleContext("pending"); + setConsoleProfile(profile || "current"); + hasReadyFrameRef.current = false; + writeLine(term, "\x1b[2mConnecting to Hermes Console...\x1b[0m"); + + void (async () => { + try { + const params = profile ? { profile } : undefined; + const url = await api.buildWsUrl("/api/console", params); + if (cancelled) return; + const ws = new WebSocket(url); + wsRef.current = ws; + + ws.onopen = () => { + setConnectionState("connecting"); + }; + + ws.onmessage = (ev) => { + try { + const frame = JSON.parse(String(ev.data)) as ConsoleFrame; + handleFrame(frame); + } catch { + writeLine(term, "\x1b[31mMalformed console frame.\x1b[0m"); + } + }; + + ws.onerror = () => { + setConnectionState("error"); + writeLine(term, "\x1b[31mConsole websocket error.\x1b[0m"); + }; + + ws.onclose = (ev) => { + wsRef.current = null; + activeCommandRef.current = false; + pendingCommandRef.current = null; + if (cancelled) return; + setConnectionState(ev.code === 1000 ? "closed" : "error"); + const reason = ev.reason ? ` ${ev.reason}` : ""; + const message = + ev.code === 1006 && !hasReadyFrameRef.current + ? "Console connection failed before the server handshake. Check that this dashboard is connected to a backend with /api/console." + : `Console closed (${ev.code}).${reason}`; + writeLine(term, `\x1b[31m${message}\x1b[0m`); + }; + } catch (err) { + if (cancelled) return; + setConnectionState("error"); + writeLine(term, `\x1b[31mConsole unavailable: ${err}\x1b[0m`); + } + })(); + + return () => { + cancelled = true; + dataDisposable.dispose(); + ro.disconnect(); + if (resizeFrame) cancelAnimationFrame(resizeFrame); + wsRef.current?.close(); + wsRef.current = null; + term.dispose(); + termRef.current = null; + lineRef.current = ""; + pendingCommandRef.current = null; + activeCommandRef.current = false; + hasReadyFrameRef.current = false; + }; + }, [handleFrame, handleInputData, open, profile, theme]); + + useEffect(() => { + if (!open) return; + const term = termRef.current; + if (!term) return; + term.options.theme = buildTerminalTheme( + theme.terminalBackground ?? "#000000", + theme.terminalForeground ?? "#f0e6d2", + ); + }, [open, theme]); + + if (!open) return null; + + const statusTone = + connectionState === "ready" + ? "success" + : connectionState === "running" + ? "warning" + : connectionState === "connecting" + ? "secondary" + : "destructive"; + + return createPortal( + <div + ref={modalRef} + className="fixed inset-0 z-[100] flex items-center justify-center bg-background/85 p-3 sm:p-4" + onClick={(event) => event.target === event.currentTarget && onClose()} + role="dialog" + aria-modal="true" + aria-labelledby="hermes-console-title" + > + <div + className={cn( + themedBody, + "relative flex h-[min(82dvh,760px)] w-full max-w-5xl flex-col border border-border bg-card shadow-2xl", + )} + > + <header className="flex min-h-14 items-center gap-3 border-b border-border px-4 py-3"> + <div className="flex h-9 w-9 items-center justify-center border border-border bg-background/60 text-primary"> + <Terminal className="h-4 w-4" /> + </div> + <div className="min-w-0 flex-1"> + <h2 + id="hermes-console-title" + className="font-mondwest text-display text-base tracking-wider" + > + Hermes Console + </h2> + <div className="mt-1 flex flex-wrap items-center gap-2 text-xs text-muted-foreground"> + <Badge tone={statusTone}>{connectionState}</Badge> + <span className="font-mono">{consoleContext}</span> + <span className="font-mono">{consoleProfile}</span> + </div> + </div> + <Button + ghost + size="icon" + onClick={onClose} + className="text-muted-foreground hover:text-foreground" + aria-label="Close console" + > + <X /> + </Button> + </header> + <div className="min-h-0 flex-1 bg-black"> + <div + ref={hostRef} + className="h-full min-h-0 w-full overflow-hidden p-2 [&_.xterm]:h-full [&_.xterm-viewport]:!bg-transparent" + /> + </div> + </div> + </div>, + document.body, + ); +} diff --git a/web/src/pages/SystemPage.tsx b/web/src/pages/SystemPage.tsx index 043933abe..82aed6b2b 100644 --- a/web/src/pages/SystemPage.tsx +++ b/web/src/pages/SystemPage.tsx @@ -42,6 +42,7 @@ import { useConfirmDelete } from "@nous-research/ui/hooks/use-confirm-delete"; import { ConfirmDialog } from "@nous-research/ui/ui/components/confirm-dialog"; import { useModalBehavior } from "@/hooks/useModalBehavior"; import { DeleteConfirmDialog } from "@/components/DeleteConfirmDialog"; +import { HermesConsoleModal } from "@/components/HermesConsoleModal"; import { cn, themedBody } from "@/lib/utils"; import { api } from "@/lib/api"; import type { @@ -186,6 +187,7 @@ export default function SystemPage() { const [loading, setLoading] = useState(true); const [activeAction, setActiveAction] = useState<string | null>(null); + const [consoleOpen, setConsoleOpen] = useState(false); // Add-credential form. const [credProvider, setCredProvider] = useState("openrouter"); @@ -680,6 +682,10 @@ export default function SystemPage() { description="Remove this hook from config and revoke its consent? It stops firing on the next restart." loading={hookDelete.isDeleting} /> + <HermesConsoleModal + open={consoleOpen} + onClose={() => setConsoleOpen(false)} + /> {/* Create-hook modal */} {hookModalOpen && ( @@ -1162,6 +1168,9 @@ export default function SystemPage() { </H2> <Card> <CardContent className="flex flex-wrap gap-2 py-4"> + <Button size="sm" ghost prefix={<Terminal className="h-3.5 w-3.5" />} onClick={() => setConsoleOpen(true)}> + Open console + </Button> <Button size="sm" ghost prefix={<Stethoscope className="h-3.5 w-3.5" />} onClick={() => runOp(api.runDoctor, "Doctor")}> Run doctor </Button> From 1e7111d25dc8d6fa361499e162c3262b40bf09ef Mon Sep 17 00:00:00 2001 From: Shannon Sands <shannon.sands.1979@gmail.com> Date: Fri, 3 Jul 2026 10:50:56 +1000 Subject: [PATCH 42/46] Use shared ANSI stripping in Hermes Console --- hermes_cli/console_engine.py | 12 +++------- tests/hermes_cli/test_console_engine.py | 31 +++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/hermes_cli/console_engine.py b/hermes_cli/console_engine.py index 00e26300a..6d8409d1c 100644 --- a/hermes_cli/console_engine.py +++ b/hermes_cli/console_engine.py @@ -9,11 +9,10 @@ from __future__ import annotations import argparse import contextlib -import importlib import difflib +import importlib import io import json -import re import shlex import sys from dataclasses import dataclass, replace @@ -21,6 +20,8 @@ from pathlib import Path from typing import Callable, Iterable, Literal, NoReturn, Sequence from urllib.parse import urlparse +from tools.ansi_strip import strip_ansi as _strip_ansi + ConsoleStatus = Literal["ok", "error", "confirm_required", "exit", "clear"] ConsoleContext = Literal["local", "hosted"] @@ -73,13 +74,6 @@ def _capture_output(fn: Callable[[], object]) -> str: return text.rstrip() -_ANSI_RE = re.compile(r"\x1b\[[0-?]*[ -/]*[@-~]") - - -def _strip_ansi(text: str) -> str: - return _ANSI_RE.sub("", text) - - def _is_status_footer_rule(line: str) -> bool: stripped = _strip_ansi(line).strip() if len(stripped) < 8: diff --git a/tests/hermes_cli/test_console_engine.py b/tests/hermes_cli/test_console_engine.py index 59056d2b2..ac94facbd 100644 --- a/tests/hermes_cli/test_console_engine.py +++ b/tests/hermes_cli/test_console_engine.py @@ -271,6 +271,37 @@ def test_console_status_hides_cli_next_step_footer( assert "\u2500" not in result.output +def test_console_status_hides_osc_linked_cli_next_step_footer( + monkeypatch: pytest.MonkeyPatch, + _isolate_hermes_home, +): + import hermes_cli.status as status_mod + + def osc_link(text: str) -> str: + return f"\x1b]8;;https://example.test\x1b\\{text}\x1b]8;;\x1b\\" + + def fake_show_status(_args): + print("◆ Sessions") + print("Active: 3 session(s)") + print() + print(osc_link("\u2500" * 60)) + print(osc_link(" Run 'hermes doctor' for detailed diagnostics")) + print(osc_link(" Run 'hermes setup' to configure")) + print() + + monkeypatch.setattr(status_mod, "show_status", fake_show_status) + + result = HermesConsoleEngine().execute("status") + + assert result.status == "ok" + assert "Sessions" in result.output + assert "Active: 3 session(s)" in result.output + assert "hermes doctor" not in result.output + assert "hermes setup" not in result.output + assert "https://example.test" not in result.output + assert "\u2500" not in result.output + + def test_console_help_uses_cli_subcommand_summaries(): help_text = HermesConsoleEngine().help_text() From a6b9597d5fb92969d605a858d5f14536e805553a Mon Sep 17 00:00:00 2001 From: kshitijk4poor <82637225+kshitijk4poor@users.noreply.github.com> Date: Fri, 3 Jul 2026 19:59:16 +0530 Subject: [PATCH 43/46] perf(console): cache CLI-surface summaries + bound console worker pool MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Addresses two non-blocking review notes on the Hermes Console PR: - console_engine: the four _*_summaries helpers import a subcommand module and build a throwaway argparse tree purely to extract help summaries. The dashboard opens a fresh HermesConsoleEngine per /api/console connection, so every reconnect re-imported + re-parsed the whole CLI surface. The surface is process-static, so memoize with functools.lru_cache — callers only read the returned map. - web_server: console commands run in a worker thread via asyncio.to_thread. On a 60s timeout asyncio.wait_for cancels the awaitable, but Python threads aren't preemptible, so a stuck worker keeps running and would leak into the shared default thread pool. Route console execution through a small dedicated bounded ThreadPoolExecutor (max_workers=4) so a leaked worker is capped and concurrent console execution is bounded regardless of reconnects. Follow-up on top of @shannonsands' NS-574 Hermes Console. --- hermes_cli/console_engine.py | 11 ++++++++ hermes_cli/web_server.py | 49 +++++++++++++++++++++++++++++++----- 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/hermes_cli/console_engine.py b/hermes_cli/console_engine.py index 6d8409d1c..7bfa13fbf 100644 --- a/hermes_cli/console_engine.py +++ b/hermes_cli/console_engine.py @@ -10,6 +10,7 @@ from __future__ import annotations import argparse import contextlib import difflib +import functools import importlib import io import json @@ -291,6 +292,13 @@ def _noop_console_command(_args: argparse.Namespace) -> None: return None +# The CLI surface these helpers reflect is process-static: they import a +# subcommand module and build a throwaway argparse tree purely to extract help +# summaries. Nothing about the result changes across engine instances, but the +# dashboard opens a fresh HermesConsoleEngine per /api/console connection, so +# without memoization every reconnect re-imports + re-parses the whole surface. +# Cache by args (all hashable strings); callers only read the returned map. +@functools.lru_cache(maxsize=None) def _extracted_summaries( module_name: str, builder_name: str, @@ -306,6 +314,7 @@ def _extracted_summaries( return {} +@functools.lru_cache(maxsize=None) def _registered_summaries( root: str, module_name: str, @@ -322,6 +331,7 @@ def _registered_summaries( return {} +@functools.lru_cache(maxsize=None) def _builder_summaries( module_name: str, builder_name: str, @@ -335,6 +345,7 @@ def _builder_summaries( return {} +@functools.lru_cache(maxsize=None) def _adder_summaries(module_name: str, add_name: str) -> dict[tuple[str, ...], str]: try: parser, subparsers = _parser_root() diff --git a/hermes_cli/web_server.py b/hermes_cli/web_server.py index 6c19c1868..4231c8395 100644 --- a/hermes_cli/web_server.py +++ b/hermes_cli/web_server.py @@ -12,8 +12,11 @@ Usage: from contextlib import asynccontextmanager, contextmanager import asyncio +import atexit import base64 import binascii +import concurrent.futures +import functools from dataclasses import dataclass from datetime import datetime, timezone import hmac @@ -12640,6 +12643,36 @@ _CONSOLE_PROMPT = "hermes> " _CONSOLE_COMMAND_TIMEOUT_SECONDS = 60.0 _CONSOLE_OUTPUT_LIMIT = 50000 +# Console commands run in a worker thread. On a timeout, asyncio.wait_for cancels +# the *awaitable*, but Python threads aren't preemptible, so a genuinely stuck +# worker keeps running to completion. To keep that from exhausting the shared +# default thread pool (asyncio.to_thread), we run console commands on a small +# dedicated, bounded pool: a leaked worker is capped, and concurrent console +# execution is bounded to a fixed number of threads regardless of reconnects. +_CONSOLE_EXECUTOR_MAX_WORKERS = 4 +_console_executor: Optional[concurrent.futures.ThreadPoolExecutor] = None +_console_executor_lock = threading.Lock() + + +def _get_console_executor() -> concurrent.futures.ThreadPoolExecutor: + """Lazily create the bounded console worker pool (once per process).""" + global _console_executor + if _console_executor is None: + with _console_executor_lock: + if _console_executor is None: + _console_executor = concurrent.futures.ThreadPoolExecutor( + max_workers=_CONSOLE_EXECUTOR_MAX_WORKERS, + thread_name_prefix="hermes-console", + ) + # Ensure the pool is torn down on interpreter exit. Don't wait on + # in-flight workers: a stuck 60s console command must not block + # shutdown (cancel_futures drops anything not yet started). + atexit.register( + lambda: _console_executor + and _console_executor.shutdown(wait=False, cancel_futures=True) + ) + return _console_executor + def _dashboard_console_context() -> str: """Choose local vs hosted command policy for the dashboard console.""" @@ -12916,13 +12949,17 @@ async def console_ws(ws: WebSocket) -> None: async def run_command(line: str, *, confirmed: bool, command_id: int) -> None: nonlocal active_task, pending_confirmation, command_generation try: + loop = asyncio.get_running_loop() result = await asyncio.wait_for( - asyncio.to_thread( - _execute_console_line, - engine, - line, - confirmed=confirmed, - profile=profile, + loop.run_in_executor( + _get_console_executor(), + functools.partial( + _execute_console_line, + engine, + line, + confirmed=confirmed, + profile=profile, + ), ), timeout=_CONSOLE_COMMAND_TIMEOUT_SECONDS, ) From 2abe11a7fe02f3ccb0df53aa89e6af1400d619e7 Mon Sep 17 00:00:00 2001 From: emozilla <emozilla@nousresearch.com> Date: Fri, 3 Jul 2026 12:44:30 -0400 Subject: [PATCH 44/46] security(ci): pass untrusted refs through env, not run: interpolation lint.yml inlined github.head_ref (the fork PR branch name, attacker- controlled) into the diff-summary run: block. GitHub expands ${{ }} into the script text before bash tokenizes it, so a branch like x$(id) runs on the lint runner. The pull_request trigger keeps the token read-only, but the sink still allows CI resource abuse and cache/artifact tampering, and would become RCE-with-secrets under pull_request_target. Route head_ref through an env var (env values are not subject to expression injection) and reference "$HEAD_REF". Apply the same to the two docker.yml sites that interpolate github.event.release.tag_name. Fixes GHSA-jpw6-c7jr-c56v, GHSA-2843-hjmf-7x96. Credit: @technotion, @youngstar-eth. --- .github/workflows/docker.yml | 15 ++++++++------- .github/workflows/lint.yml | 4 +++- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 8030b889e..e19894c96 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -178,6 +178,9 @@ jobs: - name: Create manifest list and push working-directory: /tmp/digests + env: + IMAGE_NAME: ${{ env.IMAGE_NAME }} + RELEASE_TAG: ${{ github.event.release.tag_name }} run: | set -euo pipefail args=() @@ -185,9 +188,8 @@ jobs: args+=("${IMAGE_NAME}@sha256:${digest_file}") done if [ "${{ github.event_name }}" = "release" ]; then - TAG="${{ github.event.release.tag_name }}" docker buildx imagetools create \ - -t "${IMAGE_NAME}:${TAG}" \ + -t "${IMAGE_NAME}:${RELEASE_TAG}" \ "${args[@]}" else docker buildx imagetools create \ @@ -195,15 +197,14 @@ jobs: -t "${IMAGE_NAME}:latest" \ "${args[@]}" fi - env: - IMAGE_NAME: ${{ env.IMAGE_NAME }} - name: Inspect image + env: + IMAGE_NAME: ${{ env.IMAGE_NAME }} + RELEASE_TAG: ${{ github.event.release.tag_name }} run: | if [ "${{ github.event_name }}" = "release" ]; then - docker buildx imagetools inspect "${IMAGE_NAME}:${{ github.event.release.tag_name }}" + docker buildx imagetools inspect "${IMAGE_NAME}:${RELEASE_TAG}" else docker buildx imagetools inspect "${IMAGE_NAME}:main" fi - env: - IMAGE_NAME: ${{ env.IMAGE_NAME }} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index fcee2c1b8..beb3a07ab 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -98,6 +98,8 @@ jobs: echo "base ty: $(wc -c < .lint-reports/base/ty.json) bytes" - name: Generate diff summary + env: + HEAD_REF: ${{ inputs.event_name == 'pull_request' && github.head_ref || github.ref_name }} run: | python scripts/lint_diff.py \ --base-ruff .lint-reports/base/ruff.json \ @@ -105,7 +107,7 @@ jobs: --base-ty .lint-reports/base/ty.json \ --head-ty .lint-reports/head/ty.json \ --base-ref "${{ steps.base.outputs.ref }}" \ - --head-ref "${{ inputs.event_name == 'pull_request' && github.head_ref || github.ref_name }}" \ + --head-ref "$HEAD_REF" \ --output .lint-reports/summary.md cat .lint-reports/summary.md >> "$GITHUB_STEP_SUMMARY" From f8e36f0f31ba657df34a12796d335bae55728268 Mon Sep 17 00:00:00 2001 From: SHL0MS <SHL0MS@users.noreply.github.com> Date: Fri, 3 Jul 2026 13:05:28 -0400 Subject: [PATCH 45/46] field-report fixes: dob pre-warn, .env creds, show cmd, false-positive guards from a live run (NY subject, 43 brokers): - fanout default 8->5 (8+ batches time out) - setup/doctor read $HERMES_HOME/.env so creds hermes already loads are detected - new `show <subject> <broker>`: reads back case state+evidence for cheap parent re-verify - intelius: requires.dob + 5-step guided-mode gate; planner pre-warns when dob is missing - rehold.json: property-record != PII (an address-only match is not_found, not removable) - tps/fps: match_signal_notes tell the scanner to ignore SEO-templated titles - methods.md: browser backends (scan vs execute + operator chrome over CDP), property/SEO callouts - doctor: warn when browser email-mode pairs with a cloud scan backend (needs operator chrome/CDP) - ledger: found->not_found retract (false-positive), blocked->human_task_queued - autopilot: indirect-exposure web-form fallback; drop a stray f-string tests: standalone 92 pass; ruff clean. --- optional-skills/security/unbroker/SKILL.md | 16 +++-- .../references/brokers/fastpeoplesearch.json | 1 + .../unbroker/references/brokers/intelius.json | 13 ++-- .../unbroker/references/brokers/rehold.json | 48 ++++++++++++++ .../references/brokers/truepeoplesearch.json | 1 + .../security/unbroker/references/methods.md | 60 +++++++++++++++++ .../security/unbroker/scripts/autopilot.py | 18 ++++- .../security/unbroker/scripts/config.py | 20 ++++++ .../security/unbroker/scripts/ledger.py | 10 ++- .../security/unbroker/scripts/pdd.py | 65 ++++++++++++++----- .../security/unbroker/scripts/tiers.py | 20 +++++- tests/skills/test_unbroker_skill.py | 60 +++++++++++++++++ 12 files changed, 301 insertions(+), 31 deletions(-) create mode 100644 optional-skills/security/unbroker/references/brokers/rehold.json diff --git a/optional-skills/security/unbroker/SKILL.md b/optional-skills/security/unbroker/SKILL.md index e4cf6be25..7f9401599 100644 --- a/optional-skills/security/unbroker/SKILL.md +++ b/optional-skills/security/unbroker/SKILL.md @@ -63,7 +63,9 @@ verifying re-scan. - `python3` (stdlib only; no extra packages needed for the core engine). - **Optional upgrades** (the skill works zero-config without these; `setup --auto` turns on every - one it detects - each one converts a class of human tasks into agent actions): + one it detects, reading credentials from the shell env **and from `$HERMES_HOME/.env`** so keys + Hermes already loads for its own tools are picked up without re-exporting - each one converts a + class of human tasks into agent actions): - **Cloud browser (recommended default): `BROWSERBASE_API_KEY`.** `setup --auto` selects it whenever the key is present, and it is the intended baseline: a real residential-IP cloud browser **clears soft/managed CAPTCHAs (Cloudflare Turnstile, hCaptcha/reCAPTCHA checkbox) as @@ -74,8 +76,13 @@ verifying re-scan. - Email automation, two credential-free-or-not options: - **Browser mode (no password): `setup --email-mode browser`.** The agent sends opt-out/CCPA emails and opens verification links through the operator's **logged-in webmail** using - `browser_*` tools. Nothing is stored. Needs the inbox signed in in the browser Hermes uses - (a cloud browser like Browserbase won't hold the session; use a local/operator browser). + `browser_*` tools. Nothing is stored. This requires Hermes to be pointed at the operator's own + logged-in browser, **NOT** a cloud browser: a headless cloud browser (Browserbase) holds no + webmail session and is itself Cloudflare/DataDome-gated on webmail and on session-bound broker + gates (e.g. PeopleConnect guided-mode). Drive the operator's real Chrome over CDP - launch + `chrome --remote-debugging-port=9222 --user-data-dir="$HOME/.hermes/chrome-debug"` (a dedicated + debug profile signed into the webmail once, not the Default profile) and connect the browser + tools to `127.0.0.1:9222`. See `references/methods.md` -> "Browser backends: scan vs execute". Falls back to drafts for an email if the inbox isn't reachable. - **SMTP/IMAP (stored creds): `EMAIL_ADDRESS` + `EMAIL_PASSWORD`** (+ `EMAIL_SMTP_HOST` / `EMAIL_IMAP_HOST` for non-mainstream providers; gmail/outlook/yahoo/icloud/fastmail inferred). @@ -110,8 +117,9 @@ breaks reading the dossier). | `$PDD drop <subject> [--filed]` | **The one-shot legal lever**: one CA DROP request deletes from ALL registered brokers; `--filed` records it | | `$PDD plan <subject> [--priority crucial]` | Per-broker tier + method + `search_vectors` + the exact fields to disclose | | `$PDD plan <subject> --batch` | **Reduce view**: overlays ledger state, groups brokers by next action (unscanned/found/indirect/blocked/in_progress/done), collapses ownership clusters, **orders `found` cluster-parents-first + emits a tailored `parent_playbook`**, prints `next_actions` | -| `$PDD fanout <subject> [--priority crucial] [--size 8]` | Batch brokers into parallel `delegate_task` subagents (auto for large runs) | +| `$PDD fanout <subject> [--priority crucial] [--size 5]` | Batch brokers into parallel `delegate_task` subagents (auto for large runs; batches of 5 - 8+ time out) | | `$PDD record <subject> <broker> <state> [--found true] [--evidence JSON] [--disclosed F --channel C] [--reason "..."]` | Update the ledger (validated state machine); **auto-stamps `next_recheck_at`** | +| `$PDD show <subject> <broker>` | Read back a case's recorded state + evidence + disclosure log (so the parent re-verifies a subagent's `found` without re-deriving the listing URL) | | `$PDD send-email <subject> <broker> --listing <url> [--kind ccpa_indirect ...]` | Render + record the request (recipient locked to the broker's own address). **browser** mode returns a `compose` payload to send via webmail (no password); **programmatic** mode SMTP-sends | | `$PDD verify-link <subject> <broker> --text '<body>'` | **browser mode**: extract a broker's verification link from webmail text you read (anti-phishing scored) | | `$PDD poll-verification <subject> [--broker <id>]` | **programmatic mode**: poll IMAP for verification links (anti-phishing scored); auto-advances `submitted → verification_pending` | diff --git a/optional-skills/security/unbroker/references/brokers/fastpeoplesearch.json b/optional-skills/security/unbroker/references/brokers/fastpeoplesearch.json index 3cd7c90b1..389464f34 100644 --- a/optional-skills/security/unbroker/references/brokers/fastpeoplesearch.json +++ b/optional-skills/security/unbroker/references/brokers/fastpeoplesearch.json @@ -10,6 +10,7 @@ "fetch": "browser", "antibot": "datadome", "match_signal": "result", + "match_signal_notes": "SEO TRAP: title/H1/intro echoes the query ('Over 100+ FREE public records found for {Name}') with no real match behind it, and /name/{first}-{last} list pages are fuzzy-SURNAME namesakes (different states, no address overlap). Record `found` ONLY on a result CARD corroborated by the subject's address or DOB. Ignore templated title/intro/H1 text.", "by": ["name", "phone", "address"], "url_patterns": { "name": "https://www.fastpeoplesearch.com/name/{first}-{last}" diff --git a/optional-skills/security/unbroker/references/brokers/intelius.json b/optional-skills/security/unbroker/references/brokers/intelius.json index 01e8b85a2..78482811f 100644 --- a/optional-skills/security/unbroker/references/brokers/intelius.json +++ b/optional-skills/security/unbroker/references/brokers/intelius.json @@ -53,10 +53,13 @@ "gov_id": false, "account": false, "phone_callback": false, - "payment": false + "payment": false, + "dob": true }, "inputs": [ - "contact_email" + "contact_email", + "full_name", + "date_of_birth" ], "deletion": { "via": "in_flow", @@ -69,7 +72,8 @@ "playbook": [ "PeopleConnect portal (suppression.peopleconnect.us/login, privacy-center entry at /privacy-center) -- ONE flow here covers Truthfinder, Instant Checkmate, US Search, ZabaSearch, Classmates and ~15 more. DO THIS PARENT FIRST.", "Step 1 asks ONLY for an email + consent checkbox (no name/DOB, no CAPTCHA) -> sends a verification email. Least-disclosure entry: just the contact email.", - "poll-verification will pick up the verify link. The link authenticates a SESSION bound to the browser that OPENS it: the SAME agent browser must open the link and drive /guided-mode (a different browser is bounced to /login).", + "poll-verification will pick up the verify link. The link is a JWT (aud PeopleConnect-email-login then -registration), carries a deviceId, has a ~15-min TTL, and is Cloudflare-gated; it authenticates a SESSION bound to the browser that OPENS it. The SAME agent browser that submitted step 1 must open the link and drive guided-mode straight through. Do NOT hard-navigate to /guided-mode after auth -- that drops the in-memory session and bounces to /login. If the session is lost, re-request a fresh verify email and follow it through without navigating away.", + "guided-mode is a 5-STEP IDENTITY GATE, not a one-click suppress: (1) enter contact email + consent -> verify email; (2) open the verify link in the SAME browser (session/device-bound); (3) enter identity details -- this HARD-REQUIRES date of birth (immutable once saved, no skip) plus legal name; (4) Matching Records -- select the record that describes you, corroborating by address/email/phone, NOT name+DOB alone (namesakes exist); the matched record often aggregates MORE identifiers than the public listing showed (extra emails/addresses) -- expected, not alarming; (5) complete the SUPPRESSION action. So this opt-out discloses DOB + legal name + alias beyond the contact email -- collect DOB at intake (requires.dob=true) or expect a mid-flow pause.", "SUPPRESS, do NOT delete (this cluster is the exception to 'deletion beats suppression'). In guided-mode, complete the SUPPRESSION flow -- it puts you on the do-not-display list, which is what actually removes you from Intelius/TruthFinder/etc. Their privacy-center states: deleting your user data 'must delete any and all suppressions associated with your user', and 'Deleting your user information will NOT prevent other users from searching for your information through the people search websites. To suppress your information ... you must maintain your user information on file with the Suppression Center.'", "Therefore do NOT press 'Right to Delete / DELETE MY USER DATA' if the goal is search-visibility removal: it wipes your suppression and the public-records listing re-appears. Use the delete button ONLY if the operator's explicit goal is purging held account data (accept re-listing + re-suppression).", "Keep the account/suppression on file; do not delete it later. If the portal breaks: sister addresses privacy@intelius.com / privacy@truthfinder.com / privacy@instantcheckmate.com / support@ussearch.com / privacy@classmates.com; phone 1-888-245-1655.", @@ -78,7 +82,8 @@ "notes": "PeopleConnect portal covers the cluster via SUPPRESSION (maintained), not deletion (see the deletion lane note: delete removes suppressions and does not stop public-records re-listing). Authorized-agent requests: signed written authorization (full name, address, phone, the email the consumer uses) or POA; for Right-to-Delete they verify agent authority with the consumer by email. Verified from the live privacy policy + suppression privacy-center 2026-07-02.", "quirks": [ "Step 1 (suppression.peopleconnect.us/login) asks ONLY for an email + a consent checkbox, then 'Continue' -> a verification email with a link. No CAPTCHA, no name/DOB at step 1. Least-disclosure entry: just the contact email. Verified live 2026-06-30.", - "The verification link authenticates a SESSION and lands on /guided-mode. That session is bound to the browser that OPENED it; a different browser hitting /guided-mode is redirected back to /login. So for hands-off automation the SAME agent browser must open the verify link (Mode B: read inbox -> agent browser navigates the link -> drive guided-mode).", + "The verification link authenticates a SESSION and lands on /guided-mode. That session is bound to the browser that OPENED it; a different browser hitting /guided-mode is redirected back to /login. So for hands-off automation the SAME agent browser must open the verify link (Mode B: read inbox -> agent browser navigates the link -> drive guided-mode). Link is a JWT (aud PeopleConnect-email-login -> -registration) carrying a deviceId, ~15-min TTL, Cloudflare-gated. Do NOT hard-navigate to /guided-mode after auth (drops the in-memory session -> /login); if lost, re-request a fresh verify email and follow it straight through.", + "DOB GATE: guided-mode hard-requires date of birth (immutable once saved, no skip) to match records, so requires.dob=true. DOB is not collected at intake by default (sensitive, unneeded for scanning). If absent, the planner pre-warns (needs_operator_input) that this broker needs a human touchpoint; collect it with `intake --dob` up front to run hands-off. The matching step discloses DOB + legal name + alias beyond the contact email -- corroborate the record by address/email/phone, never name+DOB alone.", "INVERTED delete/suppress: SUPPRESSION is the do-not-display list and is what removes you from the people-search sites; it requires keeping your identifiers on file. 'DELETE MY USER DATA' deletes those suppressions and does NOT stop the sites showing you (public records re-list). Verbatim from the privacy-center: deleting user data 'must delete any and all suppressions associated with your user'; and 'Deleting your user information will NOT prevent other users from searching for your information ... To suppress your information ... you must maintain your user information on file with the Suppression Center.' So prefer suppression; use delete only for a deliberate data-purge. Verified live 2026-07-02.", "Their published request metrics (2025): 33,513 deletion requests, median response < 1 day -- deletion is fast, but per above it is the wrong lever for search-visibility on this cluster." ], diff --git a/optional-skills/security/unbroker/references/brokers/rehold.json b/optional-skills/security/unbroker/references/brokers/rehold.json new file mode 100644 index 000000000..c8e633957 --- /dev/null +++ b/optional-skills/security/unbroker/references/brokers/rehold.json @@ -0,0 +1,48 @@ +{ + "id": "rehold", + "name": "Rehold", + "category": "property_records", + "priority": "long_tail", + "jurisdictions": [ + "US" + ], + "search": { + "method": "url_pattern", + "url": "https://rehold.com/", + "fetch": "browser", + "match_signal": "result", + "match_signal_notes": "PROPERTY-RECORD, NOT PII. An address match here shows only PUBLIC PROPERTY RECORDS (build year, beds/baths, last sale price, incident history). Resident/owner NAMES sit behind 'View full report', which leads to a paywall/signup, so no personal PII is publicly exposed. Public property records are NOT removable. Record `found` ONLY if a resident NAME matching the subject is publicly displayed on the free page; an address-only match is `not_found` (nothing to opt out of).", + "access": "paywall", + "by": [ + "address" + ] + }, + "optout": { + "tier": "T2", + "method": "web_form", + "url": "https://rehold.com/optout", + "requires": { + "profile_url": true, + "email_verification": false, + "captcha": false, + "gov_id": false, + "account": false, + "phone_callback": false, + "payment": false + }, + "inputs": [ + "profile_url" + ], + "notes": "Address-anchored property/reverse-address site. Only pursue an opt-out if the scan found a publicly displayed resident NAME for the subject (see match_signal_notes); a bare public property record is not personal PII and is not removable. If the subject's personal profile IS shown, submit the profile URL to the opt-out endpoint and confirm the live flow in a residential browser before the first submission, then set last_verified.", + "quirks": [ + "Distinguish 'address exists in a public property DB' (non-removable) from 'the subject's personal profile is displayed' (removable). Only the latter is an actionable exposure.", + "'View full report' is a paywall/signup, not proof of a public listing.", + "Opt-out endpoint UNVERIFIED: confirm the live flow before the first submission." + ], + "est_processing_days": 3, + "reappearance_risk": "low" + }, + "last_verified": null, + "source": "curated", + "confidence": "documented" +} diff --git a/optional-skills/security/unbroker/references/brokers/truepeoplesearch.json b/optional-skills/security/unbroker/references/brokers/truepeoplesearch.json index 0523fdab1..1ce9bc7b1 100644 --- a/optional-skills/security/unbroker/references/brokers/truepeoplesearch.json +++ b/optional-skills/security/unbroker/references/brokers/truepeoplesearch.json @@ -10,6 +10,7 @@ "fetch": "browser", "antibot": "datadome", "match_signal": "result", + "match_signal_notes": "SEO TRAP: the page title/H1/intro auto-inserts the query ('FREE public records found for {Name} in {City}') even with ZERO real matches. That templated echo is NOT a result. Record `found` ONLY on an actual result CARD corroborated by the subject's address or DOB; unrelated same-name cards in other states are namesakes. Ignore the title/intro/H1 text entirely.", "by": ["name", "phone", "address", "email"], "url_patterns": { "name": "https://www.truepeoplesearch.com/results?name={First%20Last}&citystatezip={City,%20ST}" diff --git a/optional-skills/security/unbroker/references/methods.md b/optional-skills/security/unbroker/references/methods.md index ced0c8a80..14b4aafef 100644 --- a/optional-skills/security/unbroker/references/methods.md +++ b/optional-skills/security/unbroker/references/methods.md @@ -88,6 +88,28 @@ listing: third party's record - the consent gate correctly blocks acting on it. See "Indirect exposure" in the web_form section for what the subject *can* still request. +Two more false-positive traps that a naive scan records as `found` when it should not: + - **Property record != PII (address-anchored sites).** Reverse-address / property sites (rehold, + clustrmaps-style) can match on a public **property record** (build year, beds/baths, last sale + price, incidents) without exposing the subject's personal info - the resident/owner NAME is behind + a "View full report" paywall/signup. Distinguish "this address exists in a public property DB" + (non-removable, `not_found`) from "the subject's personal profile is displayed" (removable, + `found`). Record `found` ONLY if a resident name matching the subject is publicly shown; an + address-only match is `not_found` - there is nothing to opt out of, and public property records are + not removable anyway. See `rehold.json` `search.match_signal_notes`. + - **SEO-templated title/H1 fakes a "found".** Many people-search sites auto-insert the query into the + page `<title>`, H1, and intro copy ("FREE public records found for {Name} in {City}", "Over 100+ + FREE public records found for {Name}"). That echo is **templating, not a result** - the actual + result cards are often unrelated namesakes in other states. A `match_signal` on title/intro text + yields false positives. Require a real result **card** corroborated by the subject's address or + DOB, and ignore the templated title/intro/H1 entirely. See `truepeoplesearch.json` / + `fastpeoplesearch.json` `search.match_signal_notes`. + +Both are why the **parent re-verifies every `found` before acting** rule is load-bearing (`pdd.py show +<subject> <broker>` reads back a subagent's recorded evidence so the parent can re-verify without +re-deriving the listing URL). If a `found` turns out to be a false positive, correct it with a fresh +`record ... not_found` carrying an evidence note explaining the retraction. + ## web_form 1. `browser_navigate` to `optout.url`; `browser_snapshot` to read the form. @@ -182,6 +204,44 @@ stealth/operator-browser pass (`methods.md` → scan ladder 3b - the operator's browser is the reliable unblock). Without a cloud browser configured, soft-CAPTCHA brokers drop to T2 and become human tasks. **Never use a third-party CAPTCHA-defeating service.** +## Browser backends: scan vs execute + +Two different jobs need two different browsers. Getting this wrong is the single biggest cause of a +run stalling in Phase 2. + +- **Phase 1 (scan, read-only):** a cloud stealth browser (Browserbase) or the `scrapling` skill is + ideal. On a residential IP with a real fingerprint it passes managed challenges (Cloudflare + Turnstile, hCaptcha checkbox) and reads anti-bot people-search pages that `web_extract` and the + proxyless agent browser cannot. This is what the skill's `browser_backend` setting governs + (`auto` picks Browserbase when `BROWSERBASE_API_KEY` is present - now also read from + `$HERMES_HOME/.env`, not just the shell env, so `doctor`/`setup --auto` detect the key Hermes + already loads for its own tools). +- **Phase 2 (execute: opt-out forms, webmail sends, session-bound multi-step gates):** the work must + run in the **operator's own everyday browser** - real fingerprint, residential IP, AND the + operator's logged-in sessions. A headless cloud browser is the WRONG default here for two reasons: + (1) it is not signed into the operator's webmail, so browser-mode email sends and confirmation-link + opens have no inbox to act in; and (2) it is itself Cloudflare/DataDome-gated on exactly the + multi-step flows that matter (e.g. PeopleConnect guided-mode, whose verify link is session- and + device-bound to the browser that opens it - a cloud browser both fails the challenge and breaks the + binding). +- **How to drive the operator's browser (CDP).** Point Hermes's browser tools at the operator's real + Chrome over the DevTools protocol: launch + `chrome --remote-debugging-port=9222 --user-data-dir="$HOME/.hermes/chrome-debug"` and connect the + browser backend to `127.0.0.1:9222`. Use a **dedicated debug profile** (`chrome-debug`), NOT the + operator's Default Chrome profile, and have the operator sign into their webmail (and any needed + broker accounts) in that profile once. That single browser then carries residential IP + real + fingerprint + logged-in sessions, which is precisely what Phase-2 flows need. (This is a Hermes-side + browser setup, not a `pdd` config value; `browser_backend` above only selects the Phase-1 scan + browser.) +- **Always-available fallback:** if no CDP browser is wired up, use the operator-in-the-loop path + (scan ladder 3b) - hand over paste-ready URLs and field-by-field least-disclosure guidance, pausing + before submit. It never fails; it just needs a human present. + +Backend precedence, most to least autonomous: **operator Chrome over CDP** (Phase 2, hands-off once +the profile is signed in) > **Browserbase cloud stealth** (Phase 1 scanning, plus managed-captcha +forms that need no login) > **proxyless agent browser** (only already-unblocked sites) > +**operator-in-the-loop** (paste-ready URLs; the last-resort unblock that always works). + ## Ownership clusters - DO PARENTS FIRST (playbooks live in the broker records) Many brokers are resold shells of a few parents, so **one parent removal clears a whole cluster of diff --git a/optional-skills/security/unbroker/scripts/autopilot.py b/optional-skills/security/unbroker/scripts/autopilot.py index 76d6f9caa..746106185 100644 --- a/optional-skills/security/unbroker/scripts/autopilot.py +++ b/optional-skills/security/unbroker/scripts/autopilot.py @@ -283,7 +283,7 @@ def next_actions(dossier: dict, brokers_list: list[dict], cfg: dict, "broker_id": bid, "command": f"python3 scripts/pdd.py poll-verification {subject_id} --broker {bid}", "then": "browser_navigate the returned link IN THE SAME AGENT BROWSER (sessions are " - f"browser-bound), complete the flow, then record: awaiting_processing", + "browser-bound), complete the flow, then record: awaiting_processing", }) elif email_mode == "browser": actions.append({ @@ -327,7 +327,21 @@ def next_actions(dossier: dict, brokers_list: list[dict], cfg: dict, # 5) indirect exposure: targeted delete-my-PII requests for row in groups.get("indirect_exposure") or []: bid = row["broker_id"] - if (email_mode in ("programmatic", "alias") and mail["smtp"]) or email_mode == "browser": + has_email = bool(row.get("optout_email") or (row.get("deletion") or {}).get("email")) + if not has_email and row.get("optout_url"): + # No email lane (e.g. ThatsThem is web-form-only): drive the opt-out FORM, submitting + # ONLY the subject's own identifiers to scrub from the third party's record. + actions.append({ + "type": "indirect_web_form", + "broker_id": bid, "confirm_first": confirm_first, + "optout_url": row.get("optout_url"), + "steps": [f"browser_navigate {row.get('optout_url')}", + "submit ONLY the subject's own identifiers (the fields the form requires) to " + "remove them from the third party's record; disclose nothing extra", + "confirm the success state, screenshot into evidence/"], + "after": f"python3 scripts/pdd.py record {subject_id} {bid} submitted --channel web_form", + }) + elif (email_mode in ("programmatic", "alias") and mail["smtp"]) or email_mode == "browser": actions.append({ "type": "indirect_email_send", "broker_id": bid, "confirm_first": confirm_first, diff --git a/optional-skills/security/unbroker/scripts/config.py b/optional-skills/security/unbroker/scripts/config.py index 7f53554fe..e1eb1c3c7 100644 --- a/optional-skills/security/unbroker/scripts/config.py +++ b/optional-skills/security/unbroker/scripts/config.py @@ -62,6 +62,26 @@ def save_config(cfg: dict) -> Path: return storage.write_json(paths.config_path(), merged) +def dotenv_env() -> dict: + """Shell env overlaid on `$HERMES_HOME/.env`, so capability detection sees the creds Hermes + loads for its own tools (BROWSERBASE_API_KEY, EMAIL_*, AGENTMAIL_API_KEY, ...) even though the + terminal-tool shell doesn't export them. Shell env wins; the .env only fills gaps.""" + merged: dict = {} + p = paths.hermes_home() / ".env" + if p.exists(): + try: + for line in p.read_text(encoding="utf-8", errors="replace").splitlines(): + line = line.strip() + if not line or line.startswith("#") or "=" not in line: + continue + k, v = line.split("=", 1) + merged[k.strip()] = v.strip().strip('"').strip("'") + except OSError: + pass + merged.update(os.environ) + return merged + + def detect_capabilities(env: dict | None = None) -> dict: """Report which opt-in upgrades are available without extra setup.""" env = os.environ if env is None else env diff --git a/optional-skills/security/unbroker/scripts/ledger.py b/optional-skills/security/unbroker/scripts/ledger.py index e5ec331a1..2483ee6a8 100644 --- a/optional-skills/security/unbroker/scripts/ledger.py +++ b/optional-skills/security/unbroker/scripts/ledger.py @@ -21,7 +21,10 @@ TRANSITIONS: dict[str, set[str]] = { "new": {"searching", "found", "not_found", "indirect_exposure", "blocked"}, "searching": {"not_found", "found", "indirect_exposure", "blocked"}, "not_found": {"searching", "found", "indirect_exposure", "blocked"}, - "found": {"action_selected", "submitted", "human_task_queued", "indirect_exposure", "blocked"}, + # found -> not_found: a parent re-verification (or re-scan) found the "found" was a false + # positive (namesake, or an address-only property-record match) -- retract it with evidence. + "found": {"action_selected", "submitted", "human_task_queued", "indirect_exposure", "blocked", + "not_found"}, # indirect_exposure: subject's PII (email/phone/name) sits on a THIRD PARTY's record. The # self-service opt-out form does not apply; the lever is a targeted CCPA/GDPR delete-my-PII # request (-> submitted) or a human task. Re-scan can clear it (-> not_found) or upgrade it to a @@ -43,7 +46,10 @@ TRANSITIONS: dict[str, set[str]] = { # blocked: automated tools (web_extract/proxyless browser) couldn't read the site. A later pass # -- a stealth/cloud browser OR guiding the operator's own (residential) browser -- can resolve it # to any real scan verdict, so blocked reaches not_found / indirect_exposure too, not just found. - "blocked": {"searching", "found", "not_found", "indirect_exposure", "action_selected"}, + # blocked -> human_task_queued: some blocked sites need an operator step to proceed at all + # (face-recognition sites needing a selfie/gov-ID, etc.), so route them to the digest. + "blocked": {"searching", "found", "not_found", "indirect_exposure", "action_selected", + "human_task_queued"}, } diff --git a/optional-skills/security/unbroker/scripts/pdd.py b/optional-skills/security/unbroker/scripts/pdd.py index 09039ab47..6d28a3a45 100644 --- a/optional-skills/security/unbroker/scripts/pdd.py +++ b/optional-skills/security/unbroker/scripts/pdd.py @@ -58,9 +58,10 @@ def _require_subject(subject_id: str) -> dict: def cmd_setup(args) -> None: if getattr(args, "auto", False): - # Autonomous path: detect capabilities and pick the most autonomous valid - # config without asking anyone. Explicit flags still win below. - cfg = config_mod.auto_configure() + # Autonomous path: detect capabilities and pick the most autonomous valid config without + # asking anyone. Read creds from $HERMES_HOME/.env too (the terminal shell doesn't export + # them). Explicit flags still win below. + cfg = config_mod.auto_configure(env=config_mod.dotenv_env()) else: cfg = config_mod.load_config() for key in ("autonomy", "email_mode", "browser_backend", "tracker_backend", "encryption"): @@ -123,7 +124,7 @@ def cmd_doctor(args) -> None: import platform cfg = config_mod.load_config() - caps = config_mod.detect_capabilities() + caps = config_mod.detect_capabilities(config_mod.dotenv_env()) # see creds in $HERMES_HOME/.env too data = paths_mod.data_dir() writable = _check_writable(data) curated = len(brokers_mod._load_curated()) @@ -185,8 +186,17 @@ def cmd_doctor(args) -> None: "verify links via your logged-in webmail); or set EMAIL_* for SMTP/IMAP.") elif cfg["email_mode"] == "browser": L.append(" Email mode: browser (no password) - the agent sends opt-outs and opens verify " - "links via the operator's logged-in webmail. Ensure that inbox is signed in in the " - "browser Hermes uses (a cloud browser won't hold the session); else it falls back to drafts.") + "links via the operator's logged-in webmail. This needs Hermes pointed at the " + "operator's OWN Chrome over CDP (launch with --remote-debugging-port=9222 " + "--user-data-dir=~/.hermes/chrome-debug, signed into the webmail once); else it falls " + "back to drafts. See methods.md 'Browser backends'.") + cloud_scan = cfg.get("browser_backend") == "browserbase" or ( + cfg.get("browser_backend") == "auto" and caps.get("browserbase")) + if cloud_scan: + L.append(" NOTE: your scan backend is a cloud browser (Browserbase). It is great for " + "Phase-1 scanning but CANNOT be the browser that sends webmail (no inbox session) " + "and is itself Cloudflare/DataDome-gated on session-bound gates (e.g. PeopleConnect). " + "For Phase-2 email/verify, drive the operator's Chrome over CDP as above.") if not crypto.is_engaged(): L.append(" Storage: dossiers are PLAINTEXT JSON (0600 under HERMES_HOME). " "Run `setup --encryption age` for at-rest encryption.") @@ -390,18 +400,23 @@ def cmd_fanout(args) -> None: batches = [] for i, ids in enumerate(grouping["batches"], 1): brief = ( - f"You are scan worker {i} of {len(grouping['batches'])} for the `unbroker` " - f"skill. First load the `unbroker` skill and read its references/methods.md. " - f"Subject id: {args.subject}. Handle ONLY these brokers: {', '.join(ids)}. " + f"You are scan worker {i} of {len(grouping['batches'])} for the `unbroker` skill. First " + f"load the `unbroker` skill and read its references/methods.md. Use the `web` toolset " + f"(web_search `site:` + web_extract), NOT `browser` (browser navigation is heavy and times " + f"out). Subject id: {args.subject}. Handle ONLY these brokers: {', '.join(ids)}. " f"For EACH broker: read references/brokers/<id>.json; run EVERY search vector from " f"`pdd.py plan {args.subject}` (filtered to your brokers); build URLs from search.url_patterns " f"and heed url_format_quirks; a 404 is INCONCLUSIVE (rebuild/try the on-site search box), not " - f"not_found; confirm the SUBJECT vs namesakes/relatives before recording; if search.antibot is " - f"set and no stealth/cloud browser is available, record `blocked`. Record each outcome via " - f"`pdd.py record {args.subject} <broker> <found|not_found|indirect_exposure|blocked> " - f"--found <bool> --evidence '{{\"listing_urls\":[...]}}'`. Mode: {mode}. " - f"Log any newly-discovered URL/format quirks into the broker JSON. " - f"Return a concise structured per-broker report." + f"not_found. ECONOMY: at most ~3 web calls per broker; the moment a page shows antibot " + f"(Cloudflare 'just a moment'/DataDome) or hangs, record `blocked` and move on -- do NOT " + f"retry-loop. Confirm the SUBJECT vs namesakes/relatives by ADDRESS/DOB before recording " + f"`found` (ignore SEO-templated page titles/intro that just echo the query -- require a real " + f"result card; a public property/address record with no displayed personal NAME is " + f"not_found, not found). Record each outcome via `pdd.py record {args.subject} <broker> " + f"<found|not_found|indirect_exposure|blocked> --found <bool> --evidence '{{\"listing_urls\":[...]}}'`. " + f"Mode: {mode}. Broker JSON files are READ-ONLY for you -- do NOT edit them; if you discover " + f"a URL/quirk, put it in your report for the parent to fold in. Return a concise structured " + f"per-broker report." ) batches.append({"batch": i, "brokers": ids, "brief": brief}) _out({ @@ -631,6 +646,19 @@ def cmd_due(args) -> None: "note": "run `next` for the concrete follow-up action per case"}) +def cmd_show(args) -> None: + """Read a case's recorded state + evidence (so the parent can re-verify a subagent's `found` + without re-deriving listing URLs).""" + _require_subject(args.subject) + case = ledger_mod.get_case(args.subject, args.broker) + _out({"broker": args.broker, "state": case.get("state"), "found": case.get("found"), + "evidence": case.get("evidence") or {}, + "disclosure_log": case.get("disclosure_log") or [], + "next_recheck_at": case.get("next_recheck_at"), + "human_task_reason": case.get("human_task_reason"), + "history": case.get("history") or []}) + + def cmd_status(args) -> None: _require_subject(args.subject) print(report_mod.render_markdown(args.subject)) @@ -716,7 +744,7 @@ def build_parser() -> argparse.ArgumentParser: s = sub.add_parser("fanout", help="batch brokers into parallel delegate_task subagents (large runs)") s.add_argument("subject") s.add_argument("--priority", action="append", choices=["crucial", "high", "standard", "long_tail"]) - s.add_argument("--size", type=int, default=8, help="brokers per subagent batch (default 8)") + s.add_argument("--size", type=int, default=5, help="brokers per subagent batch (default 5; 8+ times out)") s.add_argument("--optout", action="store_true", help="brief authorizes opt-out submission (default: read-only scan)") s.set_defaults(func=cmd_fanout) @@ -769,6 +797,11 @@ def build_parser() -> argparse.ArgumentParser: s.add_argument("subject") s.set_defaults(func=cmd_tasks) + s = sub.add_parser("show", help="read a case's state + evidence (for parent re-verification)") + s.add_argument("subject") + s.add_argument("broker") + s.set_defaults(func=cmd_show) + s = sub.add_parser("due", help="cases whose recheck window has arrived (cron re-scan queue)") s.add_argument("subject") s.set_defaults(func=cmd_due) diff --git a/optional-skills/security/unbroker/scripts/tiers.py b/optional-skills/security/unbroker/scripts/tiers.py index 8d145b8ce..d83efcf33 100644 --- a/optional-skills/security/unbroker/scripts/tiers.py +++ b/optional-skills/security/unbroker/scripts/tiers.py @@ -17,6 +17,8 @@ HARD_HUMAN = ("gov_id", "fax", "mail", "phone_voice") def select_tier(broker: dict, email_mode: str = "draft_only", browser_clears_captcha: bool = False) -> str: req = ((broker.get("optout") or {}).get("requires")) or {} + if not isinstance(req, dict): + req = {} # defensive: a malformed record (e.g. requires as a list) must not crash planning if any(req.get(k) for k in HARD_HUMAN): return "T3" @@ -43,9 +45,20 @@ def plan(subject_dossier: dict, brokers_list: list[dict], cfg: dict, for b in brokers_list: opt = b.get("optout") or {} search = b.get("search") or {} + # Defensive shape coercion: a subagent may have written a malformed record (requires as a + # list, quirks as a string). Normalize here so nothing downstream crashes on a bad broker file. + req = opt.get("requires") if isinstance(opt.get("requires"), dict) else {} + q = opt.get("quirks") + quirks = q if isinstance(q, list) else ([q] if isinstance(q, str) and q else []) tier = select_tier(b, email_mode, browser_clears_captcha) disclosure = dossier_mod.select_disclosure(subject_dossier, opt.get("inputs", [])) svectors = vectors_mod.search_vectors(subject_dossier, b) + # Pre-warn (don't discover mid-flow): a broker whose identity gate hard-requires DOB will + # force a human touchpoint if DOB was not collected at intake (§4.1). Surface it now. + prewarn: list[str] = [] + if req.get("dob") and not (subject_dossier.get("identity") or {}).get("date_of_birth"): + prewarn.append("date_of_birth: this broker's identity gate requires DOB to match records; " + "collect it up front (intake --dob) or expect a mid-flow human pause") actions.append({ "broker_id": b.get("id"), "broker_name": b.get("name"), @@ -61,10 +74,11 @@ def plan(subject_dossier: dict, brokers_list: list[dict], cfg: dict, "optout_url": opt.get("url"), "optout_email": opt.get("email"), "disclosure_fields": sorted(disclosure.keys()), + "needs_operator_input": prewarn, "owns": b.get("owns") or [], "notes": opt.get("notes", ""), - "optout_quirks": opt.get("quirks") or [], - "optout_requires": opt.get("requires") or {}, + "optout_quirks": quirks, + "optout_requires": req, # The DELETION lane (right-to-delete), distinct from listing suppression. Structured so # the autopilot can route to it: {via: email|in_flow|web_form, email?, url?, kinds?, notes?} "deletion": opt.get("deletion") or {}, @@ -75,7 +89,7 @@ def plan(subject_dossier: dict, brokers_list: list[dict], cfg: dict, return actions -def fanout(brokers_list: list[dict], batch_size: int = 8) -> dict: +def fanout(brokers_list: list[dict], batch_size: int = 5) -> dict: """Group brokers into batches for parallel `delegate_task` scan subagents. Scanning many brokers serially is slow and burns context; above `batch_size` diff --git a/tests/skills/test_unbroker_skill.py b/tests/skills/test_unbroker_skill.py index f4342d7e2..77599c934 100644 --- a/tests/skills/test_unbroker_skill.py +++ b/tests/skills/test_unbroker_skill.py @@ -472,6 +472,14 @@ def test_fanout_batches_large_runs(): assert small["should_fanout"] is False and small["batches"] == [["x", "y"]] +def test_fanout_default_batch_size_is_five(): + # Field report: 8-broker batches time out; the default dropped to 5. + g = tiers.fanout([{"id": f"b{i}"} for i in range(12)]) + assert all(len(b) <= 5 for b in g["batches"]) + assert g["batches"][0] == [f"b{i}" for i in range(5)] + assert len(g["batches"]) == 3 # 5 + 5 + 2 + + def test_plan_surfaces_antibot(): d = _consenting() broker = {"id": "tps", "optout": {"requires": {}}, "search": {"antibot": "datadome", "by": ["name"]}} @@ -479,6 +487,21 @@ def test_plan_surfaces_antibot(): assert actions[0]["antibot"] == "datadome" +def test_plan_prewarns_when_dob_required_but_missing(): + # requires.dob gated broker (e.g. PeopleConnect guided-mode): warn up front, not mid-flow. + broker = {"id": "intelius", "search": {"by": ["name"]}, + "optout": {"requires": {"dob": True, "email_verification": True}, "inputs": ["contact_email"]}} + no_dob = _consenting() + no_dob["identity"].pop("date_of_birth") + warned = tiers.plan(no_dob, [broker], config.DEFAULT_CONFIG)[0] + assert any("date_of_birth" in w for w in warned["needs_operator_input"]) + # A new requires key must not perturb tier selection. + assert warned["tier"] == tiers.select_tier( + {"optout": {"requires": {"email_verification": True}}}, "draft_only") + with_dob = tiers.plan(_consenting(), [broker], config.DEFAULT_CONFIG)[0] + assert with_dob["needs_operator_input"] == [] + + def test_plan_surfaces_optout_quirks_and_email(): d = _consenting() broker = {"id": "radaris", "search": {"by": ["name"]}, @@ -1269,6 +1292,43 @@ def test_send_email_is_idempotent_browser_mode(): assert again.get("skipped") is True # not re-sent +def test_show_reads_back_case_state_and_evidence(): + with temp_env(): + sid = _run(["intake", "--full-name", "Jane Q. Public", + "--email", "jane@example.com", "--consent"])["subject_id"] + _run(["record", sid, "radaris", "found", "--found", "true", + "--evidence", '{"listing_urls": ["https://radaris.com/p/x"]}']) + shown = _run(["show", sid, "radaris"]) + assert shown["broker"] == "radaris" and shown["state"] == "found" + assert shown["found"] is True + assert shown["evidence"].get("listing_urls") == ["https://radaris.com/p/x"] + # Unknown case returns a fresh (new) case, not an error. + empty = _run(["show", sid, "not_a_broker"]) + assert empty["state"] == "new" and empty["evidence"] == {} + + +def test_dotenv_env_fills_missing_creds_and_shell_wins(): + prev_home = os.environ.get("HERMES_HOME") + prev_key = os.environ.get("BROWSERBASE_API_KEY") + with tempfile.TemporaryDirectory() as d: + os.environ["HERMES_HOME"] = d + (Path(d) / ".env").write_text( + '# comment\nBROWSERBASE_API_KEY="from_dotenv"\nFIRECRAWL_API_KEY=fc_123\n', encoding="utf-8") + try: + os.environ.pop("BROWSERBASE_API_KEY", None) + merged = config.dotenv_env() + assert merged["BROWSERBASE_API_KEY"] == "from_dotenv" # filled from .env + assert merged["FIRECRAWL_API_KEY"] == "fc_123" # quotes/comment handled + os.environ["BROWSERBASE_API_KEY"] = "from_shell" + assert config.dotenv_env()["BROWSERBASE_API_KEY"] == "from_shell" # shell wins + finally: + for k, v in (("HERMES_HOME", prev_home), ("BROWSERBASE_API_KEY", prev_key)): + if v is None: + os.environ.pop(k, None) + else: + os.environ[k] = v + + def test_registry_candidate_urls_newest_first_with_floor(): urls = registry.ca_candidate_urls(__import__("datetime").date(2027, 3, 1)) assert urls[0].endswith("registry2027.csv") and urls[-1].endswith("registry2025.csv") From a35ac254374065da0c0426fe4b2a2356f87a37ae Mon Sep 17 00:00:00 2001 From: SHL0MS <SHL0MS@users.noreply.github.com> Date: Fri, 3 Jul 2026 13:16:06 -0400 Subject: [PATCH 46/46] add `cdp`: launch/detect operator chrome over CDP for phase-2 browser + webmail phase-2 work (sending webmail, clearing session-bound gates like peopleconnect guided-mode) needs the operator's own logged-in browser, not a cloud browser. new `pdd.py cdp`: - finds chrome/chromium/brave/edge (macos/linux/windows), launches it detached on a dedicated debug profile ($HERMES_HOME/chrome-debug) with --remote-debugging-port, waits for the port, prints the CDP endpoint (webSocketDebuggerUrl) - `--check`: report whether a debug browser is already live (never double-launches) - `--print`: emit the exact command for the operator to run themselves - doctor, SKILL.md, and methods.md all point at it - windows-safe detach (start_new_session on posix, DETACHED_PROCESS on windows); stdlib only tests: standalone 98, PR 96 (+6 cdp); ruff + windows-footguns clean. --- optional-skills/security/unbroker/SKILL.md | 5 +- .../security/unbroker/references/methods.md | 6 +- .../security/unbroker/scripts/cdp.py | 159 ++++++++++++++++++ .../security/unbroker/scripts/pdd.py | 75 ++++++++- tests/skills/test_unbroker_skill.py | 72 ++++++++ 5 files changed, 313 insertions(+), 4 deletions(-) create mode 100644 optional-skills/security/unbroker/scripts/cdp.py diff --git a/optional-skills/security/unbroker/SKILL.md b/optional-skills/security/unbroker/SKILL.md index 7f9401599..8cbb9c83e 100644 --- a/optional-skills/security/unbroker/SKILL.md +++ b/optional-skills/security/unbroker/SKILL.md @@ -82,7 +82,9 @@ verifying re-scan. gates (e.g. PeopleConnect guided-mode). Drive the operator's real Chrome over CDP - launch `chrome --remote-debugging-port=9222 --user-data-dir="$HOME/.hermes/chrome-debug"` (a dedicated debug profile signed into the webmail once, not the Default profile) and connect the browser - tools to `127.0.0.1:9222`. See `references/methods.md` -> "Browser backends: scan vs execute". + tools to `127.0.0.1:9222`. **`$PDD cdp` launches this for you** (finds Chrome/Chromium/Brave/Edge, + starts it detached on the dedicated profile, prints the CDP endpoint; `--check` to test, `--print` + for the command). See `references/methods.md` -> "Browser backends: scan vs execute". Falls back to drafts for an email if the inbox isn't reachable. - **SMTP/IMAP (stored creds): `EMAIL_ADDRESS` + `EMAIL_PASSWORD`** (+ `EMAIL_SMTP_HOST` / `EMAIL_IMAP_HOST` for non-mainstream providers; gmail/outlook/yahoo/icloud/fastmail inferred). @@ -109,6 +111,7 @@ breaks reading the dossier). |---|---| | `$PDD setup --auto` | **Autonomous setup**: detect capabilities, pick the most autonomous valid config (no questions) | | `$PDD doctor` | Readiness check: config, broker count, and which upgrades are on/available | +| `$PDD cdp [--check] [--print] [--port N]` | Launch/detect the operator's Chrome over CDP for Phase-2 browser + webmail (dedicated debug profile; the reliable way to send webmail and clear session-bound gates) | | `$PDD intake --full-name "..." [--alias ...] [--email ... --phone ...] [--city --state] [--prior-location "City,ST"] --consent` | Create a consenting subject; captures aliases + multiple emails/phones + prior locations; prints `subject_id` | | `$PDD next <subject>` | **The autonomous loop driver**: ordered agent actions right now + human digest + `next_wake_at` | | `$PDD brokers [--priority crucial]` | List the people-search broker database (curated + live) | diff --git a/optional-skills/security/unbroker/references/methods.md b/optional-skills/security/unbroker/references/methods.md index 14b4aafef..1eb167483 100644 --- a/optional-skills/security/unbroker/references/methods.md +++ b/optional-skills/security/unbroker/references/methods.md @@ -232,7 +232,11 @@ run stalling in Phase 2. broker accounts) in that profile once. That single browser then carries residential IP + real fingerprint + logged-in sessions, which is precisely what Phase-2 flows need. (This is a Hermes-side browser setup, not a `pdd` config value; `browser_backend` above only selects the Phase-1 scan - browser.) + browser.) **The skill launches this for you: `pdd.py cdp`** finds a Chrome/Chromium/Brave/Edge + binary, starts it detached on the dedicated profile, waits for the debug port, and prints the CDP + endpoint (`webSocketDebuggerUrl`). `pdd.py cdp --check` reports whether a debug browser is already + live (and never launches a second one); `pdd.py cdp --print` just emits the exact command for the + operator to run themselves. Point the browser tools at the `endpoint` it returns. - **Always-available fallback:** if no CDP browser is wired up, use the operator-in-the-loop path (scan ladder 3b) - hand over paste-ready URLs and field-by-field least-disclosure guidance, pausing before submit. It never fails; it just needs a human present. diff --git a/optional-skills/security/unbroker/scripts/cdp.py b/optional-skills/security/unbroker/scripts/cdp.py new file mode 100644 index 000000000..0d4beeaac --- /dev/null +++ b/optional-skills/security/unbroker/scripts/cdp.py @@ -0,0 +1,159 @@ +#!/usr/bin/env python3 +"""Launch (or detect) the operator's local Chrome/Chromium over the DevTools Protocol (CDP). + +Phase-2 work -- sending opt-out/CCPA email through the operator's logged-in webmail, and driving +session-bound multi-step opt-out gates (e.g. PeopleConnect guided-mode) -- must run in the +operator's OWN browser: real fingerprint, residential IP, and the operator's signed-in sessions. +A headless cloud browser (Browserbase) is the wrong tool there (it has no webmail session and is +itself anti-bot-gated on those exact flows). This module launches the operator's real Chrome with +remote debugging on a DEDICATED profile so Hermes's browser tools can attach at 127.0.0.1:<port>. + +Stdlib only; cross-platform (macOS / Linux / Windows). Nothing here touches a password or PII. +""" +from __future__ import annotations + +import json +import os +import shutil +import subprocess +import sys +import urllib.error +import urllib.request +from pathlib import Path + +import paths + +DEFAULT_PORT = 9222 + +# Chromium-family binaries we know how to drive, in preference order. Names first (works on any OS +# where one is on PATH), then per-OS absolute-path fallbacks below. +_PATH_NAMES = ( + "google-chrome", "google-chrome-stable", "chromium", "chromium-browser", + "brave-browser", "microsoft-edge", "microsoft-edge-stable", "chrome", +) + + +def default_profile() -> Path: + """Dedicated debug profile dir, NOT the operator's Default Chrome profile. + + Chrome refuses remote-debugging on a profile that is already open in another Chrome instance, + so we isolate the debug session in its own user-data-dir under HERMES_HOME. + """ + return paths.hermes_home() / "chrome-debug" + + +def _mac_candidates() -> list[str]: + return [ + "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", + "/Applications/Chromium.app/Contents/MacOS/Chromium", + "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser", + "/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge", + "/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary", + ] + + +def _windows_candidates() -> list[str]: + bases = [ + os.environ.get("ProgramFiles", r"C:\Program Files"), + os.environ.get("ProgramFiles(x86)", r"C:\Program Files (x86)"), + os.environ.get("LOCALAPPDATA", ""), + ] + rels = [ + r"Google\Chrome\Application\chrome.exe", + r"Chromium\Application\chrome.exe", + r"BraveSoftware\Brave-Browser\Application\brave.exe", + r"Microsoft\Edge\Application\msedge.exe", + ] + out: list[str] = [] + for base in bases: + if not base: + continue + for rel in rels: + out.append(str(Path(base) / rel)) + return out + + +def find_browser(override: str | None = None) -> str | None: + """Return the first usable Chromium-family browser path/command, or None. + + `override` (an explicit path, or a command on PATH) wins when it resolves. + """ + if override: + if Path(override).exists(): + return override + return shutil.which(override) # may be None -> caller reports "not found" + for name in _PATH_NAMES: + found = shutil.which(name) + if found: + return found + if sys.platform == "darwin": + candidates = _mac_candidates() + elif sys.platform == "win32": + candidates = _windows_candidates() + else: + candidates = [] + for cand in candidates: + if Path(cand).exists(): + return cand + return None + + +def launch_command(browser: str, port: int = DEFAULT_PORT, profile: Path | None = None) -> list[str]: + """The exact argv used to start the debug browser (also handy for `--print`).""" + profile = profile or default_profile() + return [ + browser, + f"--remote-debugging-port={int(port)}", + f"--user-data-dir={profile}", + "--no-first-run", + "--no-default-browser-check", + ] + + +def _http_get(url: str, timeout: float) -> bytes: + req = urllib.request.Request(url, headers={"User-Agent": "unbroker-cdp/1.0"}) + with urllib.request.urlopen(req, timeout=timeout) as resp: # noqa: S310 (localhost only) + return resp.read() + + +def endpoint_status(port: int = DEFAULT_PORT, host: str = "127.0.0.1", + timeout: float = 1.0) -> dict | None: + """Return the CDP `/json/version` dict if a debuggable browser is live at host:port, else None. + + (Chrome restricts this endpoint to localhost/IP Host headers, so we always hit 127.0.0.1.) + """ + url = f"http://{host}:{int(port)}/json/version" + try: + raw = _http_get(url, timeout) + except (urllib.error.URLError, TimeoutError, ConnectionError, OSError, ValueError): + return None + try: + data = json.loads(raw.decode("utf-8", errors="replace")) + except (ValueError, AttributeError): + return None + return data if isinstance(data, dict) else None + + +def launch(browser: str, port: int = DEFAULT_PORT, profile: Path | None = None) -> int: + """Start the browser detached with remote debugging; return the child PID. + + Detach so the browser outlives this short-lived CLI call. POSIX uses start_new_session (which + avoids referencing os.setsid, so there is no Windows import-time footgun); Windows uses + DETACHED_PROCESS + a new process group. + """ + profile = profile or default_profile() + profile.mkdir(parents=True, exist_ok=True) + cmd = launch_command(browser, port, profile) + kwargs: dict = { + "stdin": subprocess.DEVNULL, + "stdout": subprocess.DEVNULL, + "stderr": subprocess.DEVNULL, + } + if sys.platform == "win32": + kwargs["creationflags"] = ( + subprocess.DETACHED_PROCESS | subprocess.CREATE_NEW_PROCESS_GROUP # windows-footgun: ok + ) + else: + kwargs["start_new_session"] = True + proc = subprocess.Popen(cmd, **kwargs) + return proc.pid diff --git a/optional-skills/security/unbroker/scripts/pdd.py b/optional-skills/security/unbroker/scripts/pdd.py index 6d28a3a45..ab9f77b78 100644 --- a/optional-skills/security/unbroker/scripts/pdd.py +++ b/optional-skills/security/unbroker/scripts/pdd.py @@ -31,6 +31,7 @@ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) import autopilot # noqa: E402 import badbool # noqa: E402 +import cdp # noqa: E402 import brokers as brokers_mod # noqa: E402 import config as config_mod # noqa: E402 import crypto # noqa: E402 @@ -189,14 +190,15 @@ def cmd_doctor(args) -> None: "links via the operator's logged-in webmail. This needs Hermes pointed at the " "operator's OWN Chrome over CDP (launch with --remote-debugging-port=9222 " "--user-data-dir=~/.hermes/chrome-debug, signed into the webmail once); else it falls " - "back to drafts. See methods.md 'Browser backends'.") + "back to drafts. Run `pdd.py cdp` to launch it (or `pdd.py cdp --print` for the command). " + "See methods.md 'Browser backends'.") cloud_scan = cfg.get("browser_backend") == "browserbase" or ( cfg.get("browser_backend") == "auto" and caps.get("browserbase")) if cloud_scan: L.append(" NOTE: your scan backend is a cloud browser (Browserbase). It is great for " "Phase-1 scanning but CANNOT be the browser that sends webmail (no inbox session) " "and is itself Cloudflare/DataDome-gated on session-bound gates (e.g. PeopleConnect). " - "For Phase-2 email/verify, drive the operator's Chrome over CDP as above.") + "For Phase-2 email/verify, launch the operator's Chrome over CDP: `pdd.py cdp`.") if not crypto.is_engaged(): L.append(" Storage: dossiers are PLAINTEXT JSON (0600 under HERMES_HOME). " "Run `setup --encryption age` for at-rest encryption.") @@ -241,6 +243,63 @@ def cmd_doctor(args) -> None: print("\n".join(L)) +def cmd_cdp(args) -> None: + """Launch (or detect) the operator's Chrome over CDP for Phase-2 browser + webmail work. + + A cloud browser cannot send the operator's webmail or clear session-bound gates; this points + Hermes at the operator's real Chrome on a dedicated debug profile (see methods.md). + """ + import shlex + import time + + port = args.port + profile = Path(args.profile).expanduser() if args.profile else cdp.default_profile() + + live = cdp.endpoint_status(port) + if live: + _out({"running": True, "endpoint": f"127.0.0.1:{port}", + "browser": live.get("Browser"), + "webSocketDebuggerUrl": live.get("webSocketDebuggerUrl"), + "note": "a debuggable browser is already listening; point Hermes's browser tools at " + f"127.0.0.1:{port} and make sure the operator's webmail is signed in in THAT browser."}) + return + + if getattr(args, "check", False): + _out({"running": False, "endpoint": f"127.0.0.1:{port}", + "note": f"no debuggable browser here yet; run `pdd.py cdp --port {port}` (no --check) to launch one."}) + return + + browser = cdp.find_browser(args.browser) + if not browser: + _out({"running": False, "error": "no Chrome/Chromium-family browser found", + "fix": "install Google Chrome, or pass --browser /path/to/chrome (or a command on PATH)"}) + return + + cmd = cdp.launch_command(browser, port, profile) + if getattr(args, "print_only", False): + _out({"running": False, "browser": browser, "profile": str(profile), "command": cmd, + "shell": " ".join(shlex.quote(c) for c in cmd), + "note": "run this yourself to launch the debug browser, then sign into your webmail once."}) + return + + pid = cdp.launch(browser, port, profile) + live = None + for _ in range(20): # give Chrome a few seconds to open the debug port + live = cdp.endpoint_status(port) + if live: + break + time.sleep(0.5) + _out({"running": bool(live), "launched_pid": pid, "browser": browser, + "profile": str(profile), "endpoint": f"127.0.0.1:{port}", + "webSocketDebuggerUrl": (live or {}).get("webSocketDebuggerUrl"), + "next": ([f"point Hermes's browser tools at 127.0.0.1:{port} (CDP)", + "in the launched browser, sign into the operator's webmail ONCE (dedicated debug profile)", + "then run email/verify flows in browser mode -- they use this logged-in session"] + if live else + ["browser launched but the debug port has not answered yet; give it a few seconds, then " + f"re-run `pdd.py cdp --check --port {port}`"])}) + + def cmd_intake(args) -> None: if args.json: data = json.loads(Path(args.json).read_text(encoding="utf-8")) @@ -689,6 +748,18 @@ def build_parser() -> argparse.ArgumentParser: s = sub.add_parser("doctor", help="readiness check: config, brokers, available upgrades") s.set_defaults(func=cmd_doctor) + s = sub.add_parser("cdp", + help="launch/detect the operator's Chrome over CDP (Phase-2 browser + webmail)") + s.add_argument("--port", type=int, default=cdp.DEFAULT_PORT, help="remote debugging port (default 9222)") + s.add_argument("--profile", + help="user-data-dir (default: $HERMES_HOME/chrome-debug, a dedicated debug profile)") + s.add_argument("--browser", help="path to (or PATH name of) a Chrome/Chromium/Brave/Edge binary") + s.add_argument("--check", action="store_true", + help="only report whether a debug browser is live; do not launch") + s.add_argument("--print", dest="print_only", action="store_true", + help="print the launch command instead of launching it (run it yourself)") + s.set_defaults(func=cmd_cdp) + s = sub.add_parser("intake", help="create a subject dossier (records consent)") s.add_argument("--json", help="path to a dossier JSON file (overrides flags)") s.add_argument("--full-name") diff --git a/tests/skills/test_unbroker_skill.py b/tests/skills/test_unbroker_skill.py index 77599c934..ced394d93 100644 --- a/tests/skills/test_unbroker_skill.py +++ b/tests/skills/test_unbroker_skill.py @@ -36,6 +36,7 @@ import time as _time # noqa: E402 import badbool # noqa: E402 import brokers # noqa: E402 +import cdp # noqa: E402 import config # noqa: E402 import crypto # noqa: E402 import dossier # noqa: E402 @@ -480,6 +481,52 @@ def test_fanout_default_batch_size_is_five(): assert len(g["batches"]) == 3 # 5 + 5 + 2 +# --- cdp (operator browser over the DevTools protocol) -------------------------------------- + +def test_cdp_launch_command_has_debug_flags(): + cmd = cdp.launch_command("/usr/bin/chrome", port=9333, profile=Path("/tmp/prof")) + assert cmd[0] == "/usr/bin/chrome" + assert "--remote-debugging-port=9333" in cmd + assert "--user-data-dir=/tmp/prof" in cmd + assert "--no-first-run" in cmd + + +def test_cdp_default_profile_uses_hermes_home(): + prev = os.environ.get("HERMES_HOME") + with tempfile.TemporaryDirectory() as d: + os.environ["HERMES_HOME"] = d + try: + assert cdp.default_profile() == Path(d) / "chrome-debug" + finally: + if prev is None: + os.environ.pop("HERMES_HOME", None) + else: + os.environ["HERMES_HOME"] = prev + + +def test_cdp_endpoint_status_parses_live_and_handles_down(): + orig = cdp._http_get + cdp._http_get = lambda url, timeout: b'{"Browser":"Chrome/1.2","webSocketDebuggerUrl":"ws://x"}' + try: + st = cdp.endpoint_status(port=9222) + assert st and st["Browser"] == "Chrome/1.2" and st["webSocketDebuggerUrl"] == "ws://x" + finally: + cdp._http_get = orig + + def _boom(url, timeout): + raise ConnectionError("connection refused") + cdp._http_get = _boom + try: + assert cdp.endpoint_status(port=9222) is None # nothing listening -> None, never raises + finally: + cdp._http_get = orig + + +def test_cdp_find_browser_override(): + assert cdp.find_browser("/bin/sh") == "/bin/sh" # explicit path that exists + assert cdp.find_browser("definitely-not-a-real-browser-xyz") is None # bogus -> None (no crash) + + def test_plan_surfaces_antibot(): d = _consenting() broker = {"id": "tps", "optout": {"requires": {}}, "search": {"antibot": "datadome", "by": ["name"]}} @@ -1329,6 +1376,31 @@ def test_dotenv_env_fills_missing_creds_and_shell_wins(): os.environ[k] = v +def test_cdp_cli_check_reports_not_running(): + orig = cdp.endpoint_status + cdp.endpoint_status = lambda *a, **k: None + try: + out = _run(["cdp", "--check", "--port", "59981"]) + assert out["running"] is False and out["endpoint"].endswith(":59981") + finally: + cdp.endpoint_status = orig + + +def test_cdp_cli_detects_already_running_and_does_not_launch(): + # If a debug browser is already live, `cdp` must report it and NOT launch another. + orig_status, orig_launch = cdp.endpoint_status, cdp.launch + cdp.endpoint_status = lambda *a, **k: {"Browser": "Chrome/9", "webSocketDebuggerUrl": "ws://z"} + + def _no_launch(*a, **k): + raise AssertionError("launch() must not be called when a browser is already live") + cdp.launch = _no_launch + try: + out = _run(["cdp", "--port", "59982"]) + assert out["running"] is True and out["webSocketDebuggerUrl"] == "ws://z" + finally: + cdp.endpoint_status, cdp.launch = orig_status, orig_launch + + def test_registry_candidate_urls_newest_first_with_floor(): urls = registry.ca_candidate_urls(__import__("datetime").date(2027, 3, 1)) assert urls[0].endswith("registry2027.csv") and urls[-1].endswith("registry2025.csv")