@amalgm/browser 0.1.2-preview.37254096068 → 0.1.2-preview.37266617347

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.
@@ -40,16 +40,20 @@ export async function launchChrome(input) {
40
40
  const killOnExit = () => { child.kill('SIGKILL'); };
41
41
  process.once('exit', killOnExit);
42
42
  void exited.then(() => process.removeListener('exit', killOnExit));
43
+ let browserUrl;
44
+ // Chrome writes its profile, cookies included, only when it closes itself. A signal skips that,
45
+ // and on Windows every signal is a hard kill, so Chrome is asked over CDP and forced only if it stays.
43
46
  const kill = async () => {
44
47
  if (child.exitCode !== null || child.signalCode !== null)
45
48
  return;
46
- child.kill('SIGTERM');
47
49
  const forced = setTimeout(() => child.kill('SIGKILL'), 3_000);
50
+ if (!browserUrl || !await requestClose(browserUrl))
51
+ child.kill('SIGTERM');
48
52
  await exited;
49
53
  clearTimeout(forced);
50
54
  };
51
55
  try {
52
- const browserUrl = await deadline(listening, input.timeoutMs || 20_000, 'Chrome start');
56
+ browserUrl = await deadline(listening, input.timeoutMs || 20_000, 'Chrome start');
53
57
  return { pid: child.pid, browserUrl, exited, kill };
54
58
  }
55
59
  catch {
@@ -85,6 +89,18 @@ function readPortFile(file) {
85
89
  return null;
86
90
  }
87
91
  }
92
+ async function requestClose(endpoint) {
93
+ const control = await connectCdp(endpoint, AbortSignal.timeout(2_000)).catch(() => null);
94
+ if (!control)
95
+ return false;
96
+ try {
97
+ await control.call('Browser.close', {}, 2_000).catch(() => undefined);
98
+ return true;
99
+ }
100
+ finally {
101
+ control.close();
102
+ }
103
+ }
88
104
  // The old profile publishes an unguessable browser endpoint. After obtaining
89
105
  // the lease, retire that exact Chrome through CDP; never signal a reused PID.
90
106
  async function closeOrphan(userDataDir) {
@@ -1 +1 @@
1
- {"version":3,"file":"launch.js","sourceRoot":"","sources":["../../../src/chrome/launch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"launch.js","sourceRoot":"","sources":["../../../src/chrome/launch.ts"],"names":[],"mappings":"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"}
@@ -30,8 +30,14 @@ export class BrowserCookieCoordinator {
30
30
  connection.current.set(key, value);
31
31
  else
32
32
  connection.current.delete(key);
33
- if (connection.expected.has(key) && sameCookie(value, connection.expected.get(key))) {
34
- connection.expected.delete(key);
33
+ // A browser reports applies in order, and a report can arrive after a newer apply.
34
+ const applied = connection.expected.get(key) || [];
35
+ const echoed = applied.findIndex(expected => sameCookie(value, expected));
36
+ if (echoed >= 0) {
37
+ if (echoed === applied.length - 1)
38
+ connection.expected.delete(key);
39
+ else
40
+ applied.splice(0, echoed + 1);
35
41
  return;
36
42
  }
37
43
  connection.pending.set(key, { cookie, removed: change.removed });
@@ -134,9 +140,10 @@ export class BrowserCookieCoordinator {
134
140
  const changes = connection.version === undefined
135
141
  ? { upserts: local.filter(cookie => !known.has(cookieKey(cookie))), deletes: [] }
136
142
  : diffCookies([...previous.values()], local);
137
- changes.upserts = changes.upserts.filter(cookie => !sameCookie(cookie, connection.expected.get(cookieKey(cookie))));
143
+ const applied = (key) => connection.expected.get(key)?.at(-1);
144
+ changes.upserts = changes.upserts.filter(cookie => !sameCookie(cookie, applied(cookieKey(cookie))));
138
145
  changes.deletes = changes.deletes.filter(cookie => !connection.expected.has(cookieKey(cookie))
139
- || connection.expected.get(cookieKey(cookie)) !== undefined);
146
+ || applied(cookieKey(cookie)) !== undefined);
140
147
  connection.expected.clear(); // The snapshot settled every earlier apply, echoed or not.
141
148
  if (changes.upserts.length || changes.deletes.length)
142
149
  await this.store.merge({ sourceId: connection.adapter.id, ...changes });
@@ -154,10 +161,13 @@ export class BrowserCookieCoordinator {
154
161
  && connection.current.has(cookieKey(cookie)));
155
162
  if ((!upserts.length && !deletes.length) || connection.closed)
156
163
  return;
164
+ const expect = (key, value) => {
165
+ connection.expected.set(key, [...connection.expected.get(key) || [], value]);
166
+ };
157
167
  for (const cookie of upserts)
158
- connection.expected.set(cookieKey(cookie), cookie);
168
+ expect(cookieKey(cookie), cookie);
159
169
  for (const cookie of deletes)
160
- connection.expected.set(cookieKey(cookie), undefined);
170
+ expect(cookieKey(cookie), undefined);
161
171
  await connection.adapter.apply({ upserts, deletes, versionToken: delta.versionToken });
162
172
  for (const cookie of upserts)
163
173
  if (!connection.pending.has(cookieKey(cookie)))
@@ -1 +1 @@
1
- {"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../../src/cookies/coordinator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../../src/cookies/coordinator.ts"],"names":[],"mappings":"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"}
@@ -12805,8 +12805,11 @@ var BrowserCookieCoordinator = class {
12805
12805
  const value = change.removed ? void 0 : cookie;
12806
12806
  if (value) connection.current.set(key, value);
12807
12807
  else connection.current.delete(key);
12808
- if (connection.expected.has(key) && sameCookie(value, connection.expected.get(key))) {
12809
- connection.expected.delete(key);
12808
+ const applied = connection.expected.get(key) || [];
12809
+ const echoed = applied.findIndex((expected) => sameCookie(value, expected));
12810
+ if (echoed >= 0) {
12811
+ if (echoed === applied.length - 1) connection.expected.delete(key);
12812
+ else applied.splice(0, echoed + 1);
12810
12813
  return;
12811
12814
  }
12812
12815
  connection.pending.set(key, { cookie, removed: change.removed });
@@ -12893,8 +12896,9 @@ var BrowserCookieCoordinator = class {
12893
12896
  connection.current = new Map(local.map((cookie) => [cookieKey(cookie), cookie]));
12894
12897
  const known = /* @__PURE__ */ new Set([...state.cookies.map(cookieKey), ...state.tombstones.map(({ key }) => key)]);
12895
12898
  const changes = connection.version === void 0 ? { upserts: local.filter((cookie) => !known.has(cookieKey(cookie))), deletes: [] } : diffCookies([...previous.values()], local);
12896
- changes.upserts = changes.upserts.filter((cookie) => !sameCookie(cookie, connection.expected.get(cookieKey(cookie))));
12897
- changes.deletes = changes.deletes.filter((cookie) => !connection.expected.has(cookieKey(cookie)) || connection.expected.get(cookieKey(cookie)) !== void 0);
12899
+ const applied = (key) => connection.expected.get(key)?.at(-1);
12900
+ changes.upserts = changes.upserts.filter((cookie) => !sameCookie(cookie, applied(cookieKey(cookie))));
12901
+ changes.deletes = changes.deletes.filter((cookie) => !connection.expected.has(cookieKey(cookie)) || applied(cookieKey(cookie)) !== void 0);
12898
12902
  connection.expected.clear();
12899
12903
  if (changes.upserts.length || changes.deletes.length) await this.store.merge({ sourceId: connection.adapter.id, ...changes });
12900
12904
  const changed = new Set([...changes.upserts, ...changes.deletes].map(cookieKey));
@@ -12907,8 +12911,11 @@ var BrowserCookieCoordinator = class {
12907
12911
  const upserts = delta.upserts.flatMap((cookie) => this.portable(connection, cookie) || []).filter((cookie) => !sameCookie(cookie, connection.current.get(cookieKey(cookie))));
12908
12912
  const deletes = delta.deletes.filter((cookie) => this.portable(connection, { ...cookie, value: "" }) && connection.current.has(cookieKey(cookie)));
12909
12913
  if (!upserts.length && !deletes.length || connection.closed) return;
12910
- for (const cookie of upserts) connection.expected.set(cookieKey(cookie), cookie);
12911
- for (const cookie of deletes) connection.expected.set(cookieKey(cookie), void 0);
12914
+ const expect = (key, value) => {
12915
+ connection.expected.set(key, [...connection.expected.get(key) || [], value]);
12916
+ };
12917
+ for (const cookie of upserts) expect(cookieKey(cookie), cookie);
12918
+ for (const cookie of deletes) expect(cookieKey(cookie), void 0);
12912
12919
  await connection.adapter.apply({ upserts, deletes, versionToken: delta.versionToken });
12913
12920
  for (const cookie of upserts) if (!connection.pending.has(cookieKey(cookie))) connection.current.set(cookieKey(cookie), cookie);
12914
12921
  for (const cookie of deletes) if (!connection.pending.has(cookieKey(cookie))) connection.current.delete(cookieKey(cookie));
@@ -1,65 +1,86 @@
1
1
  import { spawn } from 'node:child_process';
2
+ import { randomUUID } from 'node:crypto';
3
+ import fs from 'node:fs';
4
+ import os from 'node:os';
5
+ import path from 'node:path';
2
6
  import { BrowserError } from './errors.js';
7
+ // A process is done when it exits. Its output goes to files rather than pipes: a daemon it
8
+ // starts can inherit its output handles (agent-browser's does on Windows) and would hold a
9
+ // pipe open for the daemon's whole life.
3
10
  export class NodeProcessLauncher {
4
11
  async run(input) {
5
12
  if (input.signal?.aborted)
6
13
  throw new BrowserError('ABORTED', 'Browser operation was cancelled.');
7
- return new Promise((resolve, reject) => {
8
- const child = spawn(input.command, input.args, {
9
- cwd: input.cwd,
10
- env: input.env,
11
- shell: false,
12
- stdio: [input.stdin === undefined ? 'ignore' : 'pipe', 'pipe', 'pipe'],
14
+ const stdout = outputFile();
15
+ const stderr = outputFile();
16
+ try {
17
+ const { code, signal, timedOut } = await new Promise((resolve, reject) => {
18
+ const child = spawn(input.command, input.args, {
19
+ cwd: input.cwd,
20
+ env: input.env,
21
+ shell: false,
22
+ stdio: [input.stdin === undefined ? 'ignore' : 'pipe', stdout.fd, stderr.fd],
23
+ });
24
+ let timedOut = false;
25
+ let forceTimer;
26
+ if (input.stdin !== undefined)
27
+ child.stdin.end(input.stdin);
28
+ const terminate = () => {
29
+ child.kill('SIGTERM');
30
+ forceTimer = setTimeout(() => child.kill('SIGKILL'), 2_000);
31
+ forceTimer.unref();
32
+ };
33
+ const timeout = setTimeout(() => { timedOut = true; terminate(); }, input.timeoutMs);
34
+ const abort = () => terminate();
35
+ input.signal?.addEventListener('abort', abort, { once: true });
36
+ const settle = () => {
37
+ clearTimeout(timeout);
38
+ if (forceTimer)
39
+ clearTimeout(forceTimer);
40
+ input.signal?.removeEventListener('abort', abort);
41
+ };
42
+ child.once('error', (error) => { settle(); reject(error); });
43
+ child.once('exit', (code, signal) => { settle(); resolve({ code, signal, timedOut }); });
13
44
  });
14
- let stdout = '';
15
- let stderr = '';
16
- let settled = false;
17
- let timedOut = false;
18
- let forceTimer;
19
- const append = (current, chunk) => (current + chunk.toString()).slice(-input.outputLimit);
20
- child.stdout.on('data', (chunk) => { stdout = append(stdout, chunk); });
21
- child.stderr.on('data', (chunk) => { stderr = append(stderr, chunk); });
22
- if (input.stdin !== undefined)
23
- child.stdin.end(input.stdin);
24
- const terminate = () => {
25
- child.kill('SIGTERM');
26
- forceTimer = setTimeout(() => child.kill('SIGKILL'), 2_000);
27
- forceTimer.unref();
28
- };
29
- const timeout = setTimeout(() => { timedOut = true; terminate(); }, input.timeoutMs);
30
- const abort = () => terminate();
31
- input.signal?.addEventListener('abort', abort, { once: true });
32
- const finish = (error, result) => {
33
- if (settled)
34
- return;
35
- settled = true;
36
- clearTimeout(timeout);
37
- if (forceTimer)
38
- clearTimeout(forceTimer);
39
- input.signal?.removeEventListener('abort', abort);
40
- if (error)
41
- reject(error);
42
- else
43
- resolve(result);
44
- };
45
- child.on('error', (error) => finish(error));
46
- child.on('close', (code, signal) => {
47
- if (input.signal?.aborted) {
48
- finish(new BrowserError('ABORTED', 'Browser operation was cancelled.'));
49
- }
50
- else if (timedOut) {
51
- finish(new BrowserError('TIMEOUT', `Browser process exceeded ${input.timeoutMs}ms.`));
52
- }
53
- else if (signal || code === null) {
54
- finish(new BrowserError('PROCESS_FAILED', `Browser process terminated by ${signal || 'an unknown signal'}.`));
55
- }
56
- else {
57
- finish(undefined, { code, stdout, stderr });
58
- }
59
- });
60
- });
45
+ if (input.signal?.aborted)
46
+ throw new BrowserError('ABORTED', 'Browser operation was cancelled.');
47
+ if (timedOut)
48
+ throw new BrowserError('TIMEOUT', `Browser process exceeded ${input.timeoutMs}ms.`);
49
+ if (signal || code === null) {
50
+ throw new BrowserError('PROCESS_FAILED', `Browser process terminated by ${signal || 'an unknown signal'}.`);
51
+ }
52
+ return { code, stdout: stdout.tail(input.outputLimit), stderr: stderr.tail(input.outputLimit) };
53
+ }
54
+ finally {
55
+ try {
56
+ stdout.remove();
57
+ }
58
+ finally {
59
+ stderr.remove();
60
+ }
61
+ }
61
62
  }
62
63
  }
64
+ function outputFile() {
65
+ const file = path.join(os.tmpdir(), `amalgm-browser-process-${randomUUID()}`);
66
+ const fd = fs.openSync(file, 'wx+', 0o600);
67
+ return {
68
+ fd,
69
+ tail(limit) {
70
+ // A UTF-8 character is at most four bytes, so this many bytes hold the last `limit` characters.
71
+ const size = fs.fstatSync(fd).size;
72
+ const length = Math.min(size, limit * 4);
73
+ const bytes = Buffer.alloc(length);
74
+ fs.readSync(fd, bytes, 0, length, size - length);
75
+ return bytes.toString().slice(-limit);
76
+ },
77
+ remove() {
78
+ fs.closeSync(fd);
79
+ // A daemon may still hold the file; the system frees it when that handle closes.
80
+ fs.rmSync(file, { force: true });
81
+ },
82
+ };
83
+ }
63
84
  export function pidIsRunning(pid) {
64
85
  if (!Number.isInteger(pid) || pid <= 0)
65
86
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/process.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/process.ts"],"names":[],"mappings":"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"}
package/docs/CHROME.md CHANGED
@@ -115,8 +115,11 @@ does not poll history, and closing it releases its observation connection.
115
115
 
116
116
  `browser.close()` stops admission, cancels and drains in-flight operations,
117
117
  then stops recordings, detaches every daemon, drains queued cookie changes,
118
- stops Chrome (SIGTERM, then SIGKILL after 3 seconds), and closes the
119
- registry. Chrome is also killed if the Node process exits.
118
+ asks Chrome to close over CDP, and closes the registry. Chrome writes its
119
+ profile only when it closes itself; a signal skips that, and on Windows every
120
+ signal is a hard kill. A cookie Chrome had not yet reported is therefore on its
121
+ disk, and the next start reconciles it. Chrome is killed if it has not exited
122
+ 3 seconds after the request, or if the Node process exits.
120
123
 
121
124
  ## Configuration
122
125
 
@@ -137,7 +140,10 @@ is killed, and that loopback cookies never enter the account. It also measures
137
140
  zero cookie scans and history reads while idle, including with a live viewer,
138
141
  and verifies background cookie writes and tab-switch history updates. The busy
139
142
  page examination starts with 1000 cookies and requires 60 edits to cause zero
140
- full-store scans, exactly 60 encrypted row writes, and under 120 KB of encoded
141
- state. Observer reload, worker restart, HttpOnly and partitioned events are exercised in real
142
- Chrome. Timing/CPU observations describe this local workload, not a universal
143
+ full-store scans, one encrypted row write per commit (edits that arrive during a
144
+ commit coalesce, so at most 60), and under 120 KB of encoded state. Observer
145
+ reload, worker restart, HttpOnly and partitioned events are exercised in real
146
+ Chrome. Another browser's edits that arrive while Chrome is still writing the
147
+ previous one must leave Chrome and the account at the last edit, with none of
148
+ Chrome's reports of those writes taken for its own edits. Timing/CPU observations describe this local workload, not a universal
143
149
  website latency guarantee.
package/docs/COOKIES.md CHANGED
@@ -27,6 +27,8 @@ Each adapter serializes its events. Pending changes to the same identity
27
27
  coalesce while existing work is in flight; there is no debounce delay. Applying
28
28
  a jar change records its expected echo before writing the physical store.
29
29
  That echo never becomes a new local edit, including after an interrupted apply.
30
+ A store reports writes in order but can report one after a newer write to the
31
+ same cookie, so each identity keeps every echo it still expects, oldest first.
30
32
  On first contact, physical cookies contribute only identities the jar has never
31
33
  known. Stale disk cookies cannot resurrect a deletion; an observed new edit can.
32
34
  An unavailable store retains pending changes and waits for another cookie or
package/docs/TESTING.md CHANGED
@@ -21,7 +21,8 @@ npm run verify # check, build, test, package/install
21
21
  - all 22 actions reachable through SDK, CLI, MCP, REST, and Toolbox, from one
22
22
  action manifest; an MCP call without a session uses its chat's session
23
23
  - two-way cookie sync: sign-ins and sign-outs reach the account, failed
24
- applies retry without echo, partitioned cookies, protected hosts
24
+ applies retry without echo, echoes reported after a newer write,
25
+ partitioned cookies, protected hosts
25
26
  - record-level merges, tombstones, corrupt-jar health, wrong-key redaction
26
27
  - auth filtering, login token TTL and hashing, deprecated-input compatibility,
27
28
  serialized live login transitions
@@ -51,8 +52,9 @@ through the MCP adapter against a public site. It checks that:
51
52
  - repeated login activation preserves the page, terminal states remain final,
52
53
  and recorded imagery can be decoded.
53
54
 
54
- CI provisions Chrome for Testing through the locked `agent-browser`
55
- dependency before this suite. Mocks cannot validate these paths.
55
+ CI runs this suite on Linux and Windows and provisions Chrome for Testing
56
+ through the locked `agent-browser` dependency first. Mocks cannot validate
57
+ these paths.
56
58
 
57
59
  UI's `test:browser` source examination additionally drives its canonical web
58
60
  and Electron browser surfaces through the actual UI routes and Shell gateway.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amalgm/browser",
3
- "version": "0.1.2-preview.37254096068",
3
+ "version": "0.1.2-preview.37266617347",
4
4
  "description": "The amalgm runtime's browser: one Chrome, a session per chat, and the account's cookies in every view.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -126,7 +126,8 @@
126
126
  "workflow": "verify.yml",
127
127
  "jobs": [
128
128
  "verify",
129
- "real-browser"
129
+ "real-browser (ubuntu-latest)",
130
+ "real-browser (windows-latest)"
130
131
  ],
131
132
  "verify": "verify",
132
133
  "cli": [
@@ -150,11 +151,11 @@
150
151
  "@amalgm/core"
151
152
  ]
152
153
  },
153
- "gitHead": "9a5d40729134e87c55fdbb7a52ad42711eef7163",
154
+ "gitHead": "49a914a43ff1d37e8c97e43a3e7740d487101cf9",
154
155
  "amalgmSource": {
155
156
  "repository": "amalgm-inc/amalgm-browser",
156
157
  "branch": "preview",
157
- "commit": "9a5d40729134e87c55fdbb7a52ad42711eef7163",
158
- "occurrence": "37254096068"
158
+ "commit": "49a914a43ff1d37e8c97e43a3e7740d487101cf9",
159
+ "occurrence": "37266617347"
159
160
  }
160
161
  }