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.
Files changed (107) hide show
  1. package/dist/bridge/auto-upgrade.d.ts +92 -0
  2. package/dist/bridge/auto-upgrade.js +159 -6
  3. package/dist/bridge/auto-upgrade.js.map +1 -1
  4. package/dist/bridge/daemon-instance.d.ts +17 -0
  5. package/dist/bridge/daemon-instance.js +58 -0
  6. package/dist/bridge/daemon-instance.js.map +1 -1
  7. package/dist/bridge/daemon-support.js +25 -5
  8. package/dist/bridge/daemon-support.js.map +1 -1
  9. package/dist/bridge/daemon.js +254 -83
  10. package/dist/bridge/daemon.js.map +1 -1
  11. package/dist/bridge/doctor.js +42 -5
  12. package/dist/bridge/doctor.js.map +1 -1
  13. package/dist/bridge/index.js +42 -3
  14. package/dist/bridge/index.js.map +1 -1
  15. package/dist/bridge/local-server.d.ts +2 -0
  16. package/dist/bridge/local-server.js +158 -19
  17. package/dist/bridge/local-server.js.map +1 -1
  18. package/dist/bridge/protocol.js +3 -12
  19. package/dist/bridge/protocol.js.map +1 -1
  20. package/dist/bridge/session-relay.d.ts +8 -0
  21. package/dist/bridge/session-relay.js +56 -5
  22. package/dist/bridge/session-relay.js.map +1 -1
  23. package/dist/bridge/upgrade-marker.d.ts +24 -2
  24. package/dist/bridge/upgrade-marker.js +30 -2
  25. package/dist/bridge/upgrade-marker.js.map +1 -1
  26. package/dist/bridge/upgrade-preflight.d.ts +49 -0
  27. package/dist/bridge/upgrade-preflight.js +164 -0
  28. package/dist/bridge/upgrade-preflight.js.map +1 -0
  29. package/dist/cli/commands/board.js +10 -1
  30. package/dist/cli/commands/board.js.map +1 -1
  31. package/dist/cli/commands/browse.js +10 -6
  32. package/dist/cli/commands/browse.js.map +1 -1
  33. package/dist/cli/commands/browser.js +6 -7
  34. package/dist/cli/commands/browser.js.map +1 -1
  35. package/dist/cli/commands/build.js +28 -5
  36. package/dist/cli/commands/build.js.map +1 -1
  37. package/dist/cli/commands/chat.js +10 -1
  38. package/dist/cli/commands/chat.js.map +1 -1
  39. package/dist/cli/commands/cleanup.js +1 -11
  40. package/dist/cli/commands/cleanup.js.map +1 -1
  41. package/dist/cli/commands/connect.js +2 -8
  42. package/dist/cli/commands/connect.js.map +1 -1
  43. package/dist/cli/commands/disconnect.js +4 -10
  44. package/dist/cli/commands/disconnect.js.map +1 -1
  45. package/dist/cli/commands/doc.js +10 -1
  46. package/dist/cli/commands/doc.js.map +1 -1
  47. package/dist/cli/commands/planner.js +10 -1
  48. package/dist/cli/commands/planner.js.map +1 -1
  49. package/dist/cli/commands/research.js +21 -4
  50. package/dist/cli/commands/research.js.map +1 -1
  51. package/dist/cli/commands/run.js +10 -1
  52. package/dist/cli/commands/run.js.map +1 -1
  53. package/dist/lib/brief.js +18 -1
  54. package/dist/lib/brief.js.map +1 -1
  55. package/dist/lib/browser/browse-stealth.js +37 -6
  56. package/dist/lib/browser/browse-stealth.js.map +1 -1
  57. package/dist/lib/browser/profile-guard.d.ts +23 -0
  58. package/dist/lib/browser/profile-guard.js +72 -0
  59. package/dist/lib/browser/profile-guard.js.map +1 -0
  60. package/dist/lib/chat/daemon-reporter.js +8 -1
  61. package/dist/lib/chat/daemon-reporter.js.map +1 -1
  62. package/dist/lib/git/git-discovery.d.ts +23 -4
  63. package/dist/lib/git/git-discovery.js +67 -19
  64. package/dist/lib/git/git-discovery.js.map +1 -1
  65. package/dist/lib/git/git-finalize.js +53 -1
  66. package/dist/lib/git/git-finalize.js.map +1 -1
  67. package/dist/lib/git/index-recovery.js +91 -1
  68. package/dist/lib/git/index-recovery.js.map +1 -1
  69. package/dist/lib/harness/agy-pty.d.ts +1 -1
  70. package/dist/lib/harness/agy-pty.js +20 -4
  71. package/dist/lib/harness/agy-pty.js.map +1 -1
  72. package/dist/lib/harness/spawn.js +98 -24
  73. package/dist/lib/harness/spawn.js.map +1 -1
  74. package/dist/lib/lock.d.ts +6 -0
  75. package/dist/lib/lock.js +108 -15
  76. package/dist/lib/lock.js.map +1 -1
  77. package/dist/lib/orchestrator/handlers/browser.js +9 -8
  78. package/dist/lib/orchestrator/handlers/browser.js.map +1 -1
  79. package/dist/lib/orchestrator/handlers/git.js +88 -6
  80. package/dist/lib/orchestrator/handlers/git.js.map +1 -1
  81. package/dist/lib/orchestrator/worktree.d.ts +10 -0
  82. package/dist/lib/orchestrator/worktree.js +243 -101
  83. package/dist/lib/orchestrator/worktree.js.map +1 -1
  84. package/dist/lib/tail-file.d.ts +4 -0
  85. package/dist/lib/tail-file.js +73 -0
  86. package/dist/lib/tail-file.js.map +1 -0
  87. package/dist/lib/tools/browser-tool.js +13 -2
  88. package/dist/lib/tools/browser-tool.js.map +1 -1
  89. package/dist/lib/wake-claim.d.ts +4 -3
  90. package/dist/lib/wake-claim.js +81 -20
  91. package/dist/lib/wake-claim.js.map +1 -1
  92. package/dist/lib/workspace/bus.d.ts +32 -0
  93. package/dist/lib/workspace/bus.js +48 -1
  94. package/dist/lib/workspace/bus.js.map +1 -1
  95. package/dist/lib/workspace/mirror-lease.js +30 -1
  96. package/dist/lib/workspace/mirror-lease.js.map +1 -1
  97. package/dist/lib/workspace/mirror.js +22 -1
  98. package/dist/lib/workspace/mirror.js.map +1 -1
  99. package/dist/lib/workspace/presence.js +38 -14
  100. package/dist/lib/workspace/presence.js.map +1 -1
  101. package/dist/lib/workspace/repo-lock.d.ts +21 -1
  102. package/dist/lib/workspace/repo-lock.js +146 -21
  103. package/dist/lib/workspace/repo-lock.js.map +1 -1
  104. package/dist/lib/workspace/stop-save.js +10 -0
  105. package/dist/lib/workspace/stop-save.js.map +1 -1
  106. package/package.json +1 -1
  107. 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
