You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+10Lines changed: 10 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,5 +1,15 @@
1
1
# Changelog
2
2
3
+
## Unreleased
4
+
5
+
### ⚠ BREAKING CHANGES
6
+
7
+
***browser session model** — replace the browser-facing `--workspace` model with explicit `--session <name>` on `opencli browser *`. Browser commands now require a session name, `browser bind`/`unbind` use `--session`, and bind no longer accepts `--domain`, `--path-prefix`, or `--allow-navigate-bound`. Browser primitives keep their session tab by design; the browser namespace no longer exposes `--keep-tab`. Adapter `--keep-tab` and `browserSession.reuse: 'site'` are unchanged.
8
+
9
+
### Internal
10
+
11
+
***extension 1.0.11** — switch Browser Bridge lease routing from user-facing workspaces to explicit browser sessions.
`opencli browseropen <url>` and `opencli browser tab new [url]` both return a target ID. Use `opencli browser tab list` to inspect the target IDs of tabs that already exist, then pass `--tab <targetId>` to route a command to a specific tab. `tab new` creates a new tab without changing the default browser target; only `tab select <targetId>` promotes that tab to the default target for later untargeted `opencli browser ...` commands.
155
+
`opencli browser` commands require `--session <name>`. `opencli browser --session work open <url>` and `opencli browser --session work tab new [url]` both return a target ID. Use `opencli browser --session work tab list` to inspect target IDs, then pass `--tab <targetId>` to route a command to a specific tab. `tab new` creates a new tab without changing the default browser target; only `tab select <targetId>` promotes that tab to the default target for later untargeted commands in the same session.
156
156
157
157
## Core Concepts
158
158
159
159
### `browser`: AI Agent browser control
160
160
161
161
`opencli browser` commands are the low-level primitives that AI Agents use to operate websites. You don't run these manually — instead, install the `opencli-adapter-author` skill into your AI agent, describe what you want in natural language, and the agent handles the browser operations.
162
162
163
-
For example, tell your agent: *"Help me check my Xiaohongshu notifications"* — the agent will use `opencli browser open`, `state`, `click`, etc. under the hood.
163
+
For example, tell your agent: *"Help me check my Xiaohongshu notifications"* — the agent will use `opencli browser --session <name> open`, `state`, `click`, etc. under the hood.
164
164
165
165
### Built-in adapters: stable commands
166
166
@@ -174,7 +174,7 @@ When the site you need is not yet covered, use the `opencli-adapter-author` skil
174
174
2. Discover the right endpoint — network inspection, initial state, bundle search, token trace, or interceptor fallback.
6. Persist site knowledge to `~/.opencli/sites/<site>/` so the next adapter for the same site is faster.
179
179
180
180
### CLI Hub and desktop adapters
@@ -199,7 +199,7 @@ OpenCLI is not only for websites. It can also:
199
199
|`OPENCLI_DAEMON_PORT`|`19825`| HTTP port for the daemon-extension bridge |
200
200
|`OPENCLI_PROFILE`| — | Browser Bridge profile alias/contextId to use when multiple Chrome profiles are connected |
201
201
|`OPENCLI_WINDOW`| command default | Set to `foreground` or `background` to override Browser Bridge window placement. Browser-backed commands also accept `--window <foreground\|background>`. |
202
-
|`OPENCLI_KEEP_TAB`| command default | Set to `true` or `false` to keep or release the browser tab lease after a browser-backed command. Browser-backed commands also accept `--keep-tab <true\|false>`. |
202
+
|`OPENCLI_KEEP_TAB`| command default | Set to `true` or `false` to keep or release the browser tab lease after a browser-backed adapter command. Browser-backed adapter commands also accept `--keep-tab <true\|false>`. |
203
203
|`OPENCLI_BROWSER_REUSE`| adapter default | Set to `none` or `site` to override adapter browser tab reuse. The `--reuse <none\|site>` flag sets this. |
204
204
|`OPENCLI_BROWSER_CONNECT_TIMEOUT`|`30`| Seconds to wait for browser connection |
205
205
|`OPENCLI_BROWSER_COMMAND_TIMEOUT`|`60`| Seconds to wait for a single browser command |
@@ -208,7 +208,7 @@ OpenCLI is not only for websites. It can also:
208
208
|`OPENCLI_VERBOSE`|`false`| Enable verbose logging (`-v` flag also works) |
209
209
|`DEBUG_SNAPSHOT`| — | Set to `1` for DOM snapshot debug output |
210
210
211
-
`opencli browser *` uses a foreground browser window and keeps its tab lease by default. Browser-backed adapters use a background automation window and release one-shot tab leases by default. Some interactive adapters default to `--reuse site`, which also keeps the site tab lease; pass `--reuse none` for a one-shot tab.
211
+
`opencli browser *`requires an explicit `--session <name>`, uses a foreground browser window by default, and keeps that session's tab lease until `browser --session <name> close` or idle cleanup. Browser-backed adapters use a background adapter window and release one-shot tab leases by default. Some interactive adapters default to `--reuse site`, which keeps the site tab lease for continuity; pass `--reuse none` for a one-shot tab.
212
212
213
213
## Update
214
214
@@ -409,10 +409,10 @@ See [Plugins Guide](./docs/guide/plugins.md) for creating your own plugin.
409
409
Before writing any adapter code, read the [`opencli-adapter-author` skill](./skills/opencli-adapter-author/SKILL.md). It takes you end-to-end:
410
410
411
411
- Recon the site and pick a pattern (SPA / SSR / JSONP / Token / Streaming).
412
-
- Discover the right endpoint via `opencli browser network`, `eval`, or the interceptor fallback.
412
+
- Discover the right endpoint via `opencli browser --session <name> network`, `eval`, or the interceptor fallback.
- Run `opencli browser analyze <url>` for one-shot recon, decode response fields, design columns, scaffold with `opencli browser init`.
415
-
- Verify with `opencli browser verify <site>/<name>` before shipping.
414
+
- Run `opencli browser --session recon analyze <url>` for one-shot recon, decode response fields, design columns, scaffold with `opencli browser --session recon init`.
415
+
- Verify with `opencli browser --session recon verify <site>/<name>` before shipping.
416
416
417
417
For long-lived personal commands that should live in your own Git repo, use a local plugin instead; see [Extending OpenCLI](./docs/guide/extending-opencli.md). Quick private adapters can still live at `~/.opencli/clis/<site>/<name>.js`. Site knowledge (endpoints, field maps, fixtures) accumulates in `~/.opencli/sites/<site>/` so the next adapter for the same site starts from context instead of zero.
Copy file name to clipboardExpand all lines: clis/notebooklm/current.js
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -17,7 +17,7 @@ cli({
17
17
awaitrequireNotebooklmSession(page);
18
18
conststate=awaitgetNotebooklmPageState(page);
19
19
if(state.kind!=='notebook'){
20
-
thrownewEmptyResultError('opencli notebooklm current','No NotebookLM notebook is open in the automation workspace. Run `opencli notebooklm open <notebook>` first.');
20
+
thrownewEmptyResultError('opencli notebooklm current','No NotebookLM notebook is open in the adapter session. Run `opencli notebooklm open <notebook>` first.');
Copy file name to clipboardExpand all lines: clis/notebooklm/get.js
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -18,7 +18,7 @@ cli({
18
18
awaitrequireNotebooklmSession(page);
19
19
conststate=awaitgetNotebooklmPageState(page);
20
20
if(state.kind!=='notebook'){
21
-
thrownewEmptyResultError('opencli notebooklm get','No NotebookLM notebook is open in the automation workspace. Run `opencli notebooklm open <notebook>` first.');
21
+
thrownewEmptyResultError('opencli notebooklm get','No NotebookLM notebook is open in the adapter session. Run `opencli notebooklm open <notebook>` first.');
Copy file name to clipboardExpand all lines: clis/notebooklm/history.js
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -17,7 +17,7 @@ cli({
17
17
awaitrequireNotebooklmSession(page);
18
18
conststate=awaitgetNotebooklmPageState(page);
19
19
if(state.kind!=='notebook'){
20
-
thrownewEmptyResultError('opencli notebooklm history','No NotebookLM notebook is open in the automation workspace. Run `opencli notebooklm open <notebook>` first.');
20
+
thrownewEmptyResultError('opencli notebooklm history','No NotebookLM notebook is open in the adapter session. Run `opencli notebooklm open <notebook>` first.');
Copy file name to clipboardExpand all lines: clis/notebooklm/note-list.js
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -18,7 +18,7 @@ cli({
18
18
awaitrequireNotebooklmSession(page);
19
19
conststate=awaitgetNotebooklmPageState(page);
20
20
if(state.kind!=='notebook'){
21
-
thrownewEmptyResultError('opencli notebooklm note-list','No NotebookLM notebook is open in the automation workspace. Run `opencli notebooklm open <notebook>` first.');
21
+
thrownewEmptyResultError('opencli notebooklm note-list','No NotebookLM notebook is open in the adapter session. Run `opencli notebooklm open <notebook>` first.');
Copy file name to clipboardExpand all lines: clis/notebooklm/notes-get.js
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -31,7 +31,7 @@ cli({
31
31
awaitrequireNotebooklmSession(page);
32
32
conststate=awaitgetNotebooklmPageState(page);
33
33
if(state.kind!=='notebook'){
34
-
thrownewEmptyResultError('opencli notebooklm notes-get','No NotebookLM notebook is open in the automation workspace. Run `opencli notebooklm open <notebook>` first.');
34
+
thrownewEmptyResultError('opencli notebooklm notes-get','No NotebookLM notebook is open in the adapter session. Run `opencli notebooklm open <notebook>` first.');
Copy file name to clipboardExpand all lines: clis/notebooklm/open.js
+2-2Lines changed: 2 additions & 2 deletions
Original file line number
Diff line number
Diff line change
@@ -7,7 +7,7 @@ cli({
7
7
name: 'open',
8
8
access: 'read',
9
9
aliases: ['select'],
10
-
description: 'Open one NotebookLM notebook in the automation workspace by id or URL',
10
+
description: 'Open one NotebookLM notebook in the adapter session by id or URL',
11
11
domain: NOTEBOOKLM_DOMAIN,
12
12
strategy: Strategy.COOKIE,
13
13
browser: true,
@@ -28,7 +28,7 @@ cli({
28
28
awaitrequireNotebooklmSession(page);
29
29
conststate=awaitgetNotebooklmPageState(page);
30
30
if(state.kind!=='notebook'){
31
-
thrownewCliError('NOTEBOOKLM_OPEN_FAILED',`NotebookLM notebook "${notebookId}" did not open in the automation workspace`,'Run `opencli notebooklm list -f json` first and pass a valid notebook id.');
31
+
thrownewCliError('NOTEBOOKLM_OPEN_FAILED',`NotebookLM notebook "${notebookId}" did not open in the adapter session`,'Run `opencli notebooklm list -f json` first and pass a valid notebook id.');
32
32
}
33
33
if(state.notebookId!==notebookId){
34
34
console.warn(`[notebooklm open] expected notebook "${notebookId}" but page reports "${state.notebookId}"; continuing`);
0 commit comments