Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
ea54b11
feat(browser): open a session browser the agent drives
Oct 24, 2026
f9e06f4
fix(browser): keep the session window and its profile, and stop one l…
omartelo Oct 26, 2026
ef180ce
feat(browser): stream a session's page to a window pane and take its …
omartelo Oct 26, 2026
811dd7f
feat(native): show a session's browser in a tab beside it
omartelo Oct 26, 2026
d0b3a13
docs(browser): the session browser is a tab of frames beside its session
omartelo Oct 26, 2026
9851b95
fix(native): show a layout that holds a Home session
omartelo Oct 26, 2026
be0268b
fix(browser): keep the pane's frames at its size and its input from p…
omartelo Oct 26, 2026
73fa721
fix(browser): an input event Chrome leaves unanswered no longer close…
omartelo Oct 26, 2026
3a6f534
fix(browser): load a link's new tab in the page instead of freezing it
omartelo Oct 26, 2026
61f9329
test(browser): back returns to the page a new-tab link left
omartelo Oct 26, 2026
3f6272a
fix(browser): tell the agent its browser shows in a tab, not a window
omartelo Oct 26, 2026
a6fbc79
Merge remote-tracking branch 'origin/main' into browser-tab-lich
omartelo Oct 26, 2026
788ecfd
feat(native): show the agent's clicks with lich's own cursor
omartelo Oct 27, 2026
3493d82
feat(browser): show where the agent scrolls, types and presses
omartelo Oct 27, 2026
3bba053
fix(native): keep the agent's cursor through its turn, and the page u…
omartelo Oct 27, 2026
90455f1
fix(native): play every agent action on the cursor, in turn
omartelo Oct 27, 2026
89cbed6
feat(browser): show the agent going back, forward, reloading and typi…
omartelo Oct 27, 2026
5d4d2f6
fix(browser): copy and paste between the page and the system clipboard
omartelo Oct 27, 2026
68872e4
feat(browser): answer the agent's page reads in half the text, and wi…
omartelo Oct 27, 2026
672bc8c
perf(browser): browser_type answers ok again instead of the page
omartelo Oct 27, 2026
1c9f8bf
fix(browser): click an element scrolled out of view instead of the vo…
omartelo Oct 27, 2026
ef3f3f7
fix(native): let the agent's cursor catch up with a fast agent
omartelo Oct 27, 2026
6adfad6
fix(native): move the agent's cursor on once a click has dipped
omartelo Oct 27, 2026
29e71c8
fix(browser): a failed agent action no longer closes a browser whose …
omartelo Oct 27, 2026
0fda3ed
docs(changelog): the session browser's agent cursor, clipboard and co…
omartelo Oct 27, 2026
a191e9a
Merge remote-tracking branch 'origin/main' into browser-tab-lich
omartelo Oct 27, 2026
8c5fc85
ci: let the runner's Chromium start its sandbox for the browser live …
omartelo Oct 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,12 @@ jobs:
exit 1
fi

# Ubuntu 24.04 refuses unprivileged user namespaces to binaries without an
# AppArmor profile, the runner's Chromium among them, and Chromium will not
# start without its sandbox: the internal/browser live tests need it.
- name: Allow Chromium's sandbox
run: sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0

- name: Backend tests
run: bash .github/scripts/go-test-summary.sh linux

Expand Down
6 changes: 6 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,12 @@ jobs:
go install github.com/goreleaser/nfpm/v2/cmd/nfpm@latest
echo "$(go env GOPATH)/bin" >> "$GITHUB_PATH"

# Ubuntu 24.04 refuses unprivileged user namespaces to binaries without an
# AppArmor profile, the runner's Chromium among them, and Chromium will not
# start without its sandbox: the internal/browser live tests need it.
- name: Allow Chromium's sandbox
run: sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0

# The suite emits pass/fail counts + coverage into the job summary and
# still fails the job on a red test (shared with ci.yml).
- name: Backend tests
Expand Down
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Added

- A session card's menu opens a browser for that session, above Open in, in a tab beside the session: its terminal on one side and the page on the other, with the divider, rotate and zoom of a split. The session's agent drives the same page: open a URL, read it, click, type, press a key, go back and forward, scroll and screenshot, from `browser_*` tools or from `lich browser`. The agent's own cursor shows where it acts: lich's arrow, in the session's card color or the theme's, with a badge naming the provider, glides to each click, field and scroll on the page and to back, forward, reload and the address on the pane's toolbar, playing even an agent's parallel calls in turn. You click, type and copy and paste with your own clipboard in the page while it does. Each click and key the agent sends answers with the page it left, in a compact form, so a long session spends about half the tokens it would reading the page back as JSON. When the agent opens a browser on its own, a toast in the bottom-right corner offers to show it. Open in a window moves the page to a Chromium window of its own, cookies and all. Closing the card closes the browser. The browser is the Chrome, Edge, Chromium, Brave, Vivaldi or Helium already installed. opencode's agent reaches it through `lich browser`; its own tool list does not include `browser_*`.