- // Offline: keep the ended session so registerSocket can deliver the end.
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
- (0, node_fs_1.mkdirSync)(SESSIONS_DIR, { recursive: true });
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
- }, null, 2));
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":"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"}
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
- /** Called by the helper after a failed install (before it rolls back). */
42
- export declare function recordUpgradeFailure(error?: string, path?: string): void;
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
- /** Called by the helper after a failed install (before it rolls back). */
130
- function recordUpgradeFailure(error, path = exports.UPGRADE_STATE_PATH) {
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":"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"}
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;AAwBD,kDAUC;AAED,4CAQC;AAiBD,oDAeC;AAGD,8CAMC;AAhND;;;;;;;;;;;;GAYG;AACH,qCAOiB;AACjB,qCAAkC;AAClC,yCAA0C;AAE7B,QAAA,mBAAmB,GAAG,IAAA,gBAAI,EAAC,IAAA,iBAAO,GAAE,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC;AACjF;;;;GAIG;AACU,QAAA,kBAAkB,GAAG,IAAA,gBAAI,EAAC,IAAA,iBAAO,GAAE,EAAE,YAAY,EAAE,oBAAoB,CAAC,CAAC;AACtF,uEAAuE;AAC1D,QAAA,gBAAgB,GAAG,IAAA,gBAAI,EAAC,IAAA,iBAAO,GAAE,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;AAC7E,0EAA0E;AAC7D,QAAA,eAAe,GAAG,IAAA,gBAAI,EAAC,IAAA,iBAAO,GAAE,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;AAE3E,uEAAuE;AACvE,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAChC,yEAAyE;AACzE,MAAM,UAAU,GAAG,CAAC,GAAG,MAAM,CAAC;AAc9B,SAAS,QAAQ,CAAC,GAAW;IAC3B,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAgB,kBAAkB,CAChC,MAAqB,EACrB,IAAI,GAAG,2BAAmB;IAE1B,IAAI,CAAC;QACH,IAAA,mBAAS,EAAC,IAAA,mBAAO,EAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,IAAA,uBAAa,EAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;IACvE,CAAC;AACH,CAAC;AAED,SAAgB,iBAAiB,CAAC,IAAI,GAAG,2BAAmB;IAC1D,IAAI,CAAC;QACH,IAAI,CAAC,IAAA,oBAAU,EAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,IAAI,EAAE,MAAM,CAAC,CAAkB,CAAC;QACvE,OAAO,MAAM,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,kBAAkB,CAAC,IAAI,GAAG,2BAAmB;IAC3D,IAAI,CAAC;QACH,IAAA,gBAAM,EAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,iBAAiB,CAC/B,IAAI,GAAG,2BAAmB,EAC1B,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAEhB,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9C,MAAM,GAAG,GAAG,GAAG,GAAG,SAAS,CAAC;IAC5B,IAAI,GAAG,GAAG,UAAU;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAChE,OAAO,GAAG,GAAG,gBAAgB,CAAC;AAChC,CAAC;AAED,0EAA0E;AAC1E,SAAgB,eAAe,CAAC,IAAY;IAC1C,IAAI,CAAC;QACH,IAAA,wBAAc,EACZ,uBAAe,EACf,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,IAAI,IAAI,EACzC,MAAM,CACP,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;AACH,CAAC;AAaD;;;;;;;;;;GAUG;AACH,SAAgB,mBAAmB,CACjC,gBAAwB,EACxB,IAAI,GAAG,0BAAkB;IAEzB,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,uEAAuE;IACvE,+DAA+D;IAC/D,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB;QAAE,OAAO,IAAI,CAAC;IAC7E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,gBAAgB,CAAC,IAAI,GAAG,0BAAkB;IACxD,IAAI,CAAC;QACH,IAAI,CAAC,IAAA,oBAAU,EAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,IAAI,EAAE,MAAM,CAAC,CAAiB,CAAC;QACtE,OAAO,MAAM,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAmB,EAAE,IAAI,GAAG,0BAAkB;IACvE,IAAI,CAAC;QACH,IAAA,mBAAS,EAAC,IAAA,mBAAO,EAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,IAAA,uBAAa,EAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,oBAAoB,CAClC,KAAc,EACd,WAAoB,EACpB,IAAI,GAAG,0BAAkB;IAEzB,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACpC,iBAAiB,CACf;QACE,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC;QACnC,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE;QACzB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C,EACD,IAAI,CACL,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,SAAgB,iBAAiB,CAAC,IAAI,GAAG,0BAAkB;IACzD,IAAI,CAAC;QACH,IAAA,gBAAM,EAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;AACH,CAAC"}
@@ -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
- void api.releaseSessionClaims(sessionId).catch(() => { });
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":"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"}
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
- const port = parseInt(flags.get('port') ?? String(session_1.AUTO_ANSWER_CDP_PORT), 10);
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
- const userDataDir = profileName
162
- ? (0, node_path_1.join)((0, node_os_1.homedir)(), '.teamshare', 'chrome-profiles', profileName)
163
- : session_1.DEFAULT_BROWSER_PROFILE_DIR;
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
  }