instar 1.3.486 → 1.3.488
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/commands/reflect.d.ts.map +1 -1
- package/dist/commands/reflect.js +4 -0
- package/dist/commands/reflect.js.map +1 -1
- package/dist/commands/route.d.ts.map +1 -1
- package/dist/commands/route.js +3 -0
- package/dist/commands/route.js.map +1 -1
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +14 -0
- package/dist/commands/server.js.map +1 -1
- package/dist/core/CircuitBreakingIntelligenceProvider.d.ts +7 -0
- package/dist/core/CircuitBreakingIntelligenceProvider.d.ts.map +1 -1
- package/dist/core/CircuitBreakingIntelligenceProvider.js +50 -0
- package/dist/core/CircuitBreakingIntelligenceProvider.js.map +1 -1
- package/dist/core/ClaudeCliIntelligenceProvider.d.ts +5 -0
- package/dist/core/ClaudeCliIntelligenceProvider.d.ts.map +1 -1
- package/dist/core/ClaudeCliIntelligenceProvider.js +6 -1
- package/dist/core/ClaudeCliIntelligenceProvider.js.map +1 -1
- package/dist/core/CodexCliIntelligenceProvider.d.ts +58 -0
- package/dist/core/CodexCliIntelligenceProvider.d.ts.map +1 -1
- package/dist/core/CodexCliIntelligenceProvider.js +293 -27
- package/dist/core/CodexCliIntelligenceProvider.js.map +1 -1
- package/dist/core/GeminiCliIntelligenceProvider.d.ts +8 -0
- package/dist/core/GeminiCliIntelligenceProvider.d.ts.map +1 -1
- package/dist/core/GeminiCliIntelligenceProvider.js +8 -0
- package/dist/core/GeminiCliIntelligenceProvider.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +40 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/SafeGitExecutor.d.ts.map +1 -1
- package/dist/core/SafeGitExecutor.js +79 -1
- package/dist/core/SafeGitExecutor.js.map +1 -1
- package/dist/core/StateManager.d.ts +8 -0
- package/dist/core/StateManager.d.ts.map +1 -1
- package/dist/core/StateManager.js +37 -0
- package/dist/core/StateManager.js.map +1 -1
- package/dist/core/componentCategories.d.ts.map +1 -1
- package/dist/core/componentCategories.js +10 -0
- package/dist/core/componentCategories.js.map +1 -1
- package/dist/core/intelligenceProviderFactory.d.ts +8 -0
- package/dist/core/intelligenceProviderFactory.d.ts.map +1 -1
- package/dist/core/intelligenceProviderFactory.js +1 -0
- package/dist/core/intelligenceProviderFactory.js.map +1 -1
- package/dist/core/types.d.ts +25 -9
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/messaging/slack/SlackAdapter.d.ts +3 -0
- package/dist/messaging/slack/SlackAdapter.d.ts.map +1 -1
- package/dist/messaging/slack/SlackAdapter.js +8 -1
- package/dist/messaging/slack/SlackAdapter.js.map +1 -1
- package/dist/monitoring/FeatureMetricsLedger.d.ts +123 -1
- package/dist/monitoring/FeatureMetricsLedger.d.ts.map +1 -1
- package/dist/monitoring/FeatureMetricsLedger.js +211 -25
- package/dist/monitoring/FeatureMetricsLedger.js.map +1 -1
- package/dist/providers/adapters/anthropic-interactive-pool/index.d.ts.map +1 -1
- package/dist/providers/adapters/anthropic-interactive-pool/index.js +1 -0
- package/dist/providers/adapters/anthropic-interactive-pool/index.js.map +1 -1
- package/dist/providers/adapters/openai-codex/transport/codexSpawn.d.ts +93 -0
- package/dist/providers/adapters/openai-codex/transport/codexSpawn.d.ts.map +1 -1
- package/dist/providers/adapters/openai-codex/transport/codexSpawn.js +339 -0
- package/dist/providers/adapters/openai-codex/transport/codexSpawn.js.map +1 -1
- package/dist/providers/adapters/openai-codex/transport/codexUsageParser.d.ts +84 -0
- package/dist/providers/adapters/openai-codex/transport/codexUsageParser.d.ts.map +1 -0
- package/dist/providers/adapters/openai-codex/transport/codexUsageParser.js +208 -0
- package/dist/providers/adapters/openai-codex/transport/codexUsageParser.js.map +1 -0
- package/dist/providers/uxConfirm/OverrideDetector.d.ts.map +1 -1
- package/dist/providers/uxConfirm/OverrideDetector.js +1 -0
- package/dist/providers/uxConfirm/OverrideDetector.js.map +1 -1
- package/dist/providers/uxConfirm/TaskClassifier.d.ts.map +1 -1
- package/dist/providers/uxConfirm/TaskClassifier.js +1 -0
- package/dist/providers/uxConfirm/TaskClassifier.js.map +1 -1
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +3 -2
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/security/LLMSanitizer.d.ts.map +1 -1
- package/dist/security/LLMSanitizer.js +7 -1
- package/dist/security/LLMSanitizer.js.map +1 -1
- package/dist/server/CapabilityIndex.js +1 -1
- package/dist/server/CapabilityIndex.js.map +1 -1
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +10 -1
- package/dist/server/routes.js.map +1 -1
- package/dist/threadline/PipeSessionSpawner.d.ts.map +1 -1
- package/dist/threadline/PipeSessionSpawner.js +2 -0
- package/dist/threadline/PipeSessionSpawner.js.map +1 -1
- package/dist/threadline/WarrantsReplyGate.d.ts.map +1 -1
- package/dist/threadline/WarrantsReplyGate.js +5 -1
- package/dist/threadline/WarrantsReplyGate.js.map +1 -1
- package/package.json +4 -2
- package/scripts/lint-llm-attribution.js +418 -0
- package/scripts/lint-no-direct-destructive.js +4 -0
- package/scripts/pre-push-gate.js +24 -0
- package/src/data/builtin-manifest.json +63 -63
- package/src/scaffold/templates.ts +3 -2
- package/upgrades/1.3.487.md +39 -0
- package/upgrades/1.3.488.md +27 -0
- package/upgrades/side-effects/session-ghost-records.md +79 -0
- package/upgrades/side-effects/token-audit-completeness.md +84 -0
|
@@ -15,6 +15,10 @@
|
|
|
15
15
|
* codex inside tmux, where tmux owns stdin — that path is unaffected.
|
|
16
16
|
*/
|
|
17
17
|
import { spawn } from 'node:child_process';
|
|
18
|
+
import { mkdtempSync, promises as fsp } from 'node:fs';
|
|
19
|
+
import { tmpdir } from 'node:os';
|
|
20
|
+
import { join } from 'node:path';
|
|
21
|
+
import { SafeFsExecutor } from '../../../../core/SafeFsExecutor.js';
|
|
18
22
|
/**
|
|
19
23
|
* Rule 1a — env allowlist for Codex child processes.
|
|
20
24
|
*
|
|
@@ -219,6 +223,10 @@ export async function spawnCodexAndWait(binary, args, options) {
|
|
|
219
223
|
options.signal?.addEventListener('abort', onAbort, { once: true });
|
|
220
224
|
child.stdout.on('data', (b) => stdoutChunks.push(b));
|
|
221
225
|
child.stderr.on('data', (b) => stderrChunks.push(b));
|
|
226
|
+
// Swallow readable-side pipe errors (EIO/EBADF) — an unhandled stream
|
|
227
|
+
// 'error' is an uncaughtException; the failure surfaces via close/exit.
|
|
228
|
+
child.stdout.on('error', () => { });
|
|
229
|
+
child.stderr.on('error', () => { });
|
|
222
230
|
child.on('error', (err) => {
|
|
223
231
|
clearTimeout(timer);
|
|
224
232
|
options.signal?.removeEventListener('abort', onAbort);
|
|
@@ -247,4 +255,335 @@ export async function spawnCodexAndWait(binary, args, options) {
|
|
|
247
255
|
child.stdin.end();
|
|
248
256
|
});
|
|
249
257
|
}
|
|
258
|
+
// ── codex exec --json streaming spawn (token-audit-completeness spec) ──────
|
|
259
|
+
//
|
|
260
|
+
// The `--json` event stream is strictly larger than plain output, and
|
|
261
|
+
// execFile's maxBuffer overflow does not truncate — it KILLS the child and
|
|
262
|
+
// fails the call, making long calls (the cartographer-sweep class) MORE
|
|
263
|
+
// likely to fail. This streaming helper bounds memory instead: lines are
|
|
264
|
+
// assembled across chunk boundaries via a carry buffer capped at 2 MB (an
|
|
265
|
+
// over-cap line is discarded unparsed and counted — usage events are <1 KB,
|
|
266
|
+
// so the cap cannot lose usage), stderr is drained continuously (an
|
|
267
|
+
// undrained pipe wedges a chatty-stderr child on the 64 KB OS buffer — a
|
|
268
|
+
// hang class execFile did not have), and the promise settles from the
|
|
269
|
+
// `close` handler after the carry flush, so ALL onLine callbacks complete
|
|
270
|
+
// before settlement. A bounded post-`exit` grace (default 5 s) covers a
|
|
271
|
+
// grandchild holding the inherited stdout fd past SIGKILL.
|
|
272
|
+
/** Carry-buffer cap for event-line assembly (2 MB). */
|
|
273
|
+
export const EXEC_JSON_CARRY_CAP_BYTES = 2 * 1024 * 1024;
|
|
274
|
+
export class CodexExecJsonTimeoutError extends Error {
|
|
275
|
+
stderrTail;
|
|
276
|
+
killed = true;
|
|
277
|
+
signal = 'SIGTERM';
|
|
278
|
+
constructor(timeoutMs, stderrTail) {
|
|
279
|
+
super(`Codex exec --json timed out after ${timeoutMs}ms`);
|
|
280
|
+
this.name = 'CodexExecJsonTimeoutError';
|
|
281
|
+
this.stderrTail = stderrTail;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Spawn `codex exec --json ...` and stream its event lines to `onLine`.
|
|
286
|
+
*
|
|
287
|
+
* Settlement contract (the spec's "settlement ordering"): the timeout timer
|
|
288
|
+
* only INITIATES the kill sequence (SIGTERM → sigkillGraceMs → SIGKILL); the
|
|
289
|
+
* promise settles from the `close` handler — after the carry flush — or at a
|
|
290
|
+
* bounded post-`exit` grace when `close` is deferred by a held fd. Either
|
|
291
|
+
* way, every onLine callback (including the final post-SIGTERM flush) has
|
|
292
|
+
* completed before the promise settles, exactly once.
|
|
293
|
+
*
|
|
294
|
+
* Resolution: `{ exitCode, stderrTail }` for ANY exit (the caller decides
|
|
295
|
+
* what a non-zero exit means). Rejection: spawn error, or timeout
|
|
296
|
+
* (CodexExecJsonTimeoutError — after the final flush, so already-parsed
|
|
297
|
+
* usage is never lost to the reject path).
|
|
298
|
+
*/
|
|
299
|
+
export async function spawnCodexExecJson(binary, args, options) {
|
|
300
|
+
const spawnFn = options.spawnImpl ?? spawn;
|
|
301
|
+
const postExitGraceMs = options.postExitGraceMs ?? 5000;
|
|
302
|
+
const sigkillGraceMs = options.sigkillGraceMs ?? 2000;
|
|
303
|
+
return new Promise((resolve, reject) => {
|
|
304
|
+
const child = spawnFn(binary, args, {
|
|
305
|
+
env: options.env,
|
|
306
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
307
|
+
});
|
|
308
|
+
let settled = false;
|
|
309
|
+
let timedOut = false;
|
|
310
|
+
let spawnError = null;
|
|
311
|
+
let exitCode;
|
|
312
|
+
let stderrTail = '';
|
|
313
|
+
let carry = '';
|
|
314
|
+
let discardingOversized = false;
|
|
315
|
+
let graceTimer;
|
|
316
|
+
let killEscalation;
|
|
317
|
+
const emitLine = (line) => {
|
|
318
|
+
try {
|
|
319
|
+
options.onLine(line);
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
/* @silent-fallback-ok: a consumer throw must never wedge the stream */
|
|
323
|
+
}
|
|
324
|
+
};
|
|
325
|
+
const noteOversized = () => {
|
|
326
|
+
try {
|
|
327
|
+
options.onOversizedLine?.();
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
/* @silent-fallback-ok */
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
const processChunk = (chunk) => {
|
|
334
|
+
let data = chunk;
|
|
335
|
+
while (data.length > 0) {
|
|
336
|
+
const nl = data.indexOf('\n');
|
|
337
|
+
if (discardingOversized) {
|
|
338
|
+
if (nl === -1)
|
|
339
|
+
return; // keep discarding until the line ends
|
|
340
|
+
discardingOversized = false;
|
|
341
|
+
noteOversized();
|
|
342
|
+
data = data.slice(nl + 1);
|
|
343
|
+
continue;
|
|
344
|
+
}
|
|
345
|
+
if (nl === -1) {
|
|
346
|
+
carry += data;
|
|
347
|
+
if (carry.length > EXEC_JSON_CARRY_CAP_BYTES) {
|
|
348
|
+
carry = '';
|
|
349
|
+
discardingOversized = true;
|
|
350
|
+
}
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
const line = carry + data.slice(0, nl);
|
|
354
|
+
carry = '';
|
|
355
|
+
if (line.length > EXEC_JSON_CARRY_CAP_BYTES) {
|
|
356
|
+
noteOversized(); // complete line over the cap — discarded unparsed
|
|
357
|
+
}
|
|
358
|
+
else if (line.length > 0) {
|
|
359
|
+
emitLine(line);
|
|
360
|
+
}
|
|
361
|
+
data = data.slice(nl + 1);
|
|
362
|
+
}
|
|
363
|
+
};
|
|
364
|
+
const flushCarry = () => {
|
|
365
|
+
if (discardingOversized) {
|
|
366
|
+
discardingOversized = false;
|
|
367
|
+
noteOversized();
|
|
368
|
+
}
|
|
369
|
+
else if (carry.length > 0) {
|
|
370
|
+
emitLine(carry);
|
|
371
|
+
}
|
|
372
|
+
carry = '';
|
|
373
|
+
};
|
|
374
|
+
const settle = () => {
|
|
375
|
+
if (settled)
|
|
376
|
+
return;
|
|
377
|
+
settled = true;
|
|
378
|
+
clearTimeout(killTimer);
|
|
379
|
+
if (graceTimer)
|
|
380
|
+
clearTimeout(graceTimer);
|
|
381
|
+
if (killEscalation)
|
|
382
|
+
clearTimeout(killEscalation);
|
|
383
|
+
// Final accounting BEFORE settlement — the post-SIGTERM token_count
|
|
384
|
+
// flush must reach the consumer before any reject is observable.
|
|
385
|
+
flushCarry();
|
|
386
|
+
try {
|
|
387
|
+
child.stdout?.removeAllListeners('data');
|
|
388
|
+
child.stderr?.removeAllListeners('data');
|
|
389
|
+
child.stdout?.destroy();
|
|
390
|
+
child.stderr?.destroy();
|
|
391
|
+
}
|
|
392
|
+
catch {
|
|
393
|
+
/* @silent-fallback-ok */
|
|
394
|
+
}
|
|
395
|
+
if (spawnError)
|
|
396
|
+
return reject(spawnError);
|
|
397
|
+
if (timedOut)
|
|
398
|
+
return reject(new CodexExecJsonTimeoutError(options.timeoutMs, stderrTail));
|
|
399
|
+
resolve({ exitCode: exitCode ?? null, stderrTail });
|
|
400
|
+
};
|
|
401
|
+
// Timeout: the timer only INITIATES the kill sequence; settlement waits
|
|
402
|
+
// for close (or the post-exit grace) so the final flush is never lost.
|
|
403
|
+
const killTimer = setTimeout(() => {
|
|
404
|
+
timedOut = true;
|
|
405
|
+
try {
|
|
406
|
+
child.kill('SIGTERM');
|
|
407
|
+
}
|
|
408
|
+
catch {
|
|
409
|
+
/* @silent-fallback-ok */
|
|
410
|
+
}
|
|
411
|
+
killEscalation = setTimeout(() => {
|
|
412
|
+
try {
|
|
413
|
+
child.kill('SIGKILL');
|
|
414
|
+
}
|
|
415
|
+
catch {
|
|
416
|
+
/* @silent-fallback-ok */
|
|
417
|
+
}
|
|
418
|
+
}, sigkillGraceMs);
|
|
419
|
+
killEscalation.unref();
|
|
420
|
+
}, options.timeoutMs);
|
|
421
|
+
killTimer.unref();
|
|
422
|
+
child.stdout.setEncoding('utf8');
|
|
423
|
+
child.stdout.on('data', (chunk) => processChunk(chunk));
|
|
424
|
+
// Readable-side stream errors (rare: EIO/EBADF on the pipe) are the same
|
|
425
|
+
// uncaughtException-takes-down-the-server class the stdin handler guards;
|
|
426
|
+
// the failure surfaces via the exit/close path.
|
|
427
|
+
child.stdout.on('error', () => { });
|
|
428
|
+
// stderr drained CONTINUOUSLY for the child's lifetime — rolling
|
|
429
|
+
// 600-char tail, chunks discarded.
|
|
430
|
+
child.stderr.setEncoding('utf8');
|
|
431
|
+
child.stderr.on('data', (chunk) => {
|
|
432
|
+
stderrTail = (stderrTail + chunk).slice(-600);
|
|
433
|
+
});
|
|
434
|
+
child.stderr.on('error', () => { });
|
|
435
|
+
child.on('error', (err) => {
|
|
436
|
+
spawnError = err instanceof Error ? err : new Error(String(err));
|
|
437
|
+
settle();
|
|
438
|
+
});
|
|
439
|
+
child.on('exit', (code) => {
|
|
440
|
+
exitCode = code;
|
|
441
|
+
// `close` can be indefinitely deferred by a grandchild holding the
|
|
442
|
+
// inherited stdout fd past SIGKILL — bound it.
|
|
443
|
+
graceTimer = setTimeout(settle, postExitGraceMs);
|
|
444
|
+
graceTimer.unref();
|
|
445
|
+
});
|
|
446
|
+
child.on('close', (code) => {
|
|
447
|
+
if (exitCode === undefined)
|
|
448
|
+
exitCode = code;
|
|
449
|
+
settle();
|
|
450
|
+
});
|
|
451
|
+
// stdin error contract: the designed failure paths (old-CLI unknown-flag
|
|
452
|
+
// fast-exit; SIGTERM mid-drain) close the pipe while a cartographer-class
|
|
453
|
+
// multi-MB prompt may still be writing — an unhandled stream 'error' is
|
|
454
|
+
// an uncaughtException that takes down the whole agent server. The
|
|
455
|
+
// failure itself is surfaced via the non-zero-exit / timeout paths.
|
|
456
|
+
child.stdin.on('error', (err) => {
|
|
457
|
+
if (err.code === 'EPIPE' || err.code === 'ERR_STREAM_DESTROYED')
|
|
458
|
+
return;
|
|
459
|
+
/* other stdin errors are equally non-actionable here — the exit path reports */
|
|
460
|
+
});
|
|
461
|
+
// Write the prompt, then end (json mode's stdin hygiene: write+end).
|
|
462
|
+
child.stdin.end(options.prompt);
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
// ── per-call out-dir lifecycle + bounded stale sweep ───────────────────────
|
|
466
|
+
//
|
|
467
|
+
// The --output-last-message file lives in a FRESH per-call mkdtemp dir
|
|
468
|
+
// (0700, unguessable suffix) — NOT the long-lived cached scratch dir, whose
|
|
469
|
+
// existsSync reuse branch does not re-verify ownership/mode and must never
|
|
470
|
+
// have model output written into or read from it.
|
|
471
|
+
const CODEX_OUT_DIR_PREFIX = 'instar-codex-out-';
|
|
472
|
+
/** In-process registry of live out-dirs — the stale sweep always skips these. */
|
|
473
|
+
const inFlightOutDirs = new Set();
|
|
474
|
+
export function createCodexOutDir() {
|
|
475
|
+
const dir = mkdtempSync(join(tmpdir(), CODEX_OUT_DIR_PREFIX));
|
|
476
|
+
inFlightOutDirs.add(dir);
|
|
477
|
+
return dir;
|
|
478
|
+
}
|
|
479
|
+
/**
|
|
480
|
+
* Remove a per-call out-dir. Pinned nesting per spec:
|
|
481
|
+
* `try { safeRm(dir) } finally { set.delete(dir) }` — a throwing deletion
|
|
482
|
+
* (EPERM, sandbox-revoked tmp access) cannot leak the in-flight entry.
|
|
483
|
+
* Never throws into the call path.
|
|
484
|
+
*/
|
|
485
|
+
export function cleanupCodexOutDir(dir) {
|
|
486
|
+
try {
|
|
487
|
+
try {
|
|
488
|
+
SafeFsExecutor.safeRmSync(dir, {
|
|
489
|
+
recursive: true,
|
|
490
|
+
force: true,
|
|
491
|
+
operation: 'codex exec-json out-dir cleanup',
|
|
492
|
+
});
|
|
493
|
+
}
|
|
494
|
+
finally {
|
|
495
|
+
inFlightOutDirs.delete(dir);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
catch {
|
|
499
|
+
/* @silent-fallback-ok: cleanup must never throw into the judgment-call path; the stale sweep is the backstop */
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
/** Sweep brakes (P19 — every one unit-tested). */
|
|
503
|
+
export const CODEX_OUT_SWEEP_INTERVAL_MS = 60 * 60 * 1000; // rate floor: once/hour/process
|
|
504
|
+
export const CODEX_OUT_SWEEP_AGE_MS = 6 * 60 * 60 * 1000; // ≫ any supported judgment-call timeout
|
|
505
|
+
export const CODEX_OUT_SWEEP_MAX_DELETIONS = 20;
|
|
506
|
+
export const CODEX_OUT_SWEEP_MAX_CANDIDATES = 200;
|
|
507
|
+
let lastSweepAt = 0;
|
|
508
|
+
/**
|
|
509
|
+
* Opportunistic, bounded sweep of stale `instar-codex-out-*` dirs left by
|
|
510
|
+
* CRASHED processes (the in-process `finally` covers everything else).
|
|
511
|
+
*
|
|
512
|
+
* Fire-and-forget async — NEVER awaited by evaluate() (os.tmpdir() population
|
|
513
|
+
* scales with the whole machine; a synchronous readdir+lstat pass inside a
|
|
514
|
+
* judgment call would block the single server event loop on foreign state).
|
|
515
|
+
* `lastSweepAt` is set BEFORE the pass starts so concurrent calls cannot
|
|
516
|
+
* double-trigger. os.tmpdir() is hostile on Linux (world-writable /tmp): each
|
|
517
|
+
* candidate is lstat-verified — a directory, NOT a symlink, owned by this
|
|
518
|
+
* uid, mtime older than the threshold — and EPERM/ENOENT during deletion is
|
|
519
|
+
* swallowed, never thrown into the call path.
|
|
520
|
+
*
|
|
521
|
+
* Returns the sweep promise when a pass started (for tests), null when
|
|
522
|
+
* rate-floored.
|
|
523
|
+
*/
|
|
524
|
+
export function maybeSweepStaleCodexOutDirs(options = {}) {
|
|
525
|
+
const now = options.now?.() ?? Date.now();
|
|
526
|
+
if (now - lastSweepAt < CODEX_OUT_SWEEP_INTERVAL_MS)
|
|
527
|
+
return null;
|
|
528
|
+
lastSweepAt = now; // set before the pass starts — no double-trigger
|
|
529
|
+
const tmp = options.tmpDirOverride ?? tmpdir();
|
|
530
|
+
const lstat = options.lstatImpl ?? fsp.lstat;
|
|
531
|
+
return (async () => {
|
|
532
|
+
try {
|
|
533
|
+
const entries = await fsp.readdir(tmp);
|
|
534
|
+
let examined = 0;
|
|
535
|
+
let deleted = 0;
|
|
536
|
+
for (const name of entries) {
|
|
537
|
+
if (!name.startsWith(CODEX_OUT_DIR_PREFIX))
|
|
538
|
+
continue;
|
|
539
|
+
if (examined >= CODEX_OUT_SWEEP_MAX_CANDIDATES)
|
|
540
|
+
break;
|
|
541
|
+
if (deleted >= CODEX_OUT_SWEEP_MAX_DELETIONS)
|
|
542
|
+
break;
|
|
543
|
+
const full = join(tmp, name);
|
|
544
|
+
// A live long call's dir can never be deleted from this process.
|
|
545
|
+
if (inFlightOutDirs.has(full))
|
|
546
|
+
continue;
|
|
547
|
+
examined++;
|
|
548
|
+
let st;
|
|
549
|
+
try {
|
|
550
|
+
st = await lstat(full);
|
|
551
|
+
}
|
|
552
|
+
catch {
|
|
553
|
+
continue;
|
|
554
|
+
}
|
|
555
|
+
// lstat: a symlink reports isSymbolicLink, not isDirectory — planted
|
|
556
|
+
// symlinks and foreign dirs are skipped.
|
|
557
|
+
if (!st.isDirectory())
|
|
558
|
+
continue;
|
|
559
|
+
const uid = process.getuid?.();
|
|
560
|
+
if (uid !== undefined && st.uid !== uid)
|
|
561
|
+
continue;
|
|
562
|
+
if (now - st.mtimeMs < CODEX_OUT_SWEEP_AGE_MS)
|
|
563
|
+
continue;
|
|
564
|
+
try {
|
|
565
|
+
await SafeFsExecutor.safeRm(full, {
|
|
566
|
+
recursive: true,
|
|
567
|
+
force: true,
|
|
568
|
+
operation: 'codex exec-json stale out-dir sweep',
|
|
569
|
+
});
|
|
570
|
+
deleted++;
|
|
571
|
+
}
|
|
572
|
+
catch {
|
|
573
|
+
/* @silent-fallback-ok: EPERM/ENOENT on a hostile tmp entry is skipped, never thrown */
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
catch {
|
|
578
|
+
/* @silent-fallback-ok: the sweep is belt-and-suspenders housekeeping */
|
|
579
|
+
}
|
|
580
|
+
})();
|
|
581
|
+
}
|
|
582
|
+
/** Test-only internals. */
|
|
583
|
+
export const _codexOutDirInternals = {
|
|
584
|
+
inFlightOutDirs,
|
|
585
|
+
resetSweepClock() {
|
|
586
|
+
lastSweepAt = 0;
|
|
587
|
+
},
|
|
588
|
+
};
|
|
250
589
|
//# sourceMappingURL=codexSpawn.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codexSpawn.js","sourceRoot":"","sources":["../../../../../src/providers/adapters/openai-codex/transport/codexSpawn.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"codexSpawn.js","sourceRoot":"","sources":["../../../../../src/providers/adapters/openai-codex/transport/codexSpawn.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* codexUsageParser — line-wise, shape-validated token-usage extraction from
|
|
3
|
+
* the `codex exec --json` event stream (token-audit-completeness spec).
|
|
4
|
+
*
|
|
5
|
+
* SECURITY / INJECTION POSTURE: usage parsing operates line-wise via
|
|
6
|
+
* `JSON.parse` with TOP-LEVEL shape validation; substring/regex matching over
|
|
7
|
+
* the raw stream is FORBIDDEN — model content embedded inside event string
|
|
8
|
+
* fields is structurally incapable of matching a top-level parse. (The
|
|
9
|
+
* key-substring pre-filter below only decides whether to ATTEMPT the parse —
|
|
10
|
+
* it cannot extract values, so the injection rationale is untouched.)
|
|
11
|
+
*
|
|
12
|
+
* Two known event shapes, with an explicit precedence rule:
|
|
13
|
+
*
|
|
14
|
+
* 1. Protocol shape (AUTHORITATIVE when present):
|
|
15
|
+
* {"msg":{"type":"token_count","info":{"total_token_usage":{...}}}}
|
|
16
|
+
* (also matched under a `payload` key). CUMULATIVE — the last event wins
|
|
17
|
+
* within this shape. Verified against a real codex 0.136.0 rollout:
|
|
18
|
+
* `input_tokens` includes `cached_input_tokens`;
|
|
19
|
+
* `total_tokens = input_tokens + output_tokens`.
|
|
20
|
+
*
|
|
21
|
+
* 2. Thread-event shape (only when NO protocol event appeared):
|
|
22
|
+
* {"type":"turn.completed","usage":{...}}
|
|
23
|
+
* PER-TURN — summed across all `turn.completed` events.
|
|
24
|
+
*
|
|
25
|
+
* Never mixed in one accounting. When BOTH shapes appear in one stream, the
|
|
26
|
+
* protocol total is recorded and a large divergence from the thread-event sum
|
|
27
|
+
* emits the drift reason `shape-divergence` — a free consistency oracle
|
|
28
|
+
* against partial-cadence drift (a CLI that keeps the shape but stops
|
|
29
|
+
* emitting mid-stream).
|
|
30
|
+
*
|
|
31
|
+
* Token fields are clamped to non-negative finite integers; a protocol sample
|
|
32
|
+
* whose `total_tokens` reconciliation fails is DROPPED, not recorded — and the
|
|
33
|
+
* drop counts as zero-usage for the drift tripwire (`reconciliation-failed`),
|
|
34
|
+
* so systematic reconciliation failure cannot recreate silent token-blindness.
|
|
35
|
+
*
|
|
36
|
+
* Mapping: tokensIn = input_tokens; tokensOut = output_tokens +
|
|
37
|
+
* (reasoning_output_tokens iff total_tokens reconciliation shows they are
|
|
38
|
+
* additive); tokensCached = cached_input_tokens (a subset of tokensIn).
|
|
39
|
+
*/
|
|
40
|
+
export interface CodexUsageSample {
|
|
41
|
+
inputTokens: number;
|
|
42
|
+
outputTokens: number;
|
|
43
|
+
cachedTokens: number;
|
|
44
|
+
}
|
|
45
|
+
export type CodexUsageDriftReason = 'no-events' | 'empty-stream' | 'reconciliation-failed' | 'shape-divergence' | 'oversized-lines-discarded';
|
|
46
|
+
export interface CodexUsageFinalizeResult {
|
|
47
|
+
/** Final recorded usage, or null when none survived validation. */
|
|
48
|
+
usage: CodexUsageSample | null;
|
|
49
|
+
/**
|
|
50
|
+
* Drift reasons for the tripwire. Zero-usage reasons (no-events /
|
|
51
|
+
* empty-stream / reconciliation-failed) only apply on a successful exit;
|
|
52
|
+
* consistency reasons (shape-divergence / oversized-lines-discarded) are
|
|
53
|
+
* reported whenever observed on a successful exit.
|
|
54
|
+
*/
|
|
55
|
+
driftReasons: CodexUsageDriftReason[];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Accumulates usage events from COMPLETE lines of a `codex exec --json`
|
|
59
|
+
* stream. Line assembly (chunk boundaries, the carry-buffer cap) is the spawn
|
|
60
|
+
* helper's job — this class assumes whole lines.
|
|
61
|
+
*/
|
|
62
|
+
export declare class CodexUsageAccumulator {
|
|
63
|
+
private lastProtocol;
|
|
64
|
+
private threadSum;
|
|
65
|
+
private sawAnyLine;
|
|
66
|
+
private oversizedDiscards;
|
|
67
|
+
/** Feed one complete line from the event stream. Malformed lines are skipped. */
|
|
68
|
+
feedLine(line: string): void;
|
|
69
|
+
/**
|
|
70
|
+
* Record that the spawn helper discarded an over-cap line unparsed. Usage
|
|
71
|
+
* events are <1 KB so the cap cannot lose usage, but the discard is
|
|
72
|
+
* surfaced to the drift tripwire.
|
|
73
|
+
*/
|
|
74
|
+
noteOversizedDiscard(): void;
|
|
75
|
+
/**
|
|
76
|
+
* Finalize accounting. `success` = the call exited 0 (drift reasons are
|
|
77
|
+
* only reported for successful calls — a failed call legitimately lacks
|
|
78
|
+
* usage and is visible as an error row instead).
|
|
79
|
+
*/
|
|
80
|
+
finalize(opts: {
|
|
81
|
+
success: boolean;
|
|
82
|
+
}): CodexUsageFinalizeResult;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=codexUsageParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codexUsageParser.d.ts","sourceRoot":"","sources":["../../../../../src/providers/adapters/openai-codex/transport/codexUsageParser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,qBAAqB,GAC7B,WAAW,GACX,cAAc,GACd,uBAAuB,GACvB,kBAAkB,GAClB,2BAA2B,CAAC;AAEhC,MAAM,WAAW,wBAAwB;IACvC,mEAAmE;IACnE,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/B;;;;;OAKG;IACH,YAAY,EAAE,qBAAqB,EAAE,CAAC;CACvC;AA4CD;;;;GAIG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,SAAS,CAAkE;IACnF,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,iBAAiB,CAAK;IAE9B,iFAAiF;IACjF,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAyC5B;;;;OAIG;IACH,oBAAoB,IAAI,IAAI;IAI5B;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,wBAAwB;CAoE/D"}
|