botmux 3.9.1 → 3.9.2
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/.runtime-build-id +1 -1
- package/dist/adapters/cli/traex.d.ts.map +1 -1
- package/dist/adapters/cli/traex.js +87 -87
- package/dist/adapters/cli/traex.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +94 -16
- package/dist/cli.js.map +1 -1
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +40 -1
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/passthrough-commands.d.ts.map +1 -1
- package/dist/core/passthrough-commands.js +1 -1
- package/dist/core/passthrough-commands.js.map +1 -1
- package/dist/daemon.d.ts +11 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +32 -3
- package/dist/daemon.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +1 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +1 -0
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +9 -0
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/issue-card.d.ts +223 -0
- package/dist/im/lark/issue-card.d.ts.map +1 -0
- package/dist/im/lark/issue-card.js +542 -0
- package/dist/im/lark/issue-card.js.map +1 -0
- package/dist/im/lark/issue-command-deps.d.ts +41 -0
- package/dist/im/lark/issue-command-deps.d.ts.map +1 -0
- package/dist/im/lark/issue-command-deps.js +195 -0
- package/dist/im/lark/issue-command-deps.js.map +1 -0
- package/dist/im/lark/issue-command.d.ts +137 -0
- package/dist/im/lark/issue-command.d.ts.map +1 -0
- package/dist/im/lark/issue-command.js +335 -0
- package/dist/im/lark/issue-command.js.map +1 -0
- package/dist/platform/issue-client.d.ts +201 -0
- package/dist/platform/issue-client.d.ts.map +1 -0
- package/dist/platform/issue-client.js +142 -0
- package/dist/platform/issue-client.js.map +1 -0
- package/dist/platform/platform-http.d.ts +4 -0
- package/dist/platform/platform-http.d.ts.map +1 -1
- package/dist/platform/platform-http.js +38 -2
- package/dist/platform/platform-http.js.map +1 -1
- package/dist/services/issue-board-store.d.ts +214 -0
- package/dist/services/issue-board-store.d.ts.map +1 -0
- package/dist/services/issue-board-store.js +472 -0
- package/dist/services/issue-board-store.js.map +1 -0
- package/dist/services/issue-claim-flow.d.ts +160 -0
- package/dist/services/issue-claim-flow.d.ts.map +1 -0
- package/dist/services/issue-claim-flow.js +222 -0
- package/dist/services/issue-claim-flow.js.map +1 -0
- package/dist/services/issue-outbox-pump.d.ts +25 -0
- package/dist/services/issue-outbox-pump.d.ts.map +1 -0
- package/dist/services/issue-outbox-pump.js +102 -0
- package/dist/services/issue-outbox-pump.js.map +1 -0
- package/dist/services/issue-release.d.ts +78 -0
- package/dist/services/issue-release.d.ts.map +1 -0
- package/dist/services/issue-release.js +89 -0
- package/dist/services/issue-release.js.map +1 -0
- package/dist/services/issue-report.d.ts +72 -0
- package/dist/services/issue-report.d.ts.map +1 -0
- package/dist/services/issue-report.js +84 -0
- package/dist/services/issue-report.js.map +1 -0
- package/dist/services/issue-status-view.d.ts +52 -0
- package/dist/services/issue-status-view.d.ts.map +1 -0
- package/dist/services/issue-status-view.js +42 -0
- package/dist/services/issue-status-view.js.map +1 -0
- package/dist/services/issue-status-writer.d.ts +98 -0
- package/dist/services/issue-status-writer.d.ts.map +1 -0
- package/dist/services/issue-status-writer.js +123 -0
- package/dist/services/issue-status-writer.js.map +1 -0
- package/dist/services/traex-paths.d.ts +14 -2
- package/dist/services/traex-paths.d.ts.map +1 -1
- package/dist/services/traex-paths.js +16 -2
- package/dist/services/traex-paths.js.map +1 -1
- package/dist/services/traex-transcript.d.ts +33 -0
- package/dist/services/traex-transcript.d.ts.map +1 -1
- package/dist/services/traex-transcript.js +135 -28
- package/dist/services/traex-transcript.js.map +1 -1
- package/dist/setup/lark-scopes.json +0 -2
- package/dist/worker.js +143 -17
- package/dist/worker.js.map +1 -1
- package/package.json +1 -1
|
@@ -155,6 +155,76 @@ export function traexRolloutHasUserInputSince(path, fromOffset, expectedText) {
|
|
|
155
155
|
const expected = normaliseInputText(expectedText);
|
|
156
156
|
return drainTraexRollout(path, fromOffset).events.some(event => event.kind === 'user' && normaliseInputText(event.text) === expected);
|
|
157
157
|
}
|
|
158
|
+
function readTraexHistorySid(parsed) {
|
|
159
|
+
return parsed && typeof parsed === 'object' && typeof parsed.session_id === 'string'
|
|
160
|
+
? parsed.session_id
|
|
161
|
+
: undefined;
|
|
162
|
+
}
|
|
163
|
+
/** Scan the byte delta appended to history.jsonl since `fromByte` for a line
|
|
164
|
+
* whose decoded `text` exactly matches `expectedText` (newline-normalised).
|
|
165
|
+
* Never parses a non-newline-terminated tail, so a half-written line can't
|
|
166
|
+
* manufacture a false match — a later poll sees the completed entry. */
|
|
167
|
+
export function traexHistoryMatchDelta(path, fromByte, expectedText, acceptSid) {
|
|
168
|
+
if (!existsSync(path))
|
|
169
|
+
return { found: false };
|
|
170
|
+
let size;
|
|
171
|
+
try {
|
|
172
|
+
size = statSync(path).size;
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return { found: false };
|
|
176
|
+
}
|
|
177
|
+
if (size <= fromByte)
|
|
178
|
+
return { found: false };
|
|
179
|
+
const len = size - fromByte;
|
|
180
|
+
const buf = Buffer.alloc(len);
|
|
181
|
+
const fd = openSync(path, 'r');
|
|
182
|
+
try {
|
|
183
|
+
readSync(fd, buf, 0, len, fromByte);
|
|
184
|
+
}
|
|
185
|
+
finally {
|
|
186
|
+
closeSync(fd);
|
|
187
|
+
}
|
|
188
|
+
const delta = buf.toString('utf8');
|
|
189
|
+
// Drop a trailing partial line (no newline yet) — it may still be mid-write.
|
|
190
|
+
const lines = delta.endsWith('\n') ? delta.split('\n') : delta.split('\n').slice(0, -1);
|
|
191
|
+
const expected = normaliseInputText(expectedText);
|
|
192
|
+
for (const line of lines) {
|
|
193
|
+
if (line.length === 0)
|
|
194
|
+
continue;
|
|
195
|
+
let parsed;
|
|
196
|
+
try {
|
|
197
|
+
parsed = JSON.parse(line);
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
if (typeof parsed?.text !== 'string')
|
|
203
|
+
continue;
|
|
204
|
+
if (normaliseInputText(parsed.text) !== expected)
|
|
205
|
+
continue;
|
|
206
|
+
const cliSessionId = readTraexHistorySid(parsed);
|
|
207
|
+
// Skip a same-text line owned by a DIFFERENT pane (shared-TRAE_HOME
|
|
208
|
+
// collision). Keep scanning — the owned line may be later in this delta
|
|
209
|
+
// or arrive on a later poll.
|
|
210
|
+
if (acceptSid && !acceptSid(cliSessionId))
|
|
211
|
+
continue;
|
|
212
|
+
return { found: true, cliSessionId };
|
|
213
|
+
}
|
|
214
|
+
return { found: false };
|
|
215
|
+
}
|
|
216
|
+
/** Current byte size of history.jsonl (0 when absent), captured before a paste
|
|
217
|
+
* so the confirmation scan only considers lines this submit appends. */
|
|
218
|
+
export function traexHistorySize(path) {
|
|
219
|
+
if (!path || !existsSync(path))
|
|
220
|
+
return 0;
|
|
221
|
+
try {
|
|
222
|
+
return statSync(path).size;
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
return 0;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
158
228
|
function matchTraexRolloutPath(target) {
|
|
159
229
|
if (!target.endsWith('.jsonl'))
|
|
160
230
|
return undefined;
|
|
@@ -172,57 +242,94 @@ function matchTraexRolloutPath(target) {
|
|
|
172
242
|
return undefined;
|
|
173
243
|
return { path: target, cliSessionId: sid };
|
|
174
244
|
}
|
|
175
|
-
/**
|
|
176
|
-
*
|
|
177
|
-
*
|
|
178
|
-
|
|
245
|
+
/** Enumerate the file paths a pid holds open (Linux /proc, else lsof). Shared
|
|
246
|
+
* by findTraexRolloutByPid (single) and findTraexRolloutSetByPid (ownership
|
|
247
|
+
* set) so both derive from one source. Returns undefined when enumeration is
|
|
248
|
+
* unavailable — callers treat that as "cannot prove ownership". */
|
|
249
|
+
function traexProcessOpenTargets(pid) {
|
|
179
250
|
if (!Number.isInteger(pid) || pid <= 0)
|
|
180
251
|
return undefined;
|
|
181
252
|
if (IS_LINUX) {
|
|
182
253
|
const fdDir = `/proc/${pid}/fd`;
|
|
183
|
-
if (existsSync(fdDir))
|
|
184
|
-
|
|
254
|
+
if (!existsSync(fdDir))
|
|
255
|
+
return undefined;
|
|
256
|
+
let entries;
|
|
257
|
+
try {
|
|
258
|
+
entries = readdirSync(fdDir);
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
return undefined;
|
|
262
|
+
}
|
|
263
|
+
const targets = [];
|
|
264
|
+
for (const fd of entries) {
|
|
185
265
|
try {
|
|
186
|
-
|
|
266
|
+
targets.push(readlinkSync(join(fdDir, fd)));
|
|
187
267
|
}
|
|
188
268
|
catch {
|
|
189
|
-
|
|
190
|
-
}
|
|
191
|
-
for (const fd of entries) {
|
|
192
|
-
let target;
|
|
193
|
-
try {
|
|
194
|
-
target = readlinkSync(join(fdDir, fd));
|
|
195
|
-
}
|
|
196
|
-
catch {
|
|
197
|
-
continue;
|
|
198
|
-
}
|
|
199
|
-
const hit = matchTraexRolloutPath(target);
|
|
200
|
-
if (hit)
|
|
201
|
-
return hit;
|
|
269
|
+
continue;
|
|
202
270
|
}
|
|
203
|
-
return undefined;
|
|
204
271
|
}
|
|
272
|
+
return targets;
|
|
205
273
|
}
|
|
206
274
|
let out;
|
|
207
275
|
try {
|
|
208
|
-
out = execSync(`lsof -p ${pid} -Fn`, {
|
|
209
|
-
encoding: 'utf-8',
|
|
210
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
211
|
-
});
|
|
276
|
+
out = execSync(`lsof -p ${pid} -Fn`, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
|
|
212
277
|
}
|
|
213
278
|
catch {
|
|
214
279
|
return undefined;
|
|
215
280
|
}
|
|
281
|
+
const targets = [];
|
|
216
282
|
for (const line of out.split('\n')) {
|
|
217
|
-
if (
|
|
218
|
-
|
|
219
|
-
|
|
283
|
+
if (line.startsWith('n/'))
|
|
284
|
+
targets.push(line.slice(1));
|
|
285
|
+
}
|
|
286
|
+
return targets;
|
|
287
|
+
}
|
|
288
|
+
/** Find the rollout file an externally-running TRAE process has open.
|
|
289
|
+
* Same /proc/<pid>/fd strategy as findCodexRolloutByPid, but with a
|
|
290
|
+
* TRAE-specific path matcher so we never bind to a sibling Codex pane. */
|
|
291
|
+
export function findTraexRolloutByPid(pid) {
|
|
292
|
+
const targets = traexProcessOpenTargets(pid);
|
|
293
|
+
if (!targets)
|
|
294
|
+
return undefined;
|
|
295
|
+
for (const target of targets) {
|
|
220
296
|
const hit = matchTraexRolloutPath(target);
|
|
221
297
|
if (hit)
|
|
222
298
|
return hit;
|
|
223
299
|
}
|
|
224
300
|
return undefined;
|
|
225
301
|
}
|
|
302
|
+
/** Lowercased set of TRAE session ids whose rollout the pid holds open. The
|
|
303
|
+
* ownership gate for a shared-history.jsonl submit match: only a sid this pid
|
|
304
|
+
* actually owns is safe to accept, so a concurrent sibling pane's identical
|
|
305
|
+
* text can't hand back a foreign session id. Empty Set = pid holds no TRAE
|
|
306
|
+
* rollout; undefined = fd enumeration unavailable (callers must treat undefined
|
|
307
|
+
* as "cannot prove ownership" — fail closed, do not bind). Mirrors
|
|
308
|
+
* findCodexRolloutSetByPid. */
|
|
309
|
+
export function findTraexRolloutSetByPid(pid) {
|
|
310
|
+
const targets = traexProcessOpenTargets(pid);
|
|
311
|
+
if (!targets)
|
|
312
|
+
return undefined;
|
|
313
|
+
const set = new Set();
|
|
314
|
+
for (const target of targets) {
|
|
315
|
+
const hit = matchTraexRolloutPath(target);
|
|
316
|
+
if (hit)
|
|
317
|
+
set.add(hit.cliSessionId.toLowerCase());
|
|
318
|
+
}
|
|
319
|
+
return set;
|
|
320
|
+
}
|
|
321
|
+
/** Pure ownership decision: is `cliSessionId` one of the rollouts the observed
|
|
322
|
+
* pid holds open? `ownedRollouts` is the lowercased sid set from
|
|
323
|
+
* findTraexRolloutSetByPid (undefined when fd enumeration was unavailable).
|
|
324
|
+
* FAIL CLOSED — a missing set or a non-member id returns false so the caller
|
|
325
|
+
* never binds the bridge (or persists a resume id) it can't prove the pid owns.
|
|
326
|
+
* Extracted so the exact predicate the worker's persist/attach gates use is
|
|
327
|
+
* unit-testable without a live pid. Mirrors codexHistorySidIsOwned. */
|
|
328
|
+
export function traexHistorySidIsOwned(cliSessionId, ownedRollouts) {
|
|
329
|
+
if (!ownedRollouts)
|
|
330
|
+
return false;
|
|
331
|
+
return ownedRollouts.has(cliSessionId.toLowerCase());
|
|
332
|
+
}
|
|
226
333
|
/** Locate the rollout file for a given TRAE session UUID. Filename shape is
|
|
227
334
|
* identical to Codex: `rollout-<ts>-<sid>.jsonl`, so a suffix match over the
|
|
228
335
|
* TRAE sessions tree is unambiguous. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traex-transcript.js","sourceRoot":"","sources":["../../src/services/traex-transcript.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"traex-transcript.js","sourceRoot":"","sources":["../../src/services/traex-transcript.ts"],"names":[],"mappings":"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"}
|
package/dist/worker.js
CHANGED
|
@@ -59,7 +59,7 @@ import { generateCodexAppThreadTitle, readCodexAppThreadMetadata, setCodexAppThr
|
|
|
59
59
|
import { buildBotmuxLarkNativeSessionTitle } from './core/session-title.js';
|
|
60
60
|
import { drainCodexRollout, findCodexRolloutBySessionId, findCodexRolloutByPid, findCodexRolloutSetByPid, codexHistorySidIsOwned, splitCodexEventsByCutoff, extractLastCodexTurn, codexSessionIdFromRolloutPath, scanCodexThreadSettings } from './services/codex-transcript.js';
|
|
61
61
|
import { CodexServiceTierTracker, resolveCodexServiceTierSnapshot } from './services/codex-service-tier.js';
|
|
62
|
-
import { drainTraexRollout, findTraexRolloutBySessionId, findTraexRolloutByPid } from './services/traex-transcript.js';
|
|
62
|
+
import { drainTraexRollout, findTraexRolloutBySessionId, findTraexRolloutByPid, findTraexRolloutSetByPid, traexHistorySidIsOwned } from './services/traex-transcript.js';
|
|
63
63
|
import { parseTraexUserInputQuestions } from './services/traex-user-input.js';
|
|
64
64
|
import { cocoEventsPathForSession, drainCocoEvents, findCocoSessionByPid } from './services/coco-transcript.js';
|
|
65
65
|
import { currentHermesStateOffset, drainHermesStateDb, resolveHermesStateDbPath } from './services/hermes-transcript.js';
|
|
@@ -1027,6 +1027,11 @@ let lastSpawnEffectiveCliSessionId;
|
|
|
1027
1027
|
let lastSpawnDeferInitialPrompt = false;
|
|
1028
1028
|
let lastSpawnQueuedInitialPrompt;
|
|
1029
1029
|
let lastSpawnQueuedInitialPromptLogicalContent;
|
|
1030
|
+
// True when this session runs under an outer bwrap supervisor (file sandbox OR
|
|
1031
|
+
// Linux credential-only bwrap) — both make getChildPid() the supervisor, not the
|
|
1032
|
+
// CLI leaf. credentialOnlyBwrap needs host probes so it can't be recomputed from
|
|
1033
|
+
// cfg at gate-check time; capture the spawn-time verdict for currentTraexObservedPid.
|
|
1034
|
+
let lastSpawnOuterBwrapActive = false;
|
|
1030
1035
|
/**
|
|
1031
1036
|
* True only when {@link shouldArmSpawnArgvInitialPromptBusy} says so: argv-
|
|
1032
1037
|
* baked first prompt + SessionStart ready (Grok-class). First markPromptReady
|
|
@@ -3515,18 +3520,21 @@ function codexBridgeStartTimer() {
|
|
|
3515
3520
|
cwd: lastInitConfig?.workingDir,
|
|
3516
3521
|
pid: codexAdoptPendingPid,
|
|
3517
3522
|
});
|
|
3518
|
-
// Codex defense-in-depth: resolveFileBridgePath resolves
|
|
3519
|
-
// so a pending sid that is actually a shared-
|
|
3520
|
-
//
|
|
3521
|
-
//
|
|
3522
|
-
//
|
|
3523
|
-
//
|
|
3524
|
-
//
|
|
3525
|
-
|
|
3526
|
-
|
|
3527
|
-
|
|
3528
|
-
|
|
3529
|
-
})()
|
|
3523
|
+
// Codex/TRAE defense-in-depth: resolveFileBridgePath resolves
|
|
3524
|
+
// sessionId-first, so a pending sid that is actually a shared-home
|
|
3525
|
+
// sibling's (CODEX_HOME / TRAE_HOME) would resolve to that foreign
|
|
3526
|
+
// rollout. Only attach when the resolved rollout's sid is one the
|
|
3527
|
+
// observed pid actually holds open. This poller re-runs every 1s, so a
|
|
3528
|
+
// lazily-opened owned fd is picked up on a later tick. Skip the gate
|
|
3529
|
+
// only when we have no pid to prove ownership with (keeps the sid/pid
|
|
3530
|
+
// resolution working for non-adopt / pid-less flows).
|
|
3531
|
+
const codexAttachGated = structuredBridgeIsCodex() && lastInitConfig?.adoptMode && path && currentCodexObservedPid();
|
|
3532
|
+
const traexAttachGated = structuredBridgeIsTraex() && lastInitConfig?.adoptMode && path && currentTraexObservedPid();
|
|
3533
|
+
const attachOk = codexAttachGated
|
|
3534
|
+
? (() => { const sid = codexSessionIdFromRolloutPath(path); return !!sid && codexHistorySidOwnedByCurrentPid(sid); })()
|
|
3535
|
+
: traexAttachGated
|
|
3536
|
+
? (() => { const sid = codexSessionIdFromRolloutPath(path); return !!sid && traexHistorySidOwnedByCurrentPid(sid); })()
|
|
3537
|
+
: true;
|
|
3530
3538
|
if (path && attachOk) {
|
|
3531
3539
|
if (codexAdoptPendingPid && (lastInitConfig?.cliId === 'codex' || lastInitConfig?.cliId === 'traex')) {
|
|
3532
3540
|
const discoveredSessionId = codexSessionIdFromRolloutPath(path);
|
|
@@ -3804,6 +3812,54 @@ function codexHistorySidOwnedByCurrentPid(cliSessionId) {
|
|
|
3804
3812
|
}
|
|
3805
3813
|
return owned;
|
|
3806
3814
|
}
|
|
3815
|
+
/** Resolve the pid that actually holds a TRAE rollout open, given a candidate
|
|
3816
|
+
* that may be a bwrap supervisor. Under the file sandbox, botmux launches
|
|
3817
|
+
* `bwrap --unshare-pid -- traex`, so the tmux pane leaf / getChildPid() is the
|
|
3818
|
+
* bwrap process — its /proc/<pid>/fd holds no rollout, and the ownership gate
|
|
3819
|
+
* would always fail. The real traex leaf is host-visible across the pid ns
|
|
3820
|
+
* (ps -A ppid links), so a comm-based BFS descends to it. Outside the sandbox
|
|
3821
|
+
* (or if traex hasn't been forked yet) the candidate already is the leaf, so
|
|
3822
|
+
* we return it unchanged — fail closed to the launcher pid rather than guess. */
|
|
3823
|
+
function resolveTraexOwnershipPid(candidatePid, sandbox) {
|
|
3824
|
+
if (!sandbox || !candidatePid)
|
|
3825
|
+
return candidatePid;
|
|
3826
|
+
return findLaunchedCliPid(candidatePid, 'traex') ?? candidatePid;
|
|
3827
|
+
}
|
|
3828
|
+
/** TRAE counterpart of currentCodexObservedPid: the pid of the TRAE process
|
|
3829
|
+
* this worker observes (spawned child or adopted pane). Same resolution order
|
|
3830
|
+
* — the wired backend.cliPid first, then the live pane child pid, then the
|
|
3831
|
+
* adopt-pending pid (which is populated for TRAE too, see the codex/traex
|
|
3832
|
+
* branch around line 3674). backend.cliPid is already sandbox-resolved at wire
|
|
3833
|
+
* time; the getChildPid() fallback is not, so descend it here too (no-op
|
|
3834
|
+
* outside the sandbox / when already a leaf). */
|
|
3835
|
+
function currentTraexObservedPid() {
|
|
3836
|
+
const wired = backend?.cliPid;
|
|
3837
|
+
if (wired)
|
|
3838
|
+
return wired;
|
|
3839
|
+
const child = backend?.getChildPid?.();
|
|
3840
|
+
if (child)
|
|
3841
|
+
return resolveTraexOwnershipPid(child, lastSpawnOuterBwrapActive);
|
|
3842
|
+
return codexAdoptPendingPid;
|
|
3843
|
+
}
|
|
3844
|
+
/** Ownership gate for binding a TRAE session id that came from the GLOBAL
|
|
3845
|
+
* history.jsonl (shared by every TRAE pane under one TRAE_HOME). A concurrent
|
|
3846
|
+
* sibling pane submitting identical text — e.g. a bare "继续" in adopt mode,
|
|
3847
|
+
* which carries no unique <session_id> — can make writeInput's history match
|
|
3848
|
+
* surface a FOREIGN session id. Before persisting it (resume target) or
|
|
3849
|
+
* (re-)attaching the transcript bridge, require the id to be one THIS pid
|
|
3850
|
+
* actually holds open. FAIL CLOSED: unavailable fd enumeration (undefined set)
|
|
3851
|
+
* or a non-member id → false, so the caller keeps its current binding. Mirrors
|
|
3852
|
+
* codexHistorySidOwnedByCurrentPid; the pure decision lives in
|
|
3853
|
+
* traexHistorySidIsOwned for unit testing without a live pid. */
|
|
3854
|
+
function traexHistorySidOwnedByCurrentPid(cliSessionId) {
|
|
3855
|
+
const pid = currentTraexObservedPid();
|
|
3856
|
+
const ownedRollouts = pid ? findTraexRolloutSetByPid(pid) : undefined;
|
|
3857
|
+
const owned = traexHistorySidIsOwned(cliSessionId, ownedRollouts);
|
|
3858
|
+
if (!owned) {
|
|
3859
|
+
log(`TRAE session id ${cliSessionId} not owned by pid ${pid ?? '?'} (open rollouts: ${ownedRollouts ? [...ownedRollouts].join(',') || 'none' : 'unknown'})`);
|
|
3860
|
+
}
|
|
3861
|
+
return owned;
|
|
3862
|
+
}
|
|
3807
3863
|
/** Called from flushPending after writeInput first returns a cliSessionId.
|
|
3808
3864
|
* Tries to locate the rollout file immediately; if it's not on disk yet,
|
|
3809
3865
|
* remembers the sid so the 1s poller can keep retrying. */
|
|
@@ -3863,6 +3919,15 @@ function codexBridgeNotifyCliSessionId(cliSessionId) {
|
|
|
3863
3919
|
const currentSid = codexSessionIdFromRolloutPath(codexBridgeRolloutPath);
|
|
3864
3920
|
if (currentSid && currentSid.toLowerCase() === cliSessionId.toLowerCase())
|
|
3865
3921
|
return;
|
|
3922
|
+
// Ownership gate: the reported id came from the GLOBAL history.jsonl, so a
|
|
3923
|
+
// sibling pane's identical text (e.g. a bare adopt-mode reply with no
|
|
3924
|
+
// unique <session_id>) could surface a foreign id. Only rotate the bridge
|
|
3925
|
+
// to a rollout THIS pid holds open; otherwise keep the current binding
|
|
3926
|
+
// (fail closed on unknown/unowned). Mirrors the codex branch above.
|
|
3927
|
+
if (!traexHistorySidOwnedByCurrentPid(cliSessionId)) {
|
|
3928
|
+
log(`Keeping current TRAE bridge ${currentSid ?? '?'} — refusing history-only re-attach to ${cliSessionId}`);
|
|
3929
|
+
return;
|
|
3930
|
+
}
|
|
3866
3931
|
const next = resolveFileBridgePath('traex', { sessionId: cliSessionId });
|
|
3867
3932
|
// Close any terminal already committed to the retired rollout before
|
|
3868
3933
|
// switching. A durable turn is a worker HOL barrier, so a legitimate
|
|
@@ -3982,6 +4047,19 @@ function codexBridgeNotifyCliSessionId(cliSessionId) {
|
|
|
3982
4047
|
return;
|
|
3983
4048
|
}
|
|
3984
4049
|
}
|
|
4050
|
+
// TRAE INITIAL attach: same shared-history.jsonl hazard as codex above. The
|
|
4051
|
+
// TRAE adapter only returns an owned sid, but keep a defense-in-depth gate so
|
|
4052
|
+
// a foreign sid from any other path can't first-attach the bridge in adopt
|
|
4053
|
+
// mode. Fail closed identically: keep the poller armed on the adopt pid rather
|
|
4054
|
+
// than pinning an unverified sid (which would wedge the bridge).
|
|
4055
|
+
if (structuredBridgeIsTraex() && lastInitConfig?.adoptMode && currentTraexObservedPid()) {
|
|
4056
|
+
if (!traexHistorySidOwnedByCurrentPid(cliSessionId)) {
|
|
4057
|
+
log(`TRAE initial-attach refused for unverified session ${cliSessionId}; keeping poller armed on pid ${currentTraexObservedPid()}`);
|
|
4058
|
+
codexBridgePendingSessionId = undefined;
|
|
4059
|
+
codexBridgeStartTimer();
|
|
4060
|
+
return;
|
|
4061
|
+
}
|
|
4062
|
+
}
|
|
3985
4063
|
const path = resolveFileBridgePath(lastInitConfig?.cliId, {
|
|
3986
4064
|
sessionId: cliSessionId,
|
|
3987
4065
|
cwd: lastInitConfig?.workingDir,
|
|
@@ -9360,17 +9438,62 @@ async function spawnCli(cfg, opts = {}) {
|
|
|
9360
9438
|
startWrapperRealPidResolve(cliPid);
|
|
9361
9439
|
if (cliPid)
|
|
9362
9440
|
observeCursorCliSessionId(cliPid);
|
|
9441
|
+
// File sandbox / Linux credential-only bwrap launches `bwrap --unshare-pid --
|
|
9442
|
+
// traex`, so the pane leaf (getChildPid) is the bwrap SUPERVISOR — its
|
|
9443
|
+
// /proc/<pid>/fd holds no rollout and the TRAE ownership gate can never admit
|
|
9444
|
+
// a session id (fresh sandbox TRAE then never captures its SID, the bridge
|
|
9445
|
+
// never attaches, and because reliableTurnTerminal disables screen-idle the
|
|
9446
|
+
// durable turn can wedge — it does NOT self-heal). The real traex leaf is
|
|
9447
|
+
// host-visible across the pid ns (ps -A ppid links), so BFS-descend to it and
|
|
9448
|
+
// rewire backend.cliPid. Bounded retry (not one-shot): bwrap may not have
|
|
9449
|
+
// forked traex yet at spawn. Reuses scheduleWrapperRealCliPid's stale-backend
|
|
9450
|
+
// guard so a mid-retry worker restart can't rewire the new session. Gated on
|
|
9451
|
+
// outerBwrapActive — sandboxRequested OR the Linux credential-only bwrap path,
|
|
9452
|
+
// both of which produce an outer supervisor pid. */
|
|
9453
|
+
const outerBwrapActive = sandboxRequested || credentialOnlyBwrap;
|
|
9454
|
+
lastSpawnOuterBwrapActive = outerBwrapActive;
|
|
9455
|
+
const startTraexSandboxPidResolve = (launcherPid) => {
|
|
9456
|
+
if (cfg.cliId !== 'traex' || !outerBwrapActive)
|
|
9457
|
+
return;
|
|
9458
|
+
scheduleWrapperRealCliPid(launcherPid, {
|
|
9459
|
+
findRealPid: (lp) => findLaunchedCliPid(lp, 'traex'),
|
|
9460
|
+
getBackend: () => backend,
|
|
9461
|
+
getChildPid: () => backend?.getChildPid?.(),
|
|
9462
|
+
applyRealPid: (realPid) => {
|
|
9463
|
+
log(`TRAE sandbox: resolved real traex leaf pid ${realPid} under bwrap supervisor ${launcherPid}; rewiring ownership pid`);
|
|
9464
|
+
backend.cliPid = realPid;
|
|
9465
|
+
backend.cliCwd = cfg.workingDir;
|
|
9466
|
+
publishLocalProcessAttestation(realPid);
|
|
9467
|
+
},
|
|
9468
|
+
schedule: (fn, ms) => { setTimeout(fn, ms); },
|
|
9469
|
+
});
|
|
9470
|
+
};
|
|
9363
9471
|
// Wire pid + cwd so adapters' writeInput can bind submits to this process:
|
|
9364
9472
|
// - claude-code: ~/.claude/sessions/<pid>.json
|
|
9365
9473
|
// - grok: findGrokSessionByPid → preferSessionId against shared
|
|
9366
9474
|
// prompt_history (concurrent same-cwd workers must not cross-claim)
|
|
9475
|
+
// - traex: findTraexRolloutSetByPid → ownership gate for the shared global
|
|
9476
|
+
// history.jsonl (concurrent same-TRAE_HOME panes must not cross-claim a
|
|
9477
|
+
// sibling's session id from an identical-text submit). getChildPid() is
|
|
9478
|
+
// normally the traex process itself, EXCEPT under the file sandbox: bwrap
|
|
9479
|
+
// runs `--unshare-pid -- traex`, so the pane leaf is the bwrap supervisor
|
|
9480
|
+
// and /proc/<bwrap>/fd holds no rollout. resolveTraexOwnershipPid() BFS-
|
|
9481
|
+
// descends to the real traex leaf (host-visible across the pid ns via
|
|
9482
|
+
// `ps -A` ppid links) so the ownership gate can actually admit the id;
|
|
9483
|
+
// it fails closed to the launcher pid when no leaf is found yet (the async
|
|
9484
|
+
// retry below re-resolves once bwrap has forked traex).
|
|
9367
9485
|
// Claude's sessionId is set ONCE at process start (2.1.123); a `--resume`
|
|
9368
9486
|
// lookup will surface here, but in-pane `/clear` won't. The pinned
|
|
9369
9487
|
// claudeJsonlPath above is still the initial guess; the resolver corrects
|
|
9370
9488
|
// it on first write when Claude was started with `--resume`.
|
|
9371
|
-
if (cliPid && (claudeDataDir || cfg.cliId === 'grok')) {
|
|
9372
|
-
|
|
9489
|
+
if (cliPid && (claudeDataDir || cfg.cliId === 'grok' || cfg.cliId === 'traex')) {
|
|
9490
|
+
// TRAE under outer bwrap: best-effort immediate resolve (leaf may already be
|
|
9491
|
+
// forked), then a bounded retry below covers the not-yet-forked case.
|
|
9492
|
+
const wiredPid = cfg.cliId === 'traex' ? resolveTraexOwnershipPid(cliPid, outerBwrapActive) : cliPid;
|
|
9493
|
+
backend.cliPid = wiredPid;
|
|
9373
9494
|
backend.cliCwd = cfg.workingDir;
|
|
9495
|
+
if (cfg.cliId === 'traex' && outerBwrapActive)
|
|
9496
|
+
startTraexSandboxPidResolve(cliPid);
|
|
9374
9497
|
}
|
|
9375
9498
|
// Async pid fallback: tmux/pty resolve the CLI pid synchronously above, but
|
|
9376
9499
|
// zellij's CLI subprocess starts AFTER spawn() returns (the zellij server
|
|
@@ -9399,9 +9522,12 @@ async function spawnCli(cfg, opts = {}) {
|
|
|
9399
9522
|
log(`Failed to write CLI PID marker (async): ${err.message}`);
|
|
9400
9523
|
}
|
|
9401
9524
|
}
|
|
9402
|
-
if (claudeDataDir || cfg.cliId === 'grok') {
|
|
9403
|
-
|
|
9525
|
+
if (claudeDataDir || cfg.cliId === 'grok' || cfg.cliId === 'traex') {
|
|
9526
|
+
const wiredPid = cfg.cliId === 'traex' ? resolveTraexOwnershipPid(pid, outerBwrapActive) : pid;
|
|
9527
|
+
backend.cliPid = wiredPid;
|
|
9404
9528
|
backend.cliCwd = cfg.workingDir;
|
|
9529
|
+
if (cfg.cliId === 'traex' && outerBwrapActive)
|
|
9530
|
+
startTraexSandboxPidResolve(pid);
|
|
9405
9531
|
}
|
|
9406
9532
|
// wrapperCli under a late-pid backend (zellij): `pid` here is still the
|
|
9407
9533
|
// LAUNCHER. Kick the descendant resolver so the bridge gets the real CLI
|