### Changed

- An agent can change the model or the reasoning effort of the session it runs in through `control_session`, and close that session when you ask it to (`self` on `close_session`, `lich close --self`). Both used to be refused outright.

### Fixed

- A session browser's open, reload, back and forward return once the page is interactive, instead of waiting for every image and tracker to finish. That wait held the agent's next action for as long as the load event took, up to 30 seconds, after the page was already on screen. A screenshot is the viewport being watched.
- The mouse wheel in a terminal scrolls smoothly and as far as in other terminals. A notch moves three lines of the shell's history, or a full-screen program such as `less`, eased over a few frames instead of jumping some eight lines at once. A program that takes the mouse, such as nvim, Claude Code or Codex, gets one wheel step a notch and scrolls its own distance, where it used to get about eight and race through the conversation.

## [0.79.0] - 2026-10-24
Expand Down
1 change: 1 addition & 0 deletions README.es.md
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ porque lee lo que cada CLI deja escrito, y no hay dos que registren lo mismo.
| Una tarea que entregas a otra sesión informa "sin respuesta" en cuanto ese agente termina su turno sin responder | sí | sí | sí | sí | sí | no, espera al plazo | sí | sí |
| Los mensajes propios de lich al agente (tareas entregadas, resultados listos, avisos) en el idioma de prompt que elijas | sí | sí | sí | sí | sí | sí | sí | sí |
| Se le indica al iniciarse, en el idioma de prompt, que reparta el trabajo como sesiones de lich en vez de subagentes ocultos | sí | no | no | no | sí | no | no | no |
| La tarjeta de la sesión abre un navegador que el agente conduce, en una pestaña junto a la sesión | sí | sí | sí | la tarjeta lo abre; el agente usa `lich browser`, no las tools `browser_*` | sí | sí | sí | sí |

Ninguna de estas diferencias es un descuido, y en ningún caso lich se guarda
algo que el CLI informe; [`docs/ceilings.md`](docs/ceilings.md) cuenta qué se
Expand Down
1 change: 1 addition & 0 deletions README.ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ lich は各 CLI が書き出す情報を読んでいて、何を書き出すか
| 別のセッションに渡したタスクは、相手のエージェントが返信せずにターンを終えた時点で、すぐに「unanswered」として戻ってくる | あり | あり | あり | あり | あり | なし(期限まで待つ) | あり | あり |
| lich からエージェントへの独自メッセージ(渡されたタスク、結果の準備完了、通知)を、選択したプロンプト言語で送る | あり | あり | あり | あり | あり | あり | あり | あり |
| 起動時に、見えないサブエージェントではなく lich セッションに作業を振り分けるよう、プロンプト言語で指示される | あり | なし | なし | なし | あり | なし | なし | なし |
| セッションのカードが、エージェントが操作するブラウザをセッションの隣のタブに開く | あり | あり | あり | カードは開く。エージェントは `browser_*` ではなく `lich browser` を使う | あり | あり | あり | あり |

「なし」はどれも意図したもので、CLI が出している情報を lich が隠しているわけではありません。
それぞれについて何を検証したかは [`docs/ceilings.md`](docs/ceilings.md) にまとめています。
Expand Down
1 change: 1 addition & 0 deletions README.ko.md
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ lich로 할 수 있는 일:
| 다른 세션에 넘긴 작업은 그 에이전트가 답하지 않고 턴을 끝내는 즉시 "unanswered"로 보고됨 | 예 | 예 | 예 | 예 | 예 | 아니요, 마감 시각까지 기다림 | 예 | 예 |
| lich가 에이전트에게 보내는 메시지(넘긴 작업, 준비된 결과, 알림)가 선택한 프롬프트 언어로 전달됨 | 예 | 예 | 예 | 예 | 예 | 예 | 예 | 예 |
| 세션을 시작할 때 숨은 서브에이전트 대신 lich 세션으로 작업을 나누라는 안내를 프롬프트 언어로 받음 | 예 | 아니요 | 아니요 | 아니요 | 예 | 아니요 | 아니요 | 아니요 |
| 세션 카드가 에이전트가 조작하는 브라우저를 세션 옆 탭에 연다 | 예 | 예 | 예 | 카드는 연다. 에이전트는 `browser_*`가 아니라 `lich browser`를 쓴다 | 예 | 예 | 예 | 예 |

