@miller-tech/uap 1.148.17 → 1.148.20
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/.tsbuildinfo +1 -1
- package/dist/cli/deliver-detach.d.ts +61 -0
- package/dist/cli/deliver-detach.d.ts.map +1 -0
- package/dist/cli/deliver-detach.js +126 -0
- package/dist/cli/deliver-detach.js.map +1 -0
- package/dist/cli/deliver.d.ts.map +1 -1
- package/dist/cli/deliver.js +28 -0
- package/dist/cli/deliver.js.map +1 -1
- package/dist/delivery/run-exit.d.ts +50 -0
- package/dist/delivery/run-exit.d.ts.map +1 -0
- package/dist/delivery/run-exit.js +105 -0
- package/dist/delivery/run-exit.js.map +1 -0
- package/dist/delivery/run-state.d.ts +10 -0
- package/dist/delivery/run-state.d.ts.map +1 -1
- package/dist/delivery/run-state.js.map +1 -1
- package/dist/delivery/self-gate.d.ts +23 -1
- package/dist/delivery/self-gate.d.ts.map +1 -1
- package/dist/delivery/self-gate.js +43 -3
- package/dist/delivery/self-gate.js.map +1 -1
- package/package.json +1 -1
- package/src/policies/enforcers/__pycache__/_common.cpython-312.pyc +0 -0
- package/tools/agents/scripts/__pycache__/toolcall_path_normalizer.cpython-312.pyc +0 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A mission must outlive the tool call that started it.
|
|
3
|
+
*
|
|
4
|
+
* Coding agents run shell commands in a bounded tool call: opencode puts each
|
|
5
|
+
* `bash -c …` in its own session and kills that process group when the call ends
|
|
6
|
+
* or times out. A model that invokes `uap deliver` from its bash tool therefore
|
|
7
|
+
* spawns a long mission INSIDE a short-lived container — and when the tool call
|
|
8
|
+
* ends, the whole mission dies wherever it happened to be. Observed lifetimes on
|
|
9
|
+
* the live sandbox were 531s, 258s, 34s, 0s, 291s: not timeouts, just "whenever
|
|
10
|
+
* the tool call happened to end". Nothing landed, ever.
|
|
11
|
+
*
|
|
12
|
+
* (The autoroute hook already spawns with start_new_session=True and is immune.
|
|
13
|
+
* This closes the same hole for a model that calls deliver directly.)
|
|
14
|
+
*
|
|
15
|
+
* So deliver re-launches itself into its OWN session, which a process-group kill
|
|
16
|
+
* cannot reach, and the foreground wrapper mirrors the mission's output. If the
|
|
17
|
+
* client tears the tool call down, the wrapper dies and the MISSION KEEPS GOING —
|
|
18
|
+
* to completion, with its result recorded and resumable.
|
|
19
|
+
*
|
|
20
|
+
* Two details that matter:
|
|
21
|
+
* - The child's stdio goes to a FILE, never to a pipe held by the wrapper. A
|
|
22
|
+
* pipe whose reader is killed would hand the child EPIPE and take it down
|
|
23
|
+
* too — defeating the entire point.
|
|
24
|
+
* - An interactive run (stdout is a TTY) is left alone: a human wants live
|
|
25
|
+
* output and a working Ctrl-C. Only a captured, non-TTY invocation — which is
|
|
26
|
+
* exactly what an agent tool call looks like — is detached.
|
|
27
|
+
*/
|
|
28
|
+
/** Set on the detached child so it never re-detaches (infinite recursion). */
|
|
29
|
+
export declare const DETACH_ENV = "UAP_DELIVER_DETACHED";
|
|
30
|
+
/** Escape hatch: force the old attached behaviour. */
|
|
31
|
+
export declare const NO_DETACH_ENV = "UAP_DELIVER_NO_DETACH";
|
|
32
|
+
export interface DetachDecision {
|
|
33
|
+
detach: boolean;
|
|
34
|
+
reason: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Should this invocation re-launch itself detached? Exported for tests — the
|
|
38
|
+
* decision is the whole safety argument, so it must be checkable in isolation.
|
|
39
|
+
*/
|
|
40
|
+
export declare function shouldDetach(opts: {
|
|
41
|
+
alreadyDetached: boolean;
|
|
42
|
+
noDetach: boolean;
|
|
43
|
+
isTTY: boolean;
|
|
44
|
+
dryRun: boolean;
|
|
45
|
+
}): DetachDecision;
|
|
46
|
+
/** Where the detached child streams its output (the wrapper tails this). */
|
|
47
|
+
export declare function detachLogPath(projectRoot: string, stamp: string): string;
|
|
48
|
+
/**
|
|
49
|
+
* Re-launch this same command in a new session and mirror its output.
|
|
50
|
+
*
|
|
51
|
+
* Returns the child's exit code once it finishes. If the WRAPPER is killed
|
|
52
|
+
* first (the tool-call teardown), the child simply carries on: it is in its own
|
|
53
|
+
* session, and its stdio is a file, so nothing about the wrapper's death can
|
|
54
|
+
* reach it.
|
|
55
|
+
*/
|
|
56
|
+
export declare function relaunchDetached(projectRoot: string, stamp: string): Promise<number>;
|
|
57
|
+
/** Is this process the detached child? */
|
|
58
|
+
export declare function isDetachedChild(): boolean;
|
|
59
|
+
/** True when the project dir looks writable enough to host the detach log. */
|
|
60
|
+
export declare function canHostDetachLog(projectRoot: string): boolean;
|
|
61
|
+
//# sourceMappingURL=deliver-detach.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deliver-detach.d.ts","sourceRoot":"","sources":["../../src/cli/deliver-detach.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAMH,8EAA8E;AAC9E,eAAO,MAAM,UAAU,yBAAyB,CAAC;AACjD,sDAAsD;AACtD,eAAO,MAAM,aAAa,0BAA0B,CAAC;AAErD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE;IACjC,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB,GAAG,cAAc,CAUjB;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAExE;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgD1F;AAED,0CAA0C;AAC1C,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAM7D"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A mission must outlive the tool call that started it.
|
|
3
|
+
*
|
|
4
|
+
* Coding agents run shell commands in a bounded tool call: opencode puts each
|
|
5
|
+
* `bash -c …` in its own session and kills that process group when the call ends
|
|
6
|
+
* or times out. A model that invokes `uap deliver` from its bash tool therefore
|
|
7
|
+
* spawns a long mission INSIDE a short-lived container — and when the tool call
|
|
8
|
+
* ends, the whole mission dies wherever it happened to be. Observed lifetimes on
|
|
9
|
+
* the live sandbox were 531s, 258s, 34s, 0s, 291s: not timeouts, just "whenever
|
|
10
|
+
* the tool call happened to end". Nothing landed, ever.
|
|
11
|
+
*
|
|
12
|
+
* (The autoroute hook already spawns with start_new_session=True and is immune.
|
|
13
|
+
* This closes the same hole for a model that calls deliver directly.)
|
|
14
|
+
*
|
|
15
|
+
* So deliver re-launches itself into its OWN session, which a process-group kill
|
|
16
|
+
* cannot reach, and the foreground wrapper mirrors the mission's output. If the
|
|
17
|
+
* client tears the tool call down, the wrapper dies and the MISSION KEEPS GOING —
|
|
18
|
+
* to completion, with its result recorded and resumable.
|
|
19
|
+
*
|
|
20
|
+
* Two details that matter:
|
|
21
|
+
* - The child's stdio goes to a FILE, never to a pipe held by the wrapper. A
|
|
22
|
+
* pipe whose reader is killed would hand the child EPIPE and take it down
|
|
23
|
+
* too — defeating the entire point.
|
|
24
|
+
* - An interactive run (stdout is a TTY) is left alone: a human wants live
|
|
25
|
+
* output and a working Ctrl-C. Only a captured, non-TTY invocation — which is
|
|
26
|
+
* exactly what an agent tool call looks like — is detached.
|
|
27
|
+
*/
|
|
28
|
+
import { spawn } from 'child_process';
|
|
29
|
+
import { createWriteStream, existsSync, mkdirSync, openSync, statSync, createReadStream } from 'fs';
|
|
30
|
+
import { join } from 'path';
|
|
31
|
+
/** Set on the detached child so it never re-detaches (infinite recursion). */
|
|
32
|
+
export const DETACH_ENV = 'UAP_DELIVER_DETACHED';
|
|
33
|
+
/** Escape hatch: force the old attached behaviour. */
|
|
34
|
+
export const NO_DETACH_ENV = 'UAP_DELIVER_NO_DETACH';
|
|
35
|
+
/**
|
|
36
|
+
* Should this invocation re-launch itself detached? Exported for tests — the
|
|
37
|
+
* decision is the whole safety argument, so it must be checkable in isolation.
|
|
38
|
+
*/
|
|
39
|
+
export function shouldDetach(opts) {
|
|
40
|
+
if (opts.alreadyDetached)
|
|
41
|
+
return { detach: false, reason: 'already the detached child' };
|
|
42
|
+
if (opts.noDetach)
|
|
43
|
+
return { detach: false, reason: `${NO_DETACH_ENV} is set` };
|
|
44
|
+
if (opts.dryRun)
|
|
45
|
+
return { detach: false, reason: 'a dry-run only plans; nothing to outlive' };
|
|
46
|
+
// A TTY means a human is watching: keep the foreground semantics they expect.
|
|
47
|
+
if (opts.isTTY)
|
|
48
|
+
return { detach: false, reason: 'interactive (stdout is a TTY)' };
|
|
49
|
+
return {
|
|
50
|
+
detach: true,
|
|
51
|
+
reason: 'captured stdout (an agent tool call) — the mission must outlive it',
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/** Where the detached child streams its output (the wrapper tails this). */
|
|
55
|
+
export function detachLogPath(projectRoot, stamp) {
|
|
56
|
+
return join(projectRoot, '.uap', 'deliver-logs', `deliver-${stamp}.log`);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Re-launch this same command in a new session and mirror its output.
|
|
60
|
+
*
|
|
61
|
+
* Returns the child's exit code once it finishes. If the WRAPPER is killed
|
|
62
|
+
* first (the tool-call teardown), the child simply carries on: it is in its own
|
|
63
|
+
* session, and its stdio is a file, so nothing about the wrapper's death can
|
|
64
|
+
* reach it.
|
|
65
|
+
*/
|
|
66
|
+
export async function relaunchDetached(projectRoot, stamp) {
|
|
67
|
+
const logPath = detachLogPath(projectRoot, stamp);
|
|
68
|
+
mkdirSync(join(projectRoot, '.uap', 'deliver-logs'), { recursive: true });
|
|
69
|
+
// Touch it so the tail below always has something to open.
|
|
70
|
+
createWriteStream(logPath, { flags: 'a' }).end();
|
|
71
|
+
const fd = openSync(logPath, 'a');
|
|
72
|
+
const child = spawn(process.argv[0], process.argv.slice(1), {
|
|
73
|
+
detached: true, // setsid: new session AND new process group — out of reach of a pgroup kill
|
|
74
|
+
stdio: ['ignore', fd, fd], // a FILE, never a pipe the wrapper could break
|
|
75
|
+
env: { ...process.env, [DETACH_ENV]: '1' },
|
|
76
|
+
cwd: process.cwd(),
|
|
77
|
+
});
|
|
78
|
+
child.unref();
|
|
79
|
+
console.log(`⇢ mission detached (pid ${child.pid}) so it outlives this tool call — streaming ${logPath}`);
|
|
80
|
+
// Mirror the log to our stdout for as long as we are alive.
|
|
81
|
+
return await new Promise((resolve) => {
|
|
82
|
+
let offset = 0;
|
|
83
|
+
let done = false;
|
|
84
|
+
const pump = () => {
|
|
85
|
+
let size = 0;
|
|
86
|
+
try {
|
|
87
|
+
size = statSync(logPath).size;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (size <= offset)
|
|
93
|
+
return;
|
|
94
|
+
const stream = createReadStream(logPath, { start: offset, end: size - 1, encoding: 'utf-8' });
|
|
95
|
+
offset = size;
|
|
96
|
+
stream.on('data', (chunk) => process.stdout.write(String(chunk)));
|
|
97
|
+
};
|
|
98
|
+
const timer = setInterval(pump, 400);
|
|
99
|
+
const finish = (code) => {
|
|
100
|
+
if (done)
|
|
101
|
+
return;
|
|
102
|
+
done = true;
|
|
103
|
+
clearInterval(timer);
|
|
104
|
+
setTimeout(() => {
|
|
105
|
+
pump(); // one last flush so the tail of the mission is not lost
|
|
106
|
+
resolve(code);
|
|
107
|
+
}, 500);
|
|
108
|
+
};
|
|
109
|
+
child.on('exit', (code, signal) => finish(signal ? 143 : (code ?? 0)));
|
|
110
|
+
child.on('error', () => finish(1));
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/** Is this process the detached child? */
|
|
114
|
+
export function isDetachedChild() {
|
|
115
|
+
return process.env[DETACH_ENV] === '1';
|
|
116
|
+
}
|
|
117
|
+
/** True when the project dir looks writable enough to host the detach log. */
|
|
118
|
+
export function canHostDetachLog(projectRoot) {
|
|
119
|
+
try {
|
|
120
|
+
return existsSync(projectRoot);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=deliver-detach.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deliver-detach.js","sourceRoot":"","sources":["../../src/cli/deliver-detach.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deliver.d.ts","sourceRoot":"","sources":["../../src/cli/deliver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAqBH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD,OAAO,EAA2E,KAAK,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAKjJ;;;;;;;;;;;GAWG;AACH;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;CAC1B,GAAG;IAAE,iBAAiB,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAMhF;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC9C,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,OAAO,CAAC;CAC5B,GAAG,OAAO,CAMV;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,MAAM,GAAG,IAAI,CAIhB;AAED,wBAAgB,wBAAwB,CACtC,CAAC,EAAE,gBAAgB,EACnB,iBAAiB,EAAE,OAAO,GACzB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAiBvD;
|
|
1
|
+
{"version":3,"file":"deliver.d.ts","sourceRoot":"","sources":["../../src/cli/deliver.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/deliver.js
CHANGED
|
@@ -111,6 +111,8 @@ function cfgRawEarlyForUvFactory(projectRoot) {
|
|
|
111
111
|
import { resolveSessionTokenBudget, sessionWorkingBudget, discoverModelContextWindow, CONTEXT_BUDGET_MARKER } from '../delivery/context-budget.js';
|
|
112
112
|
import { orchestrate } from '../delivery/task-orchestrator.js';
|
|
113
113
|
import { preflightProject, formatPreflightFailure } from '../delivery/project-preflight.js';
|
|
114
|
+
import { installRunExitRecorder } from '../delivery/run-exit.js';
|
|
115
|
+
import { shouldDetach, relaunchDetached, isDetachedChild, canHostDetachLog, NO_DETACH_ENV, } from './deliver-detach.js';
|
|
114
116
|
import { extractContract } from '../delivery/contract-extractor.js';
|
|
115
117
|
import { completeDeliveryTask, openDeliveryTask, recordDeliveryOutcome, recordOrchestratorTaskOutcome, reopenDeliveryTask } from '../delivery/task-sync.js';
|
|
116
118
|
import { autoMineHaloTraces, summarizeWeaknesses, weaknessGuidance, loadPersistedWeaknesses } from '../delivery/auto-mine.js';
|
|
@@ -370,6 +372,23 @@ export function acquireDeliverLock(projectRoot) {
|
|
|
370
372
|
return release;
|
|
371
373
|
}
|
|
372
374
|
export async function deliverCommand(instruction, options) {
|
|
375
|
+
// A mission must outlive the tool call that started it. An agent's bash tool
|
|
376
|
+
// is a short-lived, process-group-killed container; a model that runs
|
|
377
|
+
// `uap deliver` from it was spawning a long mission inside a short one, and
|
|
378
|
+
// the mission died wherever it happened to be when the call ended. Re-launch
|
|
379
|
+
// into our own session first, then mirror the output (see deliver-detach.ts).
|
|
380
|
+
const projectRootForDetach = resolve(options.projectRoot ?? process.cwd());
|
|
381
|
+
const decision = shouldDetach({
|
|
382
|
+
alreadyDetached: isDetachedChild(),
|
|
383
|
+
noDetach: process.env[NO_DETACH_ENV] === '1',
|
|
384
|
+
isTTY: Boolean(process.stdout.isTTY),
|
|
385
|
+
dryRun: Boolean(options.dryRun),
|
|
386
|
+
});
|
|
387
|
+
if (decision.detach && canHostDetachLog(projectRootForDetach)) {
|
|
388
|
+
const stamp = new Date().toISOString().replace(/[-:.]/g, '').slice(0, 15);
|
|
389
|
+
process.exitCode = await relaunchDetached(projectRootForDetach, stamp);
|
|
390
|
+
return;
|
|
391
|
+
}
|
|
373
392
|
try {
|
|
374
393
|
await runDeliver(instruction, options);
|
|
375
394
|
}
|
|
@@ -1425,6 +1444,7 @@ async function runDeliver(instruction, options) {
|
|
|
1425
1444
|
projectRoot,
|
|
1426
1445
|
status: 'running',
|
|
1427
1446
|
pid: process.pid,
|
|
1447
|
+
ppid: process.ppid,
|
|
1428
1448
|
createdAt: resumeState?.createdAt ?? new Date().toISOString(),
|
|
1429
1449
|
updatedAt: new Date().toISOString(),
|
|
1430
1450
|
checkpoint: resumeState?.checkpoint,
|
|
@@ -1433,6 +1453,11 @@ async function runDeliver(instruction, options) {
|
|
|
1433
1453
|
phaseSummaries: [...phaseSummaries],
|
|
1434
1454
|
};
|
|
1435
1455
|
saveRunState(runState);
|
|
1456
|
+
// From here on the process records its own death (signal + parent pid). A run
|
|
1457
|
+
// that dies leaves status:'running' behind on purpose — that is what --resume
|
|
1458
|
+
// looks for — but nothing recorded HOW it died, so a mission killed by its
|
|
1459
|
+
// parent was indistinguishable from one still working.
|
|
1460
|
+
const disposeExitRecorder = installRunExitRecorder(projectRoot, runId);
|
|
1436
1461
|
// Persist loop state after every turn so this run survives interruption.
|
|
1437
1462
|
loopConfig.onCheckpoint = (cp) => {
|
|
1438
1463
|
runState.checkpoint = cp;
|
|
@@ -1966,6 +1991,9 @@ async function runDeliver(instruction, options) {
|
|
|
1966
1991
|
delete process.env.UAP_DELIVER_ACTIVE;
|
|
1967
1992
|
else
|
|
1968
1993
|
process.env.UAP_DELIVER_ACTIVE = priorDeliverActive;
|
|
1994
|
+
// The loop is over: from here a normal exit is expected, so stop treating a
|
|
1995
|
+
// signal as a mystery death.
|
|
1996
|
+
disposeExitRecorder();
|
|
1969
1997
|
}
|
|
1970
1998
|
// --keep-best: if deliver left the project worse than it started (by real
|
|
1971
1999
|
// gate score), roll back to the snapshot so the run is never a regression.
|