@parall/daemon 1.36.1 → 1.37.0

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 (56) hide show
  1. package/bundle/manifest.json +11 -11
  2. package/bundle/parall-browser-pod.js +307 -27
  3. package/bundle/parall-claude-agent.js +363 -50
  4. package/bundle/parall-codex-agent.js +362 -48
  5. package/bundle/parall-daemon.js +33473 -31706
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +2 -2
  8. package/dist/clip-runtime/browser-daemon-env.d.ts +29 -0
  9. package/dist/clip-runtime/browser-daemon-env.d.ts.map +1 -0
  10. package/dist/clip-runtime/browser-daemon-env.js +70 -0
  11. package/dist/clip-runtime/browser-profile-manager.d.ts +18 -5
  12. package/dist/clip-runtime/browser-profile-manager.d.ts.map +1 -1
  13. package/dist/clip-runtime/browser-profile-manager.js +149 -24
  14. package/dist/clip-runtime/browser-profile-pool.d.ts +250 -0
  15. package/dist/clip-runtime/browser-profile-pool.d.ts.map +1 -0
  16. package/dist/clip-runtime/browser-profile-pool.js +581 -0
  17. package/dist/clip-runtime/index.d.ts +2 -2
  18. package/dist/clip-runtime/index.d.ts.map +1 -1
  19. package/dist/clip-runtime/index.js +2 -1
  20. package/dist/clip-runtime/process-manager.d.ts +5 -3
  21. package/dist/clip-runtime/process-manager.d.ts.map +1 -1
  22. package/dist/clip-runtime/subprocess.d.ts +14 -0
  23. package/dist/clip-runtime/subprocess.d.ts.map +1 -1
  24. package/dist/clip-runtime/subprocess.js +49 -0
  25. package/dist/config.d.ts +14 -15
  26. package/dist/config.d.ts.map +1 -1
  27. package/dist/config.js +8 -26
  28. package/dist/daemon-main.d.ts +8 -0
  29. package/dist/daemon-main.d.ts.map +1 -0
  30. package/dist/daemon-main.js +165 -0
  31. package/dist/daemon-paths.d.ts +14 -0
  32. package/dist/daemon-paths.d.ts.map +1 -0
  33. package/dist/daemon-paths.js +26 -0
  34. package/dist/daemon-update-mode.d.ts +8 -0
  35. package/dist/daemon-update-mode.d.ts.map +1 -0
  36. package/dist/daemon-update-mode.js +18 -0
  37. package/dist/index.js +41 -167
  38. package/dist/runtime-bin-resolver.d.ts +4 -0
  39. package/dist/runtime-bin-resolver.d.ts.map +1 -1
  40. package/dist/runtime-bin-resolver.js +40 -7
  41. package/dist/runtime-detector.d.ts +30 -0
  42. package/dist/runtime-detector.d.ts.map +1 -0
  43. package/dist/runtime-detector.js +100 -0
  44. package/dist/supervisor.d.ts +53 -2
  45. package/dist/supervisor.d.ts.map +1 -1
  46. package/dist/supervisor.js +604 -67
  47. package/dist/update-health-gate.d.ts +66 -0
  48. package/dist/update-health-gate.d.ts.map +1 -0
  49. package/dist/update-health-gate.js +93 -0
  50. package/dist/updater-manifest.d.ts +2 -1
  51. package/dist/updater-manifest.d.ts.map +1 -1
  52. package/dist/updater-manifest.js +38 -7
  53. package/dist/updater.d.ts +13 -2
  54. package/dist/updater.d.ts.map +1 -1
  55. package/dist/updater.js +126 -17
  56. package/package.json +6 -6
