teamshare-bridge 0.22.8 → 0.22.10
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.
- package/dist/bridge/auto-upgrade.d.ts +92 -0
- package/dist/bridge/auto-upgrade.js +159 -6
- package/dist/bridge/auto-upgrade.js.map +1 -1
- package/dist/bridge/daemon-instance.d.ts +17 -0
- package/dist/bridge/daemon-instance.js +58 -0
- package/dist/bridge/daemon-instance.js.map +1 -1
- package/dist/bridge/daemon-support.js +25 -5
- package/dist/bridge/daemon-support.js.map +1 -1
- package/dist/bridge/daemon.js +254 -83
- package/dist/bridge/daemon.js.map +1 -1
- package/dist/bridge/doctor.js +42 -5
- package/dist/bridge/doctor.js.map +1 -1
- package/dist/bridge/index.js +42 -3
- package/dist/bridge/index.js.map +1 -1
- package/dist/bridge/local-server.d.ts +2 -0
- package/dist/bridge/local-server.js +158 -19
- package/dist/bridge/local-server.js.map +1 -1
- package/dist/bridge/protocol.js +3 -12
- package/dist/bridge/protocol.js.map +1 -1
- package/dist/bridge/session-relay.d.ts +8 -0
- package/dist/bridge/session-relay.js +56 -5
- package/dist/bridge/session-relay.js.map +1 -1
- package/dist/bridge/upgrade-marker.d.ts +24 -2
- package/dist/bridge/upgrade-marker.js +30 -2
- package/dist/bridge/upgrade-marker.js.map +1 -1
- package/dist/bridge/upgrade-preflight.d.ts +49 -0
- package/dist/bridge/upgrade-preflight.js +164 -0
- package/dist/bridge/upgrade-preflight.js.map +1 -0
- package/dist/cli/commands/board.js +10 -1
- package/dist/cli/commands/board.js.map +1 -1
- package/dist/cli/commands/browse.js +10 -6
- package/dist/cli/commands/browse.js.map +1 -1
- package/dist/cli/commands/browser.js +6 -7
- package/dist/cli/commands/browser.js.map +1 -1
- package/dist/cli/commands/build.js +28 -5
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/chat.js +10 -1
- package/dist/cli/commands/chat.js.map +1 -1
- package/dist/cli/commands/cleanup.js +1 -11
- package/dist/cli/commands/cleanup.js.map +1 -1
- package/dist/cli/commands/connect.js +2 -8
- package/dist/cli/commands/connect.js.map +1 -1
- package/dist/cli/commands/disconnect.js +4 -10
- package/dist/cli/commands/disconnect.js.map +1 -1
- package/dist/cli/commands/doc.js +10 -1
- package/dist/cli/commands/doc.js.map +1 -1
- package/dist/cli/commands/planner.js +10 -1
- package/dist/cli/commands/planner.js.map +1 -1
- package/dist/cli/commands/research.js +21 -4
- package/dist/cli/commands/research.js.map +1 -1
- package/dist/cli/commands/run.js +10 -1
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/lib/brief.js +18 -1
- package/dist/lib/brief.js.map +1 -1
- package/dist/lib/browser/browse-stealth.js +37 -6
- package/dist/lib/browser/browse-stealth.js.map +1 -1
- package/dist/lib/browser/profile-guard.d.ts +23 -0
- package/dist/lib/browser/profile-guard.js +72 -0
- package/dist/lib/browser/profile-guard.js.map +1 -0
- package/dist/lib/chat/daemon-reporter.js +8 -1
- package/dist/lib/chat/daemon-reporter.js.map +1 -1
- package/dist/lib/git/git-discovery.d.ts +23 -4
- package/dist/lib/git/git-discovery.js +67 -19
- package/dist/lib/git/git-discovery.js.map +1 -1
- package/dist/lib/git/git-finalize.js +53 -1
- package/dist/lib/git/git-finalize.js.map +1 -1
- package/dist/lib/git/index-recovery.js +91 -1
- package/dist/lib/git/index-recovery.js.map +1 -1
- package/dist/lib/harness/agy-pty.d.ts +1 -1
- package/dist/lib/harness/agy-pty.js +20 -4
- package/dist/lib/harness/agy-pty.js.map +1 -1
- package/dist/lib/harness/spawn.js +98 -24
- package/dist/lib/harness/spawn.js.map +1 -1
- package/dist/lib/lock.d.ts +6 -0
- package/dist/lib/lock.js +108 -15
- package/dist/lib/lock.js.map +1 -1
- package/dist/lib/orchestrator/handlers/browser.js +9 -8
- package/dist/lib/orchestrator/handlers/browser.js.map +1 -1
- package/dist/lib/orchestrator/handlers/git.js +88 -6
- package/dist/lib/orchestrator/handlers/git.js.map +1 -1
- package/dist/lib/orchestrator/worktree.d.ts +10 -0
- package/dist/lib/orchestrator/worktree.js +243 -101
- package/dist/lib/orchestrator/worktree.js.map +1 -1
- package/dist/lib/tail-file.d.ts +4 -0
- package/dist/lib/tail-file.js +73 -0
- package/dist/lib/tail-file.js.map +1 -0
- package/dist/lib/tools/browser-tool.js +13 -2
- package/dist/lib/tools/browser-tool.js.map +1 -1
- package/dist/lib/wake-claim.d.ts +4 -3
- package/dist/lib/wake-claim.js +81 -20
- package/dist/lib/wake-claim.js.map +1 -1
- package/dist/lib/workspace/bus.d.ts +32 -0
- package/dist/lib/workspace/bus.js +48 -1
- package/dist/lib/workspace/bus.js.map +1 -1
- package/dist/lib/workspace/mirror-lease.js +30 -1
- package/dist/lib/workspace/mirror-lease.js.map +1 -1
- package/dist/lib/workspace/mirror.js +22 -1
- package/dist/lib/workspace/mirror.js.map +1 -1
- package/dist/lib/workspace/presence.js +38 -14
- package/dist/lib/workspace/presence.js.map +1 -1
- package/dist/lib/workspace/repo-lock.d.ts +21 -1
- package/dist/lib/workspace/repo-lock.js +146 -21
- package/dist/lib/workspace/repo-lock.js.map +1 -1
- package/dist/lib/workspace/stop-save.js +10 -0
- package/dist/lib/workspace/stop-save.js.map +1 -1
- package/package.json +1 -1
- package/tools/workspace-arbitration-check.mjs +39 -33
|
@@ -8,6 +8,20 @@ const session_stream_1 = require("../lib/chat/session-stream");
|
|
|
8
8
|
const BATCH_MS = 200;
|
|
9
9
|
const TRANSCRIPT_LIMIT = 500;
|
|
10
10
|
const SESSIONS_DIR = (0, node_path_1.join)((0, node_os_1.homedir)(), '.teamshare', 'sessions');
|
|
11
|
+
/**
|
|
12
|
+
* How many ENDED sessions may be held while the socket is down, and for how
|
|
13
|
+
* long.
|
|
14
|
+
*
|
|
15
|
+
* `sessionEnd` deletes a session only when the socket is connected; offline it
|
|
16
|
+
* keeps it so `registerSocket` can deliver the end. There was no cap and no
|
|
17
|
+
* TTL, so a laptop lid closing for an afternoon retained every session that
|
|
18
|
+
* finished in it - up to `TRANSCRIPT_LIMIT` x `MAX_FRAME_CHARS` (~8 MB) each -
|
|
19
|
+
* and if the agent was then removed from `config.json`, `registerSocket` would
|
|
20
|
+
* never run for that id again, making them unreachable AND unreclaimable. The
|
|
21
|
+
* daemon's RSS climbed until its own heartbeats started missing cadence.
|
|
22
|
+
*/
|
|
23
|
+
const MAX_RETAINED_ENDED = 20;
|
|
24
|
+
const ENDED_TTL_MS = 10 * 60_000;
|
|
11
25
|
function localPath(sessionId) {
|
|
12
26
|
return (0, node_path_1.join)(SESSIONS_DIR, `${sessionId}.json`);
|
|
13
27
|
}
|
|
@@ -149,13 +163,18 @@ class SessionRelay {
|
|
|
149
163
|
}
|
|
150
164
|
session.ended = true;
|
|
151
165
|
session.pendingEndExit = exitCode;
|
|
166
|
+
session.endedAt = Date.now();
|
|
152
167
|
this.agentCurrent.delete(session.agentId);
|
|
153
168
|
const socket = this.sockets.get(session.agentId);
|
|
154
169
|
if (socket?.connected) {
|
|
155
170
|
this.sessions.delete(body.sessionId);
|
|
156
171
|
socket.emit('session:end', { sessionId: body.sessionId, exitCode });
|
|
157
172
|
}
|
|
158
|
-
|
|
173
|
+
else {
|
|
174
|
+
// Offline: keep the ended session so registerSocket can deliver the end,
|
|
175
|
+
// but NEVER without a bound - see MAX_RETAINED_ENDED / ENDED_TTL_MS.
|
|
176
|
+
this.pruneEnded();
|
|
177
|
+
}
|
|
159
178
|
this.persist(session, exitCode);
|
|
160
179
|
return true;
|
|
161
180
|
}
|
|
@@ -167,6 +186,26 @@ class SessionRelay {
|
|
|
167
186
|
return this.sessions.get(sessionId)?.lines ?? [];
|
|
168
187
|
}
|
|
169
188
|
// ── Internals ────────────────────────────────────────────────────────
|
|
189
|
+
/**
|
|
190
|
+
* Drop ended sessions that are too old or beyond the cap, oldest first.
|
|
191
|
+
*
|
|
192
|
+
* Only ever touches sessions whose `ended` is true - a LIVE session is never
|
|
193
|
+
* pruned, however long it runs, because its transcript is what the console is
|
|
194
|
+
* currently rendering.
|
|
195
|
+
*/
|
|
196
|
+
pruneEnded() {
|
|
197
|
+
const now = Date.now();
|
|
198
|
+
const ended = [...this.sessions.values()]
|
|
199
|
+
.filter((s) => s.ended)
|
|
200
|
+
.sort((a, b) => (a.endedAt ?? 0) - (b.endedAt ?? 0));
|
|
201
|
+
for (let index = 0; index < ended.length; index++) {
|
|
202
|
+
const session = ended[index];
|
|
203
|
+
const expired = now - (session.endedAt ?? now) > ENDED_TTL_MS;
|
|
204
|
+
const beyondCap = index >= MAX_RETAINED_ENDED;
|
|
205
|
+
if (expired || beyondCap)
|
|
206
|
+
this.sessions.delete(session.sessionId);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
170
209
|
flushSession(sessionId) {
|
|
171
210
|
const session = this.sessions.get(sessionId);
|
|
172
211
|
if (!session || session.ended)
|
|
@@ -196,9 +235,17 @@ class SessionRelay {
|
|
|
196
235
|
}
|
|
197
236
|
}
|
|
198
237
|
persist(session, exitCode) {
|
|
238
|
+
// ASYNC, and without an indent (2026-10).
|
|
239
|
+
//
|
|
240
|
+
// This ran synchronously on the daemon's main thread inside the probe
|
|
241
|
+
// server's request handler, stringifying up to `TRANSCRIPT_LIMIT` x
|
|
242
|
+
// `MAX_FRAME_CHARS` (~8 MB) with `null, 2` - which roughly doubles the
|
|
243
|
+
// bytes again - then `writeFileSync`ing it. During that stall the
|
|
244
|
+
// 2-minute heartbeat, the 10s outbox drain and the 60s bridge-state push
|
|
245
|
+
// all missed their cadence. It is a diagnostic artifact, so a write lost
|
|
246
|
+
// to process exit is acceptable; a stalled daemon is not.
|
|
199
247
|
try {
|
|
200
|
-
|
|
201
|
-
(0, node_fs_1.writeFileSync)(localPath(session.sessionId), JSON.stringify({
|
|
248
|
+
const payload = JSON.stringify({
|
|
202
249
|
sessionId: session.sessionId,
|
|
203
250
|
agentId: session.agentId,
|
|
204
251
|
projectId: session.projectId ?? null,
|
|
@@ -209,10 +256,14 @@ class SessionRelay {
|
|
|
209
256
|
endedAt: session.ended ? new Date().toISOString() : null,
|
|
210
257
|
exitCode: exitCode ?? null,
|
|
211
258
|
lines: session.lines,
|
|
212
|
-
}
|
|
259
|
+
});
|
|
260
|
+
void node_fs_1.promises
|
|
261
|
+
.mkdir(SESSIONS_DIR, { recursive: true })
|
|
262
|
+
.then(() => node_fs_1.promises.writeFile(localPath(session.sessionId), payload))
|
|
263
|
+
.catch(() => undefined);
|
|
213
264
|
}
|
|
214
265
|
catch {
|
|
215
|
-
/* best-effort */
|
|
266
|
+
/* best-effort - a serialization failure must never break the relay */
|
|
216
267
|
}
|
|
217
268
|
}
|
|
218
269
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-relay.js","sourceRoot":"","sources":["../../src/bridge/session-relay.ts"],"names":[],"mappings":";;;AAaA,
|
|
1
|
+
{"version":3,"file":"session-relay.js","sourceRoot":"","sources":["../../src/bridge/session-relay.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,9 +36,31 @@ export interface UpgradeState {
|
|
|
36
36
|
failures: number;
|
|
37
37
|
lastFailureAt?: number;
|
|
38
38
|
lastError?: string;
|
|
39
|
+
/**
|
|
40
|
+
* Version the recorded failures happened ON. Read with the installed version
|
|
41
|
+
* so history against a tree we no longer run cannot count toward MAX_FAILURES.
|
|
42
|
+
*/
|
|
43
|
+
from?: string;
|
|
39
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Failure history, IGNORED when it was recorded against a different installed
|
|
47
|
+
* version.
|
|
48
|
+
*
|
|
49
|
+
* A failure is a property of a tree, not of the machine: if `npm i -g` left the
|
|
50
|
+
* old version half-written and the daemon came back up on 0.22.6, then a
|
|
51
|
+
* counter written while 0.21.85 was installed says nothing about whether the
|
|
52
|
+
* next attempt against 0.22.6 will work. Counting it anyway let one old EBUSY
|
|
53
|
+
* incident permanently wedge self-updating until a human ran
|
|
54
|
+
* `auto-upgrade on` by hand - the exact "it silently stopped working" symptom.
|
|
55
|
+
*/
|
|
56
|
+
export declare function readUpgradeStateFor(installedVersion: string, path?: string): UpgradeState | null;
|
|
40
57
|
export declare function readUpgradeState(path?: string): UpgradeState | null;
|
|
41
|
-
/**
|
|
42
|
-
|
|
58
|
+
/**
|
|
59
|
+
* Called by the helper after a failed install (before it rolls back).
|
|
60
|
+
*
|
|
61
|
+
* `fromVersion` is stamped so `readUpgradeStateFor` can tell whether the
|
|
62
|
+
* failures still describe the tree we are running.
|
|
63
|
+
*/
|
|
64
|
+
export declare function recordUpgradeFailure(error?: string, fromVersion?: string, path?: string): void;
|
|
43
65
|
/** Called on a successful upgrade and by `auto-upgrade on`. */
|
|
44
66
|
export declare function resetUpgradeState(path?: string): void;
|
|
@@ -6,6 +6,7 @@ exports.readUpgradeMarker = readUpgradeMarker;
|
|
|
6
6
|
exports.clearUpgradeMarker = clearUpgradeMarker;
|
|
7
7
|
exports.upgradeInProgress = upgradeInProgress;
|
|
8
8
|
exports.appendDaemonLog = appendDaemonLog;
|
|
9
|
+
exports.readUpgradeStateFor = readUpgradeStateFor;
|
|
9
10
|
exports.readUpgradeState = readUpgradeState;
|
|
10
11
|
exports.recordUpgradeFailure = recordUpgradeFailure;
|
|
11
12
|
exports.resetUpgradeState = resetUpgradeState;
|
|
@@ -106,6 +107,27 @@ function appendDaemonLog(line) {
|
|
|
106
107
|
/* best-effort */
|
|
107
108
|
}
|
|
108
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* Failure history, IGNORED when it was recorded against a different installed
|
|
112
|
+
* version.
|
|
113
|
+
*
|
|
114
|
+
* A failure is a property of a tree, not of the machine: if `npm i -g` left the
|
|
115
|
+
* old version half-written and the daemon came back up on 0.22.6, then a
|
|
116
|
+
* counter written while 0.21.85 was installed says nothing about whether the
|
|
117
|
+
* next attempt against 0.22.6 will work. Counting it anyway let one old EBUSY
|
|
118
|
+
* incident permanently wedge self-updating until a human ran
|
|
119
|
+
* `auto-upgrade on` by hand - the exact "it silently stopped working" symptom.
|
|
120
|
+
*/
|
|
121
|
+
function readUpgradeStateFor(installedVersion, path = exports.UPGRADE_STATE_PATH) {
|
|
122
|
+
const state = readUpgradeState(path);
|
|
123
|
+
if (!state)
|
|
124
|
+
return null;
|
|
125
|
+
// A legacy record with no `from` predates this field. Keep counting it
|
|
126
|
+
// rather than silently resetting someone's backoff on upgrade.
|
|
127
|
+
if (state.from !== undefined && state.from !== installedVersion)
|
|
128
|
+
return null;
|
|
129
|
+
return state;
|
|
130
|
+
}
|
|
109
131
|
function readUpgradeState(path = exports.UPGRADE_STATE_PATH) {
|
|
110
132
|
try {
|
|
111
133
|
if (!(0, node_fs_1.existsSync)(path))
|
|
@@ -126,13 +148,19 @@ function writeUpgradeState(state, path = exports.UPGRADE_STATE_PATH) {
|
|
|
126
148
|
/* best-effort */
|
|
127
149
|
}
|
|
128
150
|
}
|
|
129
|
-
/**
|
|
130
|
-
|
|
151
|
+
/**
|
|
152
|
+
* Called by the helper after a failed install (before it rolls back).
|
|
153
|
+
*
|
|
154
|
+
* `fromVersion` is stamped so `readUpgradeStateFor` can tell whether the
|
|
155
|
+
* failures still describe the tree we are running.
|
|
156
|
+
*/
|
|
157
|
+
function recordUpgradeFailure(error, fromVersion, path = exports.UPGRADE_STATE_PATH) {
|
|
131
158
|
const prev = readUpgradeState(path);
|
|
132
159
|
writeUpgradeState({
|
|
133
160
|
failures: (prev?.failures ?? 0) + 1,
|
|
134
161
|
lastFailureAt: Date.now(),
|
|
135
162
|
...(error ? { lastError: error.slice(0, 500) } : {}),
|
|
163
|
+
...(fromVersion ? { from: fromVersion } : {}),
|
|
136
164
|
}, path);
|
|
137
165
|
}
|
|
138
166
|
/** Called on a successful upgrade and by `auto-upgrade on`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade-marker.js","sourceRoot":"","sources":["../../src/bridge/upgrade-marker.ts"],"names":[],"mappings":";;;AA8DA,gDAUC;AAED,8CAQC;AAED,gDAMC;AAQD,8CAYC;AAGD,0CAUC;
|
|
1
|
+
{"version":3,"file":"upgrade-marker.js","sourceRoot":"","sources":["../../src/bridge/upgrade-marker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export interface StagingPruneResult {
|
|
2
|
+
removed: string[];
|
|
3
|
+
/** Staging dirs that could not be removed (usually: still locked). */
|
|
4
|
+
kept: string[];
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Abandoned npm staging directories for this package, WITHOUT removing them.
|
|
8
|
+
*
|
|
9
|
+
* `doctor` reports rather than repairs: a diagnostic that silently deletes
|
|
10
|
+
* directories is a diagnostic nobody trusts. The upgrade helper is the only
|
|
11
|
+
* caller of `pruneAbandonedStaging`, and it prints what it removed.
|
|
12
|
+
*/
|
|
13
|
+
export declare function abandonedStagingDirs(liveInstallDir: string, root?: string): string[];
|
|
14
|
+
/**
|
|
15
|
+
* Remove abandoned npm staging directories for this package.
|
|
16
|
+
*
|
|
17
|
+
* Safe by construction: it only ever touches names matching STAGING_DIR_PATTERN
|
|
18
|
+
* inside the npm global `node_modules`, which by definition excludes the live
|
|
19
|
+
* install. A directory it cannot remove (still mapped by a dead-but-not-gone
|
|
20
|
+
* process, or a concurrent npm) is reported rather than forced - `rmSync`
|
|
21
|
+
* failing is information, not an error to swallow.
|
|
22
|
+
*
|
|
23
|
+
* `root` and `liveInstallDir` are parameters so the unit tests can point this
|
|
24
|
+
* at a temp directory instead of the real npm tree.
|
|
25
|
+
*/
|
|
26
|
+
export declare function pruneAbandonedStaging(liveInstallDir: string, root?: string): StagingPruneResult;
|
|
27
|
+
export interface NativeHolder {
|
|
28
|
+
pid: number;
|
|
29
|
+
/** The native modules this process has mapped. */
|
|
30
|
+
modules: string[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Processes referencing this install tree that have native modules mapped.
|
|
34
|
+
*
|
|
35
|
+
* `selfPid` is excluded: the upgrade helper runs FROM the install tree, so it
|
|
36
|
+
* would otherwise always report itself and turn a useful warning into noise.
|
|
37
|
+
*/
|
|
38
|
+
export declare function listNativeModuleHolders(installDir: string, selfPid?: number): NativeHolder[];
|
|
39
|
+
export interface PreflightReport {
|
|
40
|
+
staging: StagingPruneResult;
|
|
41
|
+
holders: NativeHolder[];
|
|
42
|
+
/** One-line human summary for the daemon log / upgrade helper. */
|
|
43
|
+
summary: string[];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Run both checks. Always returns a report - never throws, because a preflight
|
|
47
|
+
* that cannot run must not be the reason an upgrade fails.
|
|
48
|
+
*/
|
|
49
|
+
export declare function preflightUpgrade(installDir: string, selfPid?: number): PreflightReport;
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.abandonedStagingDirs = abandonedStagingDirs;
|
|
4
|
+
exports.pruneAbandonedStaging = pruneAbandonedStaging;
|
|
5
|
+
exports.listNativeModuleHolders = listNativeModuleHolders;
|
|
6
|
+
exports.preflightUpgrade = preflightUpgrade;
|
|
7
|
+
/**
|
|
8
|
+
* Upgrade preflight (2026-10).
|
|
9
|
+
*
|
|
10
|
+
* Two questions the 2026-10-04 incident proved we could not answer, because
|
|
11
|
+
* both surfaced only as an opaque `npm error EBUSY` with no path back to a
|
|
12
|
+
* cause:
|
|
13
|
+
*
|
|
14
|
+
* 1. Is npm's abandoned staging tree still lying around holding a locked
|
|
15
|
+
* native DLL? `npm i -g` stages into `<root>/node_modules/.teamshare-bridge-XXXXXX`
|
|
16
|
+
* and only then copies over the live install. If a previous attempt died
|
|
17
|
+
* mid-copy, that staging dir survives with `skia.win32-x64-msvc.node` still
|
|
18
|
+
* mapped, and every later install trips over it. One such dir was found on
|
|
19
|
+
* this machine, left by the failed attempts and never cleaned up.
|
|
20
|
+
*
|
|
21
|
+
* 2. Which OTHER processes have this install's native modules mapped? The
|
|
22
|
+
* bridge maps four of them (sharp/libvips, @napi-rs/canvas, better-sqlite3,
|
|
23
|
+
* keyring) and a mapped `.node` cannot be overwritten on Windows. The
|
|
24
|
+
* upgrade stops daemons by process enumeration, so it normally clears them
|
|
25
|
+
* - but that safety rests on an ASSUMPTION that nothing else from the
|
|
26
|
+
* install tree maps those DLLs. The supervisor is deliberately never
|
|
27
|
+
* stopped (`daemon-instance.ts`), which is only safe while it loads none.
|
|
28
|
+
* If a future change makes it load pdfkit/sharp, every upgrade would
|
|
29
|
+
* deadlock against itself, and this module is what would say so out loud
|
|
30
|
+
* instead of leaving a bare EBUSY.
|
|
31
|
+
*
|
|
32
|
+
* Dependency-free apart from node builtins and `daemon-instance`, and it never
|
|
33
|
+
* throws: a preflight that cannot answer must not be the thing that breaks an
|
|
34
|
+
* upgrade.
|
|
35
|
+
*/
|
|
36
|
+
const node_child_process_1 = require("node:child_process");
|
|
37
|
+
const node_fs_1 = require("node:fs");
|
|
38
|
+
const node_path_1 = require("node:path");
|
|
39
|
+
const daemon_instance_1 = require("./daemon-instance");
|
|
40
|
+
/**
|
|
41
|
+
* npm's staging directories for this package. Deliberately exact: the live
|
|
42
|
+
* install is `<root>/node_modules/teamshare-bridge`, so a leading dot plus the
|
|
43
|
+
* `-XXXXXX` suffix cannot collide with it.
|
|
44
|
+
*/
|
|
45
|
+
const STAGING_DIR_PATTERN = /^\.teamshare-bridge-[A-Za-z0-9_-]+$/;
|
|
46
|
+
/** Native modules whose Windows handles make a directory un-rewritable. */
|
|
47
|
+
const NATIVE_MODULE_PATTERN = /(skia\.win32|libvips|sharp-win32|better_sqlite3|win32-x64\.node|keyring\.win32)/i;
|
|
48
|
+
/** The npm global `node_modules` directory (parent of the live install). */
|
|
49
|
+
function npmGlobalModulesDir(liveInstallDir) {
|
|
50
|
+
return (0, node_path_1.join)(liveInstallDir, '..');
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Abandoned npm staging directories for this package, WITHOUT removing them.
|
|
54
|
+
*
|
|
55
|
+
* `doctor` reports rather than repairs: a diagnostic that silently deletes
|
|
56
|
+
* directories is a diagnostic nobody trusts. The upgrade helper is the only
|
|
57
|
+
* caller of `pruneAbandonedStaging`, and it prints what it removed.
|
|
58
|
+
*/
|
|
59
|
+
function abandonedStagingDirs(liveInstallDir, root = npmGlobalModulesDir(liveInstallDir)) {
|
|
60
|
+
try {
|
|
61
|
+
if (!(0, node_fs_1.existsSync)(root))
|
|
62
|
+
return [];
|
|
63
|
+
const live = (0, node_path_1.join)(root, 'teamshare-bridge');
|
|
64
|
+
return (0, node_fs_1.readdirSync)(root)
|
|
65
|
+
.filter((entry) => STAGING_DIR_PATTERN.test(entry))
|
|
66
|
+
.map((entry) => (0, node_path_1.join)(root, entry))
|
|
67
|
+
.filter((dir) => dir !== live && (0, node_fs_1.existsSync)(dir));
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Remove abandoned npm staging directories for this package.
|
|
75
|
+
*
|
|
76
|
+
* Safe by construction: it only ever touches names matching STAGING_DIR_PATTERN
|
|
77
|
+
* inside the npm global `node_modules`, which by definition excludes the live
|
|
78
|
+
* install. A directory it cannot remove (still mapped by a dead-but-not-gone
|
|
79
|
+
* process, or a concurrent npm) is reported rather than forced - `rmSync`
|
|
80
|
+
* failing is information, not an error to swallow.
|
|
81
|
+
*
|
|
82
|
+
* `root` and `liveInstallDir` are parameters so the unit tests can point this
|
|
83
|
+
* at a temp directory instead of the real npm tree.
|
|
84
|
+
*/
|
|
85
|
+
function pruneAbandonedStaging(liveInstallDir, root = npmGlobalModulesDir(liveInstallDir)) {
|
|
86
|
+
const result = { removed: [], kept: [] };
|
|
87
|
+
for (const dir of abandonedStagingDirs(liveInstallDir, root)) {
|
|
88
|
+
try {
|
|
89
|
+
(0, node_fs_1.rmSync)(dir, { recursive: true, force: true });
|
|
90
|
+
result.removed.push(dir);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
result.kept.push(dir);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Processes referencing this install tree that have native modules mapped.
|
|
100
|
+
*
|
|
101
|
+
* `selfPid` is excluded: the upgrade helper runs FROM the install tree, so it
|
|
102
|
+
* would otherwise always report itself and turn a useful warning into noise.
|
|
103
|
+
*/
|
|
104
|
+
function listNativeModuleHolders(installDir, selfPid = process.pid) {
|
|
105
|
+
const pids = (0, daemon_instance_1.listBridgeProcessPids)().filter((pid) => pid !== selfPid);
|
|
106
|
+
if (pids.length === 0)
|
|
107
|
+
return [];
|
|
108
|
+
const byPid = new Map(pids.map((pid) => [pid, readMappedNativeModules(pid)]));
|
|
109
|
+
const out = [];
|
|
110
|
+
for (const [pid, modules] of byPid) {
|
|
111
|
+
if (modules.length > 0)
|
|
112
|
+
out.push({ pid, modules });
|
|
113
|
+
}
|
|
114
|
+
return out;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Native modules mapped by one pid, by basename. Returns [] rather than
|
|
118
|
+
* throwing: enumerating another process's modules needs privileges we may not
|
|
119
|
+
* have, and "cannot tell" must never read as "clean".
|
|
120
|
+
*/
|
|
121
|
+
function readMappedNativeModules(pid) {
|
|
122
|
+
if (process.platform !== 'win32')
|
|
123
|
+
return [];
|
|
124
|
+
const res = (0, node_child_process_1.spawnSync)('powershell.exe', [
|
|
125
|
+
'-NoProfile',
|
|
126
|
+
'-NonInteractive',
|
|
127
|
+
'-Command',
|
|
128
|
+
`(Get-Process -Id ${pid} -ErrorAction SilentlyContinue).Modules | ` +
|
|
129
|
+
`ForEach-Object { $_.FileName }`,
|
|
130
|
+
], { stdio: 'pipe', encoding: 'utf8', timeout: 10_000, windowsHide: true });
|
|
131
|
+
const out = res.stdout ?? '';
|
|
132
|
+
if (!out)
|
|
133
|
+
return [];
|
|
134
|
+
const found = new Set();
|
|
135
|
+
for (const line of out.split(/\r?\n/)) {
|
|
136
|
+
const file = line.trim();
|
|
137
|
+
if (!file)
|
|
138
|
+
continue;
|
|
139
|
+
const base = file.split(/[\\/]/).pop() ?? file;
|
|
140
|
+
if (NATIVE_MODULE_PATTERN.test(base))
|
|
141
|
+
found.add(base);
|
|
142
|
+
}
|
|
143
|
+
return [...found].sort();
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Run both checks. Always returns a report - never throws, because a preflight
|
|
147
|
+
* that cannot run must not be the reason an upgrade fails.
|
|
148
|
+
*/
|
|
149
|
+
function preflightUpgrade(installDir, selfPid) {
|
|
150
|
+
const staging = pruneAbandonedStaging(installDir);
|
|
151
|
+
const holders = listNativeModuleHolders(installDir, selfPid);
|
|
152
|
+
const summary = [];
|
|
153
|
+
if (staging.removed.length > 0) {
|
|
154
|
+
summary.push(`removed ${staging.removed.length} abandoned npm staging dir(s) holding locked native modules`);
|
|
155
|
+
}
|
|
156
|
+
if (staging.kept.length > 0) {
|
|
157
|
+
summary.push(`${staging.kept.length} staging dir(s) could not be removed - if the install fails with EBUSY these are the cause`);
|
|
158
|
+
}
|
|
159
|
+
for (const holder of holders) {
|
|
160
|
+
summary.push(`pid ${holder.pid} has native modules mapped (${holder.modules.join(', ')}) - an npm i -g now would fail with EBUSY`);
|
|
161
|
+
}
|
|
162
|
+
return { staging, holders, summary };
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=upgrade-preflight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade-preflight.js","sourceRoot":"","sources":["../../src/bridge/upgrade-preflight.ts"],"names":[],"mappings":"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"}
|
|
@@ -125,7 +125,16 @@ async function cmdBoard(flags) {
|
|
|
125
125
|
}
|
|
126
126
|
finally {
|
|
127
127
|
clearInterval(heartbeatTimer);
|
|
128
|
-
|
|
128
|
+
// Awaited (2026-10): an un-awaited fetch is aborted when the process
|
|
129
|
+
// exits, so a claim this session took could outlive it and leave the
|
|
130
|
+
// task `TASK_CLAIMED_BY` until the hub's lease expired. Failure is now
|
|
131
|
+
// logged - `.catch(() => {})` hid the only case that mattered.
|
|
132
|
+
try {
|
|
133
|
+
await api.releaseSessionClaims(sessionId);
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
console.error(`[claims] releasing this session's task claims failed: ${err instanceof Error ? err.message : String(err)} - a claim may outlive this run (the hub's claim sweeper clears it within ~30 min)`);
|
|
137
|
+
}
|
|
129
138
|
await (0, brief_1.reportStatus)(api, agentId, 'online', undefined, sessionId);
|
|
130
139
|
}
|
|
131
140
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board.js","sourceRoot":"","sources":["../../../src/cli/commands/board.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,
|
|
1
|
+
{"version":3,"file":"board.js","sourceRoot":"","sources":["../../../src/cli/commands/board.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,11 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.cmdBrowse = cmdBrowse;
|
|
4
4
|
const models_1 = require("../../lib/llm/models");
|
|
5
5
|
const config_1 = require("../../lib/config");
|
|
6
|
-
const node_path_1 = require("node:path");
|
|
7
|
-
const node_os_1 = require("node:os");
|
|
8
6
|
const cdp_1 = require("../../lib/browser/cdp");
|
|
9
7
|
const launch_1 = require("../../lib/browser/launch");
|
|
10
8
|
const session_1 = require("../../lib/browser/session");
|
|
9
|
+
const profile_guard_1 = require("../../lib/browser/profile-guard");
|
|
11
10
|
const browse_cdp_1 = require("../../lib/browser/browse-cdp");
|
|
12
11
|
const browse_actions_1 = require("../../lib/browser/browse-actions");
|
|
13
12
|
const browse_safety_1 = require("../../lib/browser/browse-safety");
|
|
@@ -73,7 +72,9 @@ async function cmdBrowse(flags) {
|
|
|
73
72
|
// deliberately SEPARATE from the debug browser (DEBUG_CDP_PORT/DEBUG_PROFILE_DIR)
|
|
74
73
|
// so closing a task's debug browser can never kill a run the human is watching
|
|
75
74
|
// and answering questions in.
|
|
76
|
-
|
|
75
|
+
// `--port` is forwarded from HUB tool params (`research.ts`), so range-check
|
|
76
|
+
// it: NaN/0/a privileged port would either fail silently or mis-target Chrome.
|
|
77
|
+
const port = (0, profile_guard_1.safeCdpPort)(parseInt(flags.get('port') ?? String(session_1.AUTO_ANSWER_CDP_PORT), 10), session_1.AUTO_ANSWER_CDP_PORT);
|
|
77
78
|
const continuous = flags.has('continuous');
|
|
78
79
|
const maxActions = continuous ? Number.MAX_SAFE_INTEGER : parseInt(flags.get('max-actions') ?? '50', 10);
|
|
79
80
|
const intervalMs = parseInt(flags.get('interval') ?? '2000', 10);
|
|
@@ -158,9 +159,12 @@ async function cmdBrowse(flags) {
|
|
|
158
159
|
console.log(`[browse] Reusing the debug Chrome already on port ${port}`);
|
|
159
160
|
}
|
|
160
161
|
else {
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
162
|
+
// `--profile` arrives from HUB tool params. It used to be joined
|
|
163
|
+
// straight onto the profiles root, and `path.join` normalises `..`, so
|
|
164
|
+
// `--profile ../../AppData/.../Chrome/User Data` launched a debugging
|
|
165
|
+
// Chrome on the human's real, logged-in profile. `safeProfileDir` keeps
|
|
166
|
+
// only the final segment, inside ~/.teamshare/chrome-profiles/.
|
|
167
|
+
const userDataDir = (0, profile_guard_1.safeProfileDir)(profileName) ?? session_1.DEFAULT_BROWSER_PROFILE_DIR;
|
|
164
168
|
const instance = await (0, launch_1.launchChrome)({ port, headless, userDataDir });
|
|
165
169
|
console.log(`[browse] Launched Chrome on port ${instance.port} (${headless ? 'headless' : 'visible'}) profile=${userDataDir}`);
|
|
166
170
|
}
|