빈칸은 모두 의도된 것이며, CLI가 보고하는 정보를 lich가 숨기는 경우는 없습니다. 빈칸마다
무엇을 측정했는지는 [`docs/ceilings.md`](docs/ceilings.md)에 정리되어 있습니다.
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ reads what each CLI writes down and no two of them write down the same things.
| A task you hand another session reports back "unanswered" as soon as that agent ends its turn without replying | yes | yes | yes | yes | yes | no, waits for the deadline | yes | yes |
| lich's own messages to the agent (handed tasks, results ready, notices) in the prompt language you pick | yes | yes | yes | yes | yes | yes | yes | yes |
| Told at spawn, in the prompt language, to fan work out as lich sessions rather than hidden subagents | yes | no | no | no | yes | no | no | no |
| The session card opens a browser its agent drives, in a tab beside the session | yes | yes | yes | the card opens it; the agent uses `lich browser`, not `browser_*` | yes | yes | yes | yes |

Every gap is deliberate, none of them is lich withholding something the CLI
reports, and [`docs/ceilings.md`](docs/ceilings.md) says what was measured behind
Expand Down
1 change: 1 addition & 0 deletions README.pt-BR.md
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ mesmas coisas.
| Uma tarefa passada para outra sessão volta como "sem resposta" assim que aquele agente encerra o turno sem responder | sim | sim | sim | sim | sim | não, espera o prazo | sim | sim |
| As mensagens do próprio lich para o agente (tarefas delegadas, resultados prontos, avisos) no idioma de prompt que você escolher | sim | sim | sim | sim | sim | sim | sim | sim |
| Instruído na criação, no idioma de prompt, a distribuir o trabalho em sessões do lich em vez de subagentes ocultos | sim | não | não | não | sim | não | não | não |
| O card da sessão abre um navegador que o agente dirige, numa aba ao lado da sessão | sim | sim | sim | o card abre; o agente usa `lich browser`, não as tools `browser_*` | sim | sim | sim | sim |

Toda lacuna é proposital: nenhuma é o lich escondendo algo que a CLI informa,
e o [`docs/ceilings.md`](docs/ceilings.md) diz o que foi medido em cada uma.
Expand Down
1 change: 1 addition & 0 deletions README.ru.md
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@
| Задача, переданная другой сессии, сразу возвращается как «без ответа», если тот агент завершил ход и не ответил | да | да | да | да | да | нет, ждёт истечения срока | да | да |
| Сообщения самого lich агенту (переданные задачи, готовые результаты, уведомления) на выбранном вами языке промптов | да | да | да | да | да | да | да | да |
| При запуске агент получает указание на языке промптов раздавать работу сессиям lich, а не скрытым субагентам | да | нет | нет | нет | да | нет | нет | нет |
| Карточка сессии открывает браузер, которым управляет агент, во вкладке рядом с сессией | да | да | да | карточка открывает; агент вызывает `lich browser`, а не инструменты `browser_*` | да | да | да | да |

Все пробелы намеренные: ни в одном из них lich не скрывает того, что сообщает
CLI, а что именно измерялось за каждым, описано в
Expand Down
1 change: 1 addition & 0 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@
| 交给另一个会话的任务,对方一轮结束却没回复时,立即报告“未回复” | 有 | 有 | 有 | 有 | 有 | 无,要等到截止时间 | 有 | 有 |
| lich 发给智能体的消息(派出的任务、结果已就绪、通知)使用你选的提示词语言 | 有 | 有 | 有 | 有 | 有 | 有 | 有 | 有 |
| 启动时用提示词语言告诉智能体,要把工作分派成 lich 会话,而不是看不见的子智能体 | 有 | 无 | 无 | 无 | 有 | 无 | 无 | 无 |
| 会话卡片在会话旁的标签页中打开一个由智能体操作的浏览器 | 有 | 有 | 有 | 卡片会打开;智能体用 `lich browser`,而不是 `browser_*` 工具 | 有 | 有 | 有 | 有 |

每一处差异都是有意为之,没有一处是 CLI 报告了而 lich 不显示;每一处背后实测了什么,见
[`docs/ceilings.md`](docs/ceilings.md)。
Expand Down
Loading
Loading