@monoes/monobrowse 1.0.19 → 1.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/src/__tests__/browse-concurrency.test.d.ts +15 -0
  2. package/dist/src/__tests__/browse-concurrency.test.d.ts.map +1 -0
  3. package/dist/src/__tests__/browse-concurrency.test.js +198 -0
  4. package/dist/src/__tests__/browse-concurrency.test.js.map +1 -0
  5. package/dist/src/__tests__/cli-version.test.d.ts +20 -0
  6. package/dist/src/__tests__/cli-version.test.d.ts.map +1 -0
  7. package/dist/src/__tests__/cli-version.test.js +45 -0
  8. package/dist/src/__tests__/cli-version.test.js.map +1 -0
  9. package/dist/src/__tests__/close-browser.test.js +2 -2
  10. package/dist/src/__tests__/close-browser.test.js.map +1 -1
  11. package/dist/src/__tests__/frame-command.test.js +12 -2
  12. package/dist/src/__tests__/frame-command.test.js.map +1 -1
  13. package/dist/src/__tests__/reap-idle-browser.test.js +13 -13
  14. package/dist/src/__tests__/reap-idle-browser.test.js.map +1 -1
  15. package/dist/src/__tests__/ref-cache.test.js +96 -58
  16. package/dist/src/__tests__/ref-cache.test.js.map +1 -1
  17. package/dist/src/__tests__/report-exit-code.test.js +1 -1
  18. package/dist/src/__tests__/session-discovery.test.d.ts +13 -0
  19. package/dist/src/__tests__/session-discovery.test.d.ts.map +1 -0
  20. package/dist/src/__tests__/session-discovery.test.js +218 -0
  21. package/dist/src/__tests__/session-discovery.test.js.map +1 -0
  22. package/dist/src/browser/browser.d.ts +2 -1
  23. package/dist/src/browser/browser.d.ts.map +1 -1
  24. package/dist/src/browser/browser.js +17 -9
  25. package/dist/src/browser/browser.js.map +1 -1
  26. package/dist/src/browser/ref-cache.d.ts +50 -22
  27. package/dist/src/browser/ref-cache.d.ts.map +1 -1
  28. package/dist/src/browser/ref-cache.js +122 -57
  29. package/dist/src/browser/ref-cache.js.map +1 -1
  30. package/dist/src/cli/commands-context.js +1 -1
  31. package/dist/src/cli/commands-context.js.map +1 -1
  32. package/dist/src/cli/commands-navigate.js +2 -2
  33. package/dist/src/cli/commands-navigate.js.map +1 -1
  34. package/dist/src/cli/commands-page.js +2 -2
  35. package/dist/src/cli/commands-page.js.map +1 -1
  36. package/dist/src/cli/commands-report.js +2 -2
  37. package/dist/src/cli/commands-report.js.map +1 -1
  38. package/dist/src/cli/commands-session.d.ts.map +1 -1
  39. package/dist/src/cli/commands-session.js +70 -56
  40. package/dist/src/cli/commands-session.js.map +1 -1
  41. package/dist/src/cli/commands.d.ts.map +1 -1
  42. package/dist/src/cli/commands.js +102 -66
  43. package/dist/src/cli/commands.js.map +1 -1
  44. package/dist/src/cli/session.d.ts +66 -2
  45. package/dist/src/cli/session.d.ts.map +1 -1
  46. package/dist/src/cli/session.js +190 -33
  47. package/dist/src/cli/session.js.map +1 -1
  48. package/dist/src/cli.js +3 -1
  49. package/dist/src/cli.js.map +1 -1
  50. package/dist/tsconfig.tsbuildinfo +1 -1
  51. package/package.json +1 -1
  52. package/src/__tests__/browse-concurrency.test.ts +233 -0
  53. package/src/__tests__/cli-version.test.ts +50 -0
  54. package/src/__tests__/close-browser.test.ts +2 -2
  55. package/src/__tests__/frame-command.test.ts +12 -2
  56. package/src/__tests__/reap-idle-browser.test.ts +15 -14
  57. package/src/__tests__/ref-cache.test.ts +112 -59
  58. package/src/__tests__/report-exit-code.test.ts +1 -1
  59. package/src/__tests__/session-discovery.test.ts +259 -0
  60. package/src/browser/browser.ts +23 -9
  61. package/src/browser/ref-cache.ts +144 -72
  62. package/src/cli/commands-context.ts +1 -1
  63. package/src/cli/commands-navigate.ts +2 -2
  64. package/src/cli/commands-page.ts +2 -2
  65. package/src/cli/commands-report.ts +2 -2
  66. package/src/cli/commands-session.ts +74 -55
  67. package/src/cli/commands.ts +106 -66
  68. package/src/cli/session.ts +208 -33
  69. package/src/cli.ts +3 -1