@@ -0,0 +1,250 @@
1
+ import { type BrowserInvokeRequest, type BrowserInvoker, type BrowserProfileManagerOptions, type BrowserProfileStatus } from './browser-profile-manager.js';
2
+ import type { ViewerTurnConfig } from './browser-viewer-streamer.js';
3
+ /**
4
+ * The subset of BrowserProfileManager the pool drives. Extracted so tests can
5
+ * inject a fake runtime — the real manager spawns bb-browser + Chromium on the
6
+ * first command, which a unit test must not do — via
7
+ * {@link BrowserProfilePoolOptions.createManager}.
8
+ */
9
+ export interface BrowserProfileRuntime {
10
+ invoke(request: BrowserInvokeRequest): Promise<unknown>;
11
+ ensureRuntime(profileId: string, opts?: {
12
+ forceStatusReport?: boolean;
13
+ }): Promise<void>;
14
+ openProfile(profileId: string, startUrl?: string): Promise<void>;
15
+ handleViewerCommand(profileId: string, sessionId: string, command: string, input?: Record<string, unknown>, turn?: ViewerTurnConfig): Promise<Record<string, unknown>>;
16
+ stopProfile(profileId: string): Promise<void>;
17
+ stop(): Promise<void>;
18
+ }
19
+ export interface BrowserProfilePoolOptions {
20
+ /** Parent dir under which each profile gets its own `<baseHomeDir>/<profileId>` home. */
21
+ baseHomeDir: string;
22
+ log: BrowserProfileManagerOptions['log'];
23
+ /** Report a profile's status to the server. Unlike the manager's 3-arg callback,
24
+ * the pool's carries the lifecycle generation the op was acting under (PR #1650),
25
+ * so the server can reject a stale report. The pool injects the generation for
26
+ * manager-driven reports (it owns the per-op generation); supervisor passes it
27
+ * straight to client.reportBrowserProfileStatus. */
28
+ reportStatus?: (profileId: string, status: BrowserProfileStatus, errorMsg?: string, generation?: number) => void;
29
+ /** Per-profile outbound proxy resolver (#1642), threaded to each profile's
30
+ * manager so its isolated Chromium binds its own egress proxy at account_create. */
31
+ resolveProxy?: BrowserProfileManagerOptions['resolveProxy'];
32
+ /**
33
+ * Per-profile runtime factory. Defaults to a real {@link BrowserProfileManager};
34
+ * overridable in tests to avoid spawning a real bb-browser / Chromium.
35
+ */
36
+ createManager?: (opts: BrowserProfileManagerOptions) => BrowserProfileRuntime;
37
+ }
38
+ /**
39
+ * BrowserProfilePool — true per-profile isolation for the BYOC daemon supervisor.
40
+ *
41
+ * WHY THIS EXISTS. A single bb-browser/Chromium shared across profiles isolates
42
+ * only at the bb-browser "account" (CDP BrowserContext) level. That is real for
43
+ * cookies/storage, but bb-browser's COMMAND routing is account-blind: any command
44
+ * issued without an explicit tabId falls through to a single GLOBAL current tab
45
+ * (cdp.currentTargetId, else targets[0]) regardless of the `account` field
46
+ * (bb-browser-pro daemon.js ensurePageTarget). So when the global current tab
47
+ * belongs to profile A, a command meant for profile B executes in A's context —
48
+ * e.g. logging into a second account overwrites the first, and two profiles can
49
+ * never hold two different sessions at once (reproduced on a real Chrome).
50
+ *
51
+ * THE FIX. Give every profile its OWN bb-browser daemon + Chromium + on-disk home
52
+ * (`<baseHomeDir>/<profileId>`). Each Chromium then hosts exactly one profile, so
53
+ * there is no cross-profile global tab to leak into — isolation is enforced by the
54
+ * OS process + user-data-dir boundary, not by remembering to scope every command.
55
+ * The pool owns one {@link BrowserProfileManager} per profile and routes by
56
+ * profileId; an idle (stopped) profile holds no Chromium, so cost scales with the
57
+ * number of CONCURRENTLY-OPEN profiles, not the number that ever existed.
58
+ *
59
+ * NOT used by the hosted browser pod (`browser-pod.ts`): a pod serves exactly one
60
+ * profile, so it keeps using a single BrowserProfileManager directly (and its
61
+ * BrowserStateStore snapshots that manager's flat homeDir to S3 — the pool's
62
+ * per-profile nesting would break that). The pool is supervisor-only.
63
+ *
64
+ * OWNERSHIP. The pool is a per-profile runtime REGISTRY + the per-profile mutex
65
+ * (create / stop / list-active / invoke / viewer, serialized via `enqueue()`). The
66
+ * DESIRED-STATE coordinator is the supervisor: the server (clip-service) is the
67
+ * SSOT for which profiles should be live, and `DaemonSupervisor.reconcileBrowserProfiles`
68
+ * converges the local registry to it (open/ensure desired, stop the rest via
69
+ * `activeProfileIds()`). The pool keeps one bit of lifecycle policy — the `stopped`
70
+ * fence — because invoke (hub channel) and viewer funnel through it and must reject
71
+ * a stale command without a server round-trip.
72
+ */
73
+ export declare class BrowserProfilePool implements BrowserInvoker {
74
+ private readonly opts;
75
+ private readonly managers;
76
+ private readonly opChains;
77
+ private readonly stopped;
78
+ private readonly stopSeq;
79
+ private readonly generations;
80
+ private readonly opGeneration;
81
+ private stopping;
82
+ constructor(opts: BrowserProfilePoolOptions);
83
+ /** Inbound hub browser invoke for a profile — routed to that profile's own daemon. */
84
+ invoke(request: BrowserInvokeRequest): Promise<unknown>;
85
+ private runWithGeneration;
86
+ /**
87
+ * Reconcile-time: ensure the profile's runtime (account + tab) is live. If
88
+ * `sinceSeq` (the fence generation observed when this op was enqueued) is given
89
+ * and a newer stop has been observed since, skip — a stale reconcile/open queued
90
+ * before a stop must not un-fence and revive a profile about to be torn down
91
+ * (the pending stop wins; last-write-wins).
92
+ */
93
+ ensureRuntime(profileId: string, sinceSeq?: number, generation?: number, opts?: {
94
+ forceStatusReport?: boolean;
95
+ }): Promise<void>;
96
+ /** Lifecycle `open` — open (or reuse) the profile's start tab. `sinceSeq`: see ensureRuntime. */
97
+ openProfile(profileId: string, startUrl?: string, sinceSeq?: number, generation?: number): Promise<void>;
98
+ /** True if a newer stop was observed after this revive captured `sinceSeq`. */
99
+ private isStaleRevive;
100
+ /** Live-viewer control command for a profile — routed to its own daemon/streamer. */
101
+ handleViewerCommand(profileId: string, sessionId: string, command: string, input?: Record<string, unknown>, turn?: ViewerTurnConfig): Promise<Record<string, unknown>>;
102
+ /**
103
+ * Lifecycle `stop` (explicit, owner-driven) — stop the profile's viewer + tear
104
+ * down its bb-browser daemon and Chromium to free the resources (an idle profile
105
+ * must not keep a browser running). Confirms `stopped` back to the server: the
106
+ * stop API already set the server row to `stopped`, and this report keeps the
107
+ * daemon authoritative over the actual runtime state (the no-runtime case still
108
+ * confirms). For reconcile-driven cleanup of profiles the server no longer owns
109
+ * here, use {@link releaseRuntime} — it must NOT report.
110
+ */
111
+ stopProfile(profileId: string, generation?: number): Promise<void>;
112
+ /**
113
+ * Reconcile teardown (negative convergence) — release a local runtime the server
114
+ * no longer lists as live on this machine (stopped / deleted / reassigned).
115
+ * Fences + disposes like a stop, but does NOT report status: here the server is
116
+ * the desired-state SSOT, so a daemon-side `stopped` push is semantically wrong
117
+ * (for a profile reassigned to another machine it isn't ours to report — the
118
+ * server's machine-binding check rejects it as 404 anyway) and only emits
119
+ * spurious calls. Local-only cleanup.
120
+ */
121
+ releaseRuntime(profileId: string): Promise<void>;
122
+ /**
123
+ * Synchronously fence a profile (reject late invoke/viewer until an explicit
124
+ * reopen) WITHOUT tearing anything down. The supervisor calls this the moment a
125
+ * stop/reset lifecycle event is received, before the queued stop/reset op runs:
126
+ * a hub invoke — which bypasses the supervisor queue and hits {@link invoke}
127
+ * directly — authorized just before the server row flipped to `stopped` could
128
+ * otherwise arrive in that window and spawn a transient Chromium the stop then
129
+ * immediately tears down. Fencing now rejects it instead. An in-flight invoke
130
+ * already past the fence check is unaffected (the queued stop serializes behind
131
+ * it); open/ensure clears the fence. Idempotent; no-op once stopping.
132
+ */
133
+ fence(profileId: string): void;
134
+ /** The current fence generation for a profile — captured by a revive at enqueue. */
135
+ stopSeqOf(profileId: string): number;
136
+ /**
137
+ * Lifecycle `reset` — wipe the profile's persisted state (cookies, localStorage,
138
+ * IndexedDB, cache) for a clean slate. Removes BOTH the per-profile home AND any
139
+ * unmigrated legacy flat cookie file — a reset done before the profile's first
140
+ * post-upgrade open would otherwise leave the legacy file in place, and the lazy
141
+ * migration would re-import the old login on the next open, silently undoing the
142
+ * reset. Done AFTER the daemon is stopped so Chromium has released its files.
143
+ * Isolated by construction — it can never touch another profile's state.
144
+ * Fail-closed: if the wipe fails (e.g. Chromium still holds a file, or a
145
+ * permission error), report `error` and throw rather than report `stopped` —
146
+ * a reset that left state on disk must not be marked clean, since the next open
147
+ * could restore the old login. Reports `stopped` only on a confirmed wipe.
148
+ */
149
+ resetProfile(profileId: string, generation?: number, resetGeneration?: number): Promise<void>;
150
+ /**
151
+ * Apply a reset the daemon hasn't yet (caught on reconnect when the server's
152
+ * reset_generation is newer than this daemon's recorded one). Same wipe as
153
+ * resetProfile but WITHOUT a status report — the caller drives desired state (an
154
+ * open/ensure reports running for a still-desired profile; a stopped profile is
155
+ * left stopped). Must run BEFORE any open/ensure for the profile so a reopen starts
156
+ * from clean state, never the old cookies (the supervisor enqueues it first).
157
+ */
158
+ applyResetWipe(profileId: string, resetGeneration: number): Promise<void>;
159
+ private doResetWipe;
160
+ /**
161
+ * Reconnect cleanup for a profile the server no longer lists AT ALL (deleted or
162
+ * reassigned away): dispose any runtime and wipe the per-profile home — the old host
163
+ * must not keep its cookies/storage. NO status report (the server is the SSOT and the
164
+ * row is gone there); fences too. Idempotent (a wiped home simply isn't found again).
165
+ */
166
+ wipeAbsent(profileId: string): Promise<void>;
167
+ /**
168
+ * Tear down every profile's daemon (supervisor shutdown). TERMINAL: the
169
+ * supervisor discards the pool after this, so `stopping` stays set forever —
170
+ * manager() refuses any further op. Drain outstanding per-profile chains BEFORE
171
+ * clearing the maps, so a queued op whose `prev` settles only after stop()
172
+ * returns can't slip through manager() and recreate a runtime (orphaning a
173
+ * Chromium past shutdown); `stopping` is the backstop if one still races in.
174
+ */
175
+ stop(): Promise<void>;
176
+ /**
177
+ * Registry view: profile ids that currently hold a live local runtime. The
178
+ * supervisor (the desired-state coordinator) diffs this against the server's
179
+ * desired-live set on full reconcile and stops the extras via stopProfile() —
180
+ * the convergence policy lives there, not here; the pool only owns runtime
181
+ * lifecycle mechanics.
182
+ */
183
+ activeProfileIds(): string[];
184
+ /**
185
+ * Run `op` after every prior operation for this profile settles — a per-profile
186
+ * serialization so invoke / open / stop / reset / viewer never interleave for
187
+ * one profile (different profiles still run in parallel). Bounded: bb-browser
188
+ * commands time out (~30s), so a stop never waits forever behind a hung invoke.
189
+ * Also normalizes a synchronous throw from `op` into a rejected promise.
190
+ *
191
+ * QUEUE CONTRACT. This is the FINAL per-profile mutex — EVERY pool entrypoint
192
+ * (invoke, open, ensure, stop, reset, viewer) goes through it, so it alone
193
+ * guarantees per-profile mutual exclusion. The supervisor's separate
194
+ * `enqueueBrowserProfileOp` is a higher-level ORDERING layer for the ops it
195
+ * originates (WS lifecycle/viewer events + reconcile), not a second mutex. Hub
196
+ * invokes arrive from the clip runtime and do NOT pass through the supervisor
197
+ * queue — only this one. So: do not assume "all profile ops share one queue";
198
+ * they share THIS one.
199
+ */
200
+ private enqueue;
201
+ /**
202
+ * Get (or lazily create) the dedicated manager for a profile. Synchronous so the
203
+ * get-or-create is atomic — the bb-browser daemon itself starts lazily on first
204
+ * command, not here.
205
+ */
206
+ private manager;
207
+ /** Stop a manager and drop it from the map (identity-checked so a concurrent
208
+ * recreate during the async stop is never evicted). */
209
+ private dispose;
210
+ private profileHome;
211
+ /** Legacy shared-layout cookie file for a profile (pre per-profile homes). */
212
+ private legacyAccountFile;
213
+ /**
214
+ * Remove every on-disk trace of a profile: its per-profile home AND any
215
+ * unmigrated legacy flat cookie file — otherwise a later open would re-import
216
+ * the legacy cookies (see resetProfile). Throws if any target could not be
217
+ * removed so the caller can fail the reset closed rather than report a clean
218
+ * slate while state survives on disk.
219
+ */
220
+ private removeProfileState;
221
+ private metaFile;
222
+ /** The reset_generation this daemon has applied for the profile (0 if unknown). */
223
+ appliedResetGeneration(profileId: string): number;
224
+ private writeResetGeneration;
225
+ /**
226
+ * Profile ids that have ANY local state on this host — the reconcile's inventory for
227
+ * finding deleted/reassigned profiles whose residue must be wiped. Union of the two
228
+ * storage layouts this pool owns:
229
+ * - per-profile home dirs `<baseHomeDir>/brp_*`
230
+ * - legacy flat account files `<baseHomeDir>/accounts/brp_*.json` (pre per-profile
231
+ * homes; a profile deleted before its first post-upgrade reopen has ONLY this file
232
+ * and no home dir, so home-only enumeration would miss its login residue)
233
+ * Only names passing the strict brp_ check are returned, and the two layouts are
234
+ * deduped, so reconnect cleanup never touches the `accounts/` dir itself, a hidden
235
+ * dir, `legacy.json`, or any non-profile entry. removeProfileState wipes both layouts.
236
+ */
237
+ localStateProfileIds(): string[];
238
+ /**
239
+ * One-time, lazy migration from the legacy shared layout. Before per-profile
240
+ * homes, all profiles shared one bb-browser home and bb-browser persisted each
241
+ * profile's cookies to `<baseHomeDir>/accounts/<profileId>.json` (account name =
242
+ * profileId). Move that file into the profile's own `accounts/` dir on first use
243
+ * so existing cookie logins survive the upgrade instead of forcing a re-login.
244
+ * Only cookies are migrated — the shared `chrome-data/` was a single comingled
245
+ * Chromium profile that cannot be split per profile, and bb-browser never
246
+ * persisted localStorage/IndexedDB across restarts anyway.
247
+ */
248
+ private migrateFlatProfileState;
249
+ }
250
+ //# sourceMappingURL=browser-profile-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-profile-pool.d.ts","sourceRoot":"","sources":["../../src/clip-runtime/browser-profile-pool.ts"],"names":[],"mappings":"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"}