fix: truncate tab-list title too; doc raw --cdp isolation limit + eval/type notes

From Hermes's fork.49 re-dogfood (9/11 fixes confirmed PASS):
- tab list: a page can set its title to a multi-KB string (= a giant URL); cap
  the title column like the URL so the row stays readable.
- skill: clarify that true multi-agent isolation needs the extension-connect path
  (per-session tab groups) — raw `--cdp` shares the browser, so a sibling
  session's `open` can navigate your tab. Use the extension for concurrent agents.
- skill: prefer `eval --json` for array/object results (plain render is
  multi-line / pipe-hostile); note type/fill don't fire keydown (use `keyboard
  type` when key events are required).

(Hermes's "find-text click bypasses humanize" was a false alarm — verified both
paths curve; the apparent 1-vs-12 was cursor continuity on the same target.)
This commit is contained in:
leeguooooo
2026-06-11 23:55:00 +09:00
parent 31ef0d7e6a
commit 6f71f4e1ff
2 changed files with 22 additions and 5 deletions
+5
View File
@@ -478,6 +478,11 @@ pub fn print_response_with_opts(resp: &Response, action: Option<&str>, opts: &Ou
.get("title") .get("title")
.and_then(|v| v.as_str()) .and_then(|v| v.as_str())
.unwrap_or("Untitled"); .unwrap_or("Untitled");
// A page can set its title to a multi-KB string (e.g. equal to a
// giant JWT/OTP URL); truncate it like the URL so the row stays
// readable.
let title = truncate_middle(title, 120);
let title = title.as_str();
let url = tab.get("url").and_then(|v| v.as_str()).unwrap_or(""); let url = tab.get("url").and_then(|v| v.as_str()).unwrap_or("");
// Truncate very long URLs (e.g. multi-KB JWT/OTP login links) so // Truncate very long URLs (e.g. multi-KB JWT/OTP login links) so
// the list stays readable instead of flooding the terminal. // the list stays readable instead of flooding the terminal.
+17 -5
View File
@@ -408,6 +408,13 @@ top-level `const x`/`let x`/`var x` in one call collides with the next
names, assign to `window.x`, or wrap the body in an IIFE names, assign to `window.x`, or wrap the body in an IIFE
(`(() => { const x = …; return x; })()`). (`(() => { const x = …; return x; })()`).
**For array/object results, use `eval --json`** — the plain renderer
pretty-prints across multiple lines, which `tail`/`head`/pipes mangle; `--json`
emits one parseable line. Also note **`type`/`fill` insert text without firing
`keydown`/`keyup`** (CDP insertText) — the value lands, but a page that gates on
key events (some search-as-you-type widgets) won't react; use `keyboard type` (or
`press` per key) when real keystrokes are required.
### Screenshot ### Screenshot
```bash ```bash
@@ -453,11 +460,16 @@ shell.
**Concurrent agents MUST each use a distinct `--session <name>`.** Within one **Concurrent agents MUST each use a distinct `--session <name>`.** Within one
session, commands are pinned to the tab you opened (by target_id, so a foreign session, commands are pinned to the tab you opened (by target_id, so a foreign
tab can't drift your `eval`/`screenshot`). But two agents sharing the *same* tab can't drift your `eval`/`screenshot`). Two agents sharing the *same* session
session (e.g. both on the bare default) share one daemon and one active tab (e.g. both on the bare default) share one daemon and one active tab and will
they will clobber each other's tab/eval context. A unique session per agent gives clobber each other.
each its own isolated tab group (own cookies, tabs, pin) on the one real Chrome,
with no cross-talk. True multi-agent isolation requires the **extension-connect path**: each
`--session` gets its own colored Chrome tab group, so sessions never touch each
other's tabs. **Raw `--cdp <port>` does NOT isolate** — every session attaches to
the same browser's existing targets, so a second session's first `open` can
navigate a sibling's tab. For concurrent agents on one real Chrome, use the
extension (each with a distinct `--session`), not raw `--cdp`.
### Mock network requests ### Mock network requests