@@ -38,6 +38,7 @@ import { closeCommand, connectCommand, openCommand, resizeCommand } from './comm
38
38
  import { harCommand, networkCommand, profilerCommand, recordCommand, traceCommand, vitalsCommand, } from './commands-trace.js';
39
39
  import { output } from './output.js';
40
40
  import { createPlatformCommand } from './platform.js';
41
+ import { applySessionPortFlag } from './session.js';
41
42
  // Re-exported for direct unit testing — these were exported from this file
42
43
  // before the subcommands were split out, and the tests import them from here.
43
44
  export { deriveBoxOutput } from './commands-page.js';
@@ -158,78 +159,113 @@ const batchCommand = {
158
159
  const actionSubcommand = wrapCommanderCommand(createActionCommand);
159
160
  const platformSubcommand = wrapCommanderCommand(createPlatformCommand);
160
161
  // ---------------------------------------------------------------------------
162
+ // Session selector
163
+ //
164
+ // Sessions are per-port (#318), so `--port N` is how any command says which
165
+ // one it means; without it a command resolves the newest live session in this
166
+ // directory. Wiring it here, once, gives every subcommand the selector
167
+ // without each action having to read the flag: session.port is set before the
168
+ // action runs, and that is what every ensureConnected(session.port) resolves.
169
+ // ---------------------------------------------------------------------------
170
+ const PORT_OPTION = {
171
+ name: 'port',
172
+ short: 'p',
173
+ type: 'number',
174
+ description: 'Act on the browse session on this CDP port (default: the newest live session)',
175
+ };
176
+ function withSessionSelector(cmd) {
177
+ const action = cmd.action;
178
+ return {
179
+ ...cmd,
180
+ options: cmd.options?.some((o) => o.name === 'port')
181
+ ? cmd.options
182
+ : [...(cmd.options ?? []), { ...PORT_OPTION }],
183
+ action: action
184
+ ? async (ctx) => {
185
+ applySessionPortFlag(ctx.flags);
186
+ return action(ctx);
187
+ }
188
+ : undefined,
189
+ subcommands: cmd.subcommands?.map(withSessionSelector),
190
+ };
191
+ }
192
+ // ---------------------------------------------------------------------------
161
193
  // Root browse command
162
194
  // ---------------------------------------------------------------------------
195
+ // Every subcommand gets the `--port` session selector (see
196
+ // withSessionSelector). batchCommand dispatches over this same array, so a
197
+ // batched command honours the selector too.
198
+ const subcommands = [
199
+ openCommand,
200
+ snapshotCommand,
201
+ clickCommand,
202
+ dblclickCommand,
203
+ fillCommand,
204
+ typeCommand,
205
+ pressCommand,
206
+ keyboardCommand,
207
+ keydownCommand,
208
+ keyupCommand,
209
+ hoverCommand,
210
+ focusCommand,
211
+ selectCommand,
212
+ checkCommand,
213
+ uncheckCommand,
214
+ isvisibleCommand,
215
+ isenabledCommand,
216
+ ischeckedCommand,
217
+ tapCommand,
218
+ swipeCommand,
219
+ scrollIntoViewCommand,
220
+ dragCommand,
221
+ uploadCommand,
222
+ downloadCommand,
223
+ mouseCommand,
224
+ clipboardCommand,
225
+ waitCommand,
226
+ screenshotCommand,
227
+ getCommand,
228
+ scrollCommand,
229
+ navigateCommand,
230
+ setCommand,
231
+ stateCommand,
232
+ networkCommand,
233
+ evalCommand,
234
+ dialogCommand,
235
+ frameCommand,
236
+ tabCommand,
237
+ windowCommand,
238
+ consoleLogCommand,
239
+ errorsCommand,
240
+ storageCommand,
241
+ cookiesCommand,
242
+ pdfCommand,
243
+ isCommand,
244
+ findCommand,
245
+ highlightCommand,
246
+ diffCommand,
247
+ pushstateCommand,
248
+ batchCommand,
249
+ addinitscriptCommand,
250
+ removeinitscriptCommand,
251
+ connectCommand,
252
+ recordCommand,
253
+ traceCommand,
254
+ profilerCommand,
255
+ vitalsCommand,
256
+ reportCommand,
257
+ harCommand,
258
+ resizeCommand,
259
+ closeCommand,
260
+ actionSubcommand,
261
+ platformSubcommand,
262
+ ].map(withSessionSelector);
163
263
  const browseCommand = {
164
264
  name: 'browse',
165
265
  description: 'Native browser automation via Chrome DevTools Protocol',
166
- subcommands: [
167
- openCommand,
168
- snapshotCommand,
169
- clickCommand,
170
- dblclickCommand,
171
- fillCommand,
172
- typeCommand,
173
- pressCommand,
174
- keyboardCommand,
175
- keydownCommand,
176
- keyupCommand,
177
- hoverCommand,
178
- focusCommand,
179
- selectCommand,
180
- checkCommand,
181
- uncheckCommand,
182
- isvisibleCommand,
183
- isenabledCommand,
184
- ischeckedCommand,
185
- tapCommand,
186
- swipeCommand,
187
- scrollIntoViewCommand,
188
- dragCommand,
189
- uploadCommand,
190
- downloadCommand,
191
- mouseCommand,
192
- clipboardCommand,
193
- waitCommand,
194
- screenshotCommand,
195
- getCommand,
196
- scrollCommand,
197
- navigateCommand,
198
- setCommand,
199
- stateCommand,
200
- networkCommand,
201
- evalCommand,
202
- dialogCommand,
203
- frameCommand,
204
- tabCommand,
205
- windowCommand,
206
- consoleLogCommand,
207
- errorsCommand,
208
- storageCommand,
209
- cookiesCommand,
210
- pdfCommand,
211
- isCommand,
212
- findCommand,
213
- highlightCommand,
214
- diffCommand,
215
- pushstateCommand,
216
- batchCommand,
217
- addinitscriptCommand,
218
- removeinitscriptCommand,
219
- connectCommand,
220
- recordCommand,
221
- traceCommand,
222
- profilerCommand,
223
- vitalsCommand,
224
- reportCommand,
225
- harCommand,
226
- resizeCommand,
227
- closeCommand,
228
- actionSubcommand,
229
- platformSubcommand,
230
- ],
266
+ subcommands,
231
267
  options: [
232
- { name: 'port', short: 'p', type: 'number', description: 'CDP debug port', default: 9222 },
268
+ { ...PORT_OPTION },
233
269
  { name: 'session', short: 's', type: 'string', description: 'Named session to use' },
234
270
  ],
235
271
  examples: [
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../src/cli/commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../src/cli/commands.ts"],"names":[],"mappings":"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"}
@@ -7,9 +7,28 @@
7
7
  * module-level. It is a mutable record rather than separate bindings because
8
8
  * the subcommand modules that update it import it (see `session`).
9
9
  *
10
+ * THE SESSION RULE (#318). A browse session is one Chrome plus the CDP port
11
+ * it listens on, recorded per working directory in
12
+ * `.monomind/monobrowse/sessions/<port>.json`:
13
+ *
14
+ * - `open` with no `--port` STARTS its own session: Chrome binds a
15
+ * kernel-assigned free port in a profile directory of its own. It never
16
+ * joins an existing one, so two uncoordinated invocations can never land
17
+ * on the same port or profile. `open` reports the port it got.
18
+ * - `open`/`connect` WITH `--port N` keep the old behaviour exactly: attach
19
+ * to a Chrome already listening on N, otherwise launch there.
20
+ * - Any later command with no `--port` acts on the newest session in this
21
+ * directory whose browser still answers; every dead record it passes on
22
+ * the way is dropped (self-heal). With none left it starts a session of
23
+ * its own, exactly as `open` would.
24
+ * - Any later command with `--port N` acts on that session, which is how a
25
+ * concurrent caller pins the one `open` handed it.
26
+ * - `close` ends exactly the session it resolved — one browser, one record.
27
+ *
10
28
  * Split out of commands.ts, which is now the command catalogue.
11
29
  */
12
- import type { CdpClient, ElementRef } from '../index.js';
30
+ import type { CdpClient, ElementRef, SessionRecord } from '../index.js';
31
+ import type { ParsedFlags } from './types.js';
13
32
  export declare const session: {
14
33
  client: CdpClient | null;
15
34
  sessionId: string;
@@ -19,9 +38,54 @@ export declare const session: {
19
38
  /** Saved parent sessionId when inside an iframe — restored by `frame main`. */
20
39
  parentSessionId: string;
21
40
  };
41
+ /**
42
+ * The session the caller pinned with `--port`, or undefined for "whichever
43
+ * session this directory's store resolves to". Anything unusable — absent,
44
+ * out of range, unparseable — reads as undefined.
45
+ */
46
+ export declare function pinnedPort(flags: ParsedFlags): number | undefined;
47
+ /**
48
+ * Pin this process to the session named by `--port` before the subcommand
49
+ * runs (see the wrapper in commands.ts), so every command that resolves its
50
+ * session through `session.port` honours the selector.
51
+ */
52
+ export declare function applySessionPortFlag(flags: ParsedFlags): void;
22
53
  export declare function getBrowser(): Promise<typeof import("../index.js")>;
23
54
  export declare function ensureSignalCleanupHandlers(): void;
24
- export declare function resolveDefaultPort(browser: Awaited<ReturnType<typeof getBrowser>>): Promise<number>;
55
+ export declare function resolveLiveSession(browser: Awaited<ReturnType<typeof getBrowser>>, opts?: {
56
+ strict?: boolean;
57
+ }): Promise<SessionRecord | null>;
58
+ /**
59
+ * Take over the single session a pre-#318 CLI recorded in this directory, so
60
+ * upgrading monobrowse mid-session does not strand its Chrome with no handle
61
+ * anyone can use. Returns the session — now an ordinary per-port record that
62
+ * `snapshot`, `--port` and `close` treat like any other — or null.
63
+ *
64
+ * `port` restricts adoption to a session the caller already named, so a
65
+ * legacy record for some other port is left for its own resolution.
66
+ *
67
+ * A record that a per-port record already supersedes, or whose browser no
68
+ * longer answers, is simply dropped: the same self-heal as for a dead native
69
+ * record, and nothing is ever written back to the old layout. This is the
70
+ * only place the legacy file is read, and `open` never consults it — a bare
71
+ * `open` still always starts a session of its own.
72
+ */
73
+ export declare function adoptLegacySession(browser: Awaited<ReturnType<typeof getBrowser>>, opts?: {
74
+ port?: number;
75
+ }): Promise<SessionRecord | null>;
76
+ /**
77
+ * Start or attach to the browser this session drives, and record it.
78
+ *
79
+ * With a `port`, that is the caller's explicit `--port`: attach to a Chrome
80
+ * already listening there, else launch there (unchanged behaviour). Without
81
+ * one, Chrome binds a kernel-assigned free port in a profile directory of
82
+ * this session's own — the allocation that makes two concurrent `open`
83
+ * invocations independent (#318).
84
+ */
85
+ export declare function launchSessionBrowser(browser: Awaited<ReturnType<typeof getBrowser>>, opts: {
86
+ port?: number;
87
+ headless: boolean;
88
+ }): Promise<number>;
25
89
  export declare function ensureConnected(port: number, targetId?: string): Promise<{
26
90
  client: CdpClient;
27
91
  sessionId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/cli/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAWzD,eAAO,MAAM,OAAO,EAAE;IACpB,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC9B,+EAA+E;IAC/E,eAAe,EAAE,MAAM,CAAC;CAQzB,CAAC;AAEF,wBAAsB,UAAU,0CAE/B;AAiBD,wBAAgB,2BAA2B,IAAI,IAAI,CA0BlD;AASD,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,GAC9C,OAAO,CAAC,MAAM,CAAC,CAoBjB;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;;;;GAqBpE;AAiBD,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,EAC/C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAef;AASD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC,CAiCrC;AAED,wBAAgB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAmB5C;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8G7E;AAID,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAE9C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGzE;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAC1C,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,QAAQ,EAAE,CAAC,GACV,CAAC,CAEH;AAED,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,QAEhC;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,OAAO,aAAa,EAAE,SAAS,EACvC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,aAAa,EAAE,UAAU,CAAC,EACnD,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAqBjB"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/cli/session.ts"],"names":[],"mappings":"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"}
@@ -7,10 +7,32 @@
7
7
  * module-level. It is a mutable record rather than separate bindings because
8
8
  * the subcommand modules that update it import it (see `session`).
9
9
  *
10
+ * THE SESSION RULE (#318). A browse session is one Chrome plus the CDP port
11
+ * it listens on, recorded per working directory in
12
+ * `.monomind/monobrowse/sessions/<port>.json`:
13
+ *
14
+ * - `open` with no `--port` STARTS its own session: Chrome binds a
15
+ * kernel-assigned free port in a profile directory of its own. It never
16
+ * joins an existing one, so two uncoordinated invocations can never land
17
+ * on the same port or profile. `open` reports the port it got.
18
+ * - `open`/`connect` WITH `--port N` keep the old behaviour exactly: attach
19
+ * to a Chrome already listening on N, otherwise launch there.
20
+ * - Any later command with no `--port` acts on the newest session in this
21
+ * directory whose browser still answers; every dead record it passes on
22
+ * the way is dropped (self-heal). With none left it starts a session of
23
+ * its own, exactly as `open` would.
24
+ * - Any later command with `--port N` acts on that session, which is how a
25
+ * concurrent caller pins the one `open` handed it.
26
+ * - `close` ends exactly the session it resolved — one browser, one record.
27
+ *
10
28
  * Split out of commands.ts, which is now the command catalogue.
11
29
  */
30
+ import { randomUUID } from 'node:crypto';
31
+ import { tmpdir } from 'node:os';
32
+ import { join } from 'node:path';
12
33
  import { output } from './output.js';
13
- const DEFAULT_PORT = 9222;
34
+ /** `session.port` when no `--port` was given: resolve or start one instead. */
35
+ const UNPINNED = 0;
14
36
  // Runtime state (single session per CLI process).
15
37
  //
16
38
  // One mutable record rather than separate module-level bindings: every
@@ -21,10 +43,34 @@ export const session = {
21
43
  client: null,
22
44
  sessionId: '',
23
45
  targetId: '',
24
- port: DEFAULT_PORT,
46
+ port: UNPINNED,
25
47
  refs: new Map(),
26
48
  parentSessionId: '',
27
49
  };
50
+ /**
51
+ * The session the caller pinned with `--port`, or undefined for "whichever
52
+ * session this directory's store resolves to". Anything unusable — absent,
53
+ * out of range, unparseable — reads as undefined.
54
+ */
55
+ export function pinnedPort(flags) {
56
+ const raw = flags.port;
57
+ const port = typeof raw === 'number' ? raw : typeof raw === 'string' ? Number(raw) : Number.NaN;
58
+ return Number.isInteger(port) && port >= 1024 && port <= 65535 ? port : undefined;
59
+ }
60
+ /**
61
+ * Pin this process to the session named by `--port` before the subcommand
62
+ * runs (see the wrapper in commands.ts), so every command that resolves its
63
+ * session through `session.port` honours the selector.
64
+ */
65
+ export function applySessionPortFlag(flags) {
66
+ // Only ever pins: a command with no --port must not reset the port of a
67
+ // session this process already established (`batch "open …" "snapshot"`
68
+ // runs both actions in one process, and the second must stay on the
69
+ // session the first started).
70
+ const pinned = pinnedPort(flags);
71
+ if (pinned !== undefined)
72
+ session.port = pinned;
73
+ }
28
74
  export async function getBrowser() {
29
75
  return import('../index.js');
30
76
  }
@@ -74,33 +120,136 @@ export function ensureSignalCleanupHandlers() {
74
120
  });
75
121
  }
76
122
  }
77
- // Each CLI invocation is a fresh process, so this module's `session.port` variable
78
- // is always freshly initialized to DEFAULT_PORT — a `--port 9333` passed to
79
- // an earlier `open` command has no effect on this process's own default.
80
- // Resolve the persisted "active port" (written by `open --port N`, read via
81
- // ref-cache.ts's saveActivePort/loadActivePort) so subsequent commands
82
- // attach to the browser the user actually opened instead of silently
83
- // launching/attaching to a second, unrelated Chrome instance on 9222.
84
- export async function resolveDefaultPort(browser) {
85
- const persisted = await browser.loadActivePortInfo();
86
- if (!persisted)
87
- return DEFAULT_PORT;
88
- if (!persisted.launched) {
89
- // connect-origin port: the browser belongs to someone else. If it died,
90
- // relaunching our own headless Chrome on that port would squat the
91
- // user's debug port and silently swap which browser commands act on —
92
- // fail loudly instead.
93
- try {
94
- await fetch(`http://127.0.0.1:${persisted.port}/json/version`, {
95
- signal: AbortSignal.timeout(1500),
96
- });
97
- }
98
- catch {
99
- await browser.clearActivePort();
100
- throw new Error(`Connected browser on port ${persisted.port} is gone — re-run \`connect\` (or \`open\` to launch a fresh one).`);
123
+ // Each CLI invocation is a fresh process, so the session a previous `open`
124
+ // started only survives as its record on disk. Walk the recorded sessions
125
+ // newest-first and return the first whose browser still answers — that is
126
+ // "the" session for a command that did not pin one with `--port`.
127
+ //
128
+ // Records whose browser is gone are dropped as we pass them (self-heal): a
129
+ // crashed or manually-killed Chrome must not wedge every later command.
130
+ export async function resolveLiveSession(browser, opts = {}) {
131
+ for (const record of await browser.listSessionRecords()) {
132
+ if (await cdpAnswers(record.port))
133
+ return record;
134
+ await browser.removeSessionRecord(record.port);
135
+ await browser.clearRefCache(record.port);
136
+ if (!record.launched && opts.strict !== false) {
137
+ // connect-origin port: the browser belonged to someone else. Silently
138
+ // launching our own headless Chrome on that port would squat the
139
+ // user's debug port and swap which browser commands act on — fail
140
+ // loudly instead. `close` passes strict:false; it has nothing to
141
+ // attach to and just cleans up.
142
+ throw new Error(`Connected browser on port ${record.port} is gone — re-run \`connect\` (or \`open\` to launch a fresh one).`);
101
143
  }
102
144
  }
103
- return persisted.port;
145
+ // Nothing native is live. A session opened by a pre-#318 CLI in this
146
+ // directory may still be — it is the oldest possible candidate, so it is
147
+ // considered last.
148
+ return adoptLegacySession(browser);
149
+ }
150
+ /**
151
+ * Take over the single session a pre-#318 CLI recorded in this directory, so
152
+ * upgrading monobrowse mid-session does not strand its Chrome with no handle
153
+ * anyone can use. Returns the session — now an ordinary per-port record that
154
+ * `snapshot`, `--port` and `close` treat like any other — or null.
155
+ *
156
+ * `port` restricts adoption to a session the caller already named, so a
157
+ * legacy record for some other port is left for its own resolution.
158
+ *
159
+ * A record that a per-port record already supersedes, or whose browser no
160
+ * longer answers, is simply dropped: the same self-heal as for a dead native
161
+ * record, and nothing is ever written back to the old layout. This is the
162
+ * only place the legacy file is read, and `open` never consults it — a bare
163
+ * `open` still always starts a session of its own.
164
+ */
165
+ export async function adoptLegacySession(browser, opts = {}) {
166
+ const legacy = await browser.loadLegacySessionRecord();
167
+ if (!legacy)
168
+ return null;
169
+ if (opts.port !== undefined && opts.port !== legacy.port)
170
+ return null;
171
+ if (await browser.loadSessionRecord(legacy.port)) {
172
+ await browser.removeLegacySessionRecord();
173
+ return null;
174
+ }
175
+ if (!(await cdpAnswers(legacy.port))) {
176
+ await browser.removeLegacySessionRecord();
177
+ return null;
178
+ }
179
+ await browser.saveSessionRecord(legacy.port, {
180
+ launched: legacy.launched,
181
+ pid: legacy.pid,
182
+ userDataDir: legacy.userDataDir,
183
+ savedAt: legacy.savedAt,
184
+ });
185
+ await browser.removeLegacySessionRecord();
186
+ return legacy;
187
+ }
188
+ async function cdpAnswers(port) {
189
+ try {
190
+ const res = await fetch(`http://127.0.0.1:${port}/json/version`, {
191
+ signal: AbortSignal.timeout(1500),
192
+ });
193
+ return res.ok;
194
+ }
195
+ catch {
196
+ return false;
197
+ }
198
+ }
199
+ /**
200
+ * Start or attach to the browser this session drives, and record it.
201
+ *
202
+ * With a `port`, that is the caller's explicit `--port`: attach to a Chrome
203
+ * already listening there, else launch there (unchanged behaviour). Without
204
+ * one, Chrome binds a kernel-assigned free port in a profile directory of
205
+ * this session's own — the allocation that makes two concurrent `open`
206
+ * invocations independent (#318).
207
+ */
208
+ export async function launchSessionBrowser(browser, opts) {
209
+ const port = opts.port
210
+ ? await browser.launchBrowser({ port: opts.port, headless: opts.headless })
211
+ : await browser.launchBrowser({
212
+ port: 0,
213
+ headless: opts.headless,
214
+ // Chrome reports the port it bound inside this directory, so it must
215
+ // belong to this session alone.
216
+ userDataDir: join(tmpdir(), `monomind-browse-${process.pid}-${randomUUID().slice(0, 8)}`),
217
+ });
218
+ await recordSession(browser, port);
219
+ ensureSignalCleanupHandlers();
220
+ return port;
221
+ }
222
+ // Persist the session so later CLI invocations (each a fresh process) can
223
+ // find this browser, together with the launched PID/userDataDir so their
224
+ // closeBrowser can still kill it even though launchedPids (browser.ts) is
225
+ // per-process and empty there.
226
+ //
227
+ // launchBrowser() can either LAUNCH a fresh Chrome or ATTACH to one already
228
+ // listening on an explicitly requested port (see its own "attach if already
229
+ // Chrome" comment) — it returns only a port number, with no signal telling
230
+ // this caller which happened. getLaunchedPid(port) is undefined on the
231
+ // attach path (this process never spawned anything). Unconditionally saving
232
+ // {pid: undefined} on attach used to CLOBBER a real PID a previous `open`
233
+ // had persisted for this exact port, destroying the only way a later
234
+ // process's closeBrowser() PID-kill fallback could ever find it.
235
+ async function recordSession(browser, port) {
236
+ const pid = browser.getLaunchedPid(port);
237
+ if (pid !== undefined) {
238
+ await browser.saveSessionRecord(port, {
239
+ pid,
240
+ userDataDir: browser.getLaunchedUserDataDir(port),
241
+ });
242
+ return;
243
+ }
244
+ // A pre-#318 record for this exact port counts as the existing one, so
245
+ // attaching to a session an older CLI opened keeps its provenance (a
246
+ // `connect`ed browser stays launched:false and is never killed).
247
+ const existing = (await browser.loadSessionRecord(port)) ?? (await adoptLegacySession(browser, { port }));
248
+ await browser.saveSessionRecord(port, {
249
+ launched: existing?.launched,
250
+ pid: existing?.pid,
251
+ userDataDir: existing?.userDataDir,
252
+ });
104
253
  }
105
254
  export async function ensureConnected(port, targetId) {
106
255
  const browser = await getBrowser();
@@ -112,8 +261,10 @@ export async function ensureConnected(port, targetId) {
112
261
  browser.teardownConsoleCapture(session.sessionId);
113
262
  session.client.close();
114
263
  }
115
- const effectivePort = port === DEFAULT_PORT ? await resolveDefaultPort(browser) : port;
116
- session.port = await browser.launchBrowser({ port: effectivePort, headless: true });
264
+ // Pinned port, else the newest live session, else a session of our own —
265
+ // a command run before any `open` still just works.
266
+ const pinned = port > 0 ? port : ((await resolveLiveSession(browser))?.port ?? undefined);
267
+ session.port = await launchSessionBrowser(browser, { port: pinned, headless: true });
117
268
  const conn = await browser.connectToTarget(session.port, targetId);
118
269
  session.client = conn.client;
119
270
  session.sessionId = conn.sessionId;
@@ -140,7 +291,7 @@ export async function ensureConnected(port, targetId) {
140
291
  // via resolveRef's "not found" error) rather than the weaker 30s time-based
141
292
  // staleness check below, which only warns.
142
293
  export async function hydrateRefsFromCache(browser, targetId, currentUrl) {
143
- const cached = await browser.loadRefCache(targetId);
294
+ const cached = await browser.loadRefCache(session.port, targetId);
144
295
  if (!cached)
145
296
  return;
146
297
  if (currentUrl && cached.url && currentUrl !== cached.url) {
@@ -224,10 +375,16 @@ export async function switchToHeaded(url, port) {
224
375
  session.parentSessionId = '';
225
376
  session.targetId = '';
226
377
  }
227
- // Launch headed on a neighbouring port to avoid collision
228
- const headedPort = port + 10;
378
+ // Kernel-assigned free port and a profile of its own, so this temporary
379
+ // headed window cannot collide with any other session (#318) — a
380
+ // neighbouring port (port + 10) could well be another session's.
381
+ let headedPort = 0;
229
382
  try {
230
- await browser.launchBrowser({ port: headedPort, headless: false });
383
+ headedPort = await browser.launchBrowser({
384
+ port: 0,
385
+ headless: false,
386
+ userDataDir: join(tmpdir(), `monomind-browse-headed-${process.pid}-${randomUUID().slice(0, 8)}`),
387
+ });
231
388
  }
232
389
  catch (err) {
233
390
  // Headed launch failed (no display, locked down env). Restore headless and rethrow.