@miller-tech/uap 1.93.1 → 1.95.0
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/benchmarks/benchmark.d.ts +4 -4
- package/dist/benchmarks/paired/types.d.ts +2 -2
- package/dist/bin/cli.js +12 -2
- package/dist/bin/cli.js.map +1 -1
- package/dist/cli/deliver.d.ts +5 -0
- package/dist/cli/deliver.d.ts.map +1 -1
- package/dist/cli/deliver.js +232 -12
- package/dist/cli/deliver.js.map +1 -1
- package/dist/cli/task.d.ts +1 -1
- package/dist/cli/task.d.ts.map +1 -1
- package/dist/cli/task.js +33 -0
- package/dist/cli/task.js.map +1 -1
- package/dist/coordination/reactor.d.ts.map +1 -1
- package/dist/coordination/reactor.js +14 -0
- package/dist/coordination/reactor.js.map +1 -1
- package/dist/delivery/applier.d.ts.map +1 -1
- package/dist/delivery/applier.js +3 -0
- package/dist/delivery/applier.js.map +1 -1
- package/dist/delivery/auto-mine.d.ts +27 -0
- package/dist/delivery/auto-mine.d.ts.map +1 -0
- package/dist/delivery/auto-mine.js +73 -0
- package/dist/delivery/auto-mine.js.map +1 -0
- package/dist/delivery/auto-optimizer.d.ts +6 -2
- package/dist/delivery/auto-optimizer.d.ts.map +1 -1
- package/dist/delivery/auto-optimizer.js +12 -5
- package/dist/delivery/auto-optimizer.js.map +1 -1
- package/dist/delivery/convergence-loop.d.ts +45 -0
- package/dist/delivery/convergence-loop.d.ts.map +1 -1
- package/dist/delivery/convergence-loop.js +81 -2
- package/dist/delivery/convergence-loop.js.map +1 -1
- package/dist/delivery/decompose.d.ts +45 -0
- package/dist/delivery/decompose.d.ts.map +1 -0
- package/dist/delivery/decompose.js +122 -0
- package/dist/delivery/decompose.js.map +1 -0
- package/dist/delivery/escalation.d.ts +2 -0
- package/dist/delivery/escalation.d.ts.map +1 -1
- package/dist/delivery/escalation.js +5 -0
- package/dist/delivery/escalation.js.map +1 -1
- package/dist/delivery/index.d.ts +5 -1
- package/dist/delivery/index.d.ts.map +1 -1
- package/dist/delivery/index.js +4 -0
- package/dist/delivery/index.js.map +1 -1
- package/dist/delivery/run-state.d.ts +44 -0
- package/dist/delivery/run-state.d.ts.map +1 -0
- package/dist/delivery/run-state.js +137 -0
- package/dist/delivery/run-state.js.map +1 -0
- package/dist/delivery/task-sync.d.ts +47 -0
- package/dist/delivery/task-sync.d.ts.map +1 -0
- package/dist/delivery/task-sync.js +148 -0
- package/dist/delivery/task-sync.js.map +1 -0
- package/dist/mcp-router/tools/deliver.d.ts +48 -0
- package/dist/mcp-router/tools/deliver.d.ts.map +1 -1
- package/dist/mcp-router/tools/deliver.js +64 -4
- package/dist/mcp-router/tools/deliver.js.map +1 -1
- package/dist/observability/halo-exporter.d.ts +4 -3
- package/dist/observability/halo-exporter.d.ts.map +1 -1
- package/dist/observability/halo-exporter.js +9 -5
- package/dist/observability/halo-exporter.js.map +1 -1
- package/dist/state/manifest.d.ts +34 -0
- package/dist/state/manifest.d.ts.map +1 -0
- package/dist/state/manifest.js +152 -0
- package/dist/state/manifest.js.map +1 -0
- package/dist/state/reactor-inject.d.ts +14 -0
- package/dist/state/reactor-inject.d.ts.map +1 -0
- package/dist/state/reactor-inject.js +25 -0
- package/dist/state/reactor-inject.js.map +1 -0
- package/dist/tasks/service.d.ts +7 -0
- package/dist/tasks/service.d.ts.map +1 -1
- package/dist/tasks/service.js +23 -0
- package/dist/tasks/service.js.map +1 -1
- package/package.json +1 -1
- package/src/policies/enforcers/__pycache__/_common.cpython-312.pyc +0 -0
- package/src/policies/enforcers/delivery_enforcement.py +1 -1
- package/templates/hooks/deliver_autoroute.py +60 -10
- package/tools/agents/scripts/__pycache__/toolcall_path_normalizer.cpython-312.pyc +0 -0
- package/tools/agents/scripts/anthropic_proxy.py +106 -17
- package/tools/agents/tests/test_anthropic_proxy_streaming.py +8 -3
- package/tools/agents/tests/test_overflow_truncate_count_tokens.py +112 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable Delivery Runs — persist convergence-loop state across process
|
|
3
|
+
* boundaries so very long missions survive interruption (crash, timeout,
|
|
4
|
+
* operator stop) and resume exactly where they left off.
|
|
5
|
+
*
|
|
6
|
+
* One directory per run under `<projectRoot>/.uap/deliver-runs/<runId>/` with
|
|
7
|
+
* a single `state.json`: run metadata + the loop's last LoopCheckpoint (and,
|
|
8
|
+
* for decomposed runs, the phase plan + cursor). Writes are atomic
|
|
9
|
+
* (tmp + rename) and fail-soft — persistence must never break a run.
|
|
10
|
+
*/
|
|
11
|
+
import type { LoopCheckpoint } from './convergence-loop.js';
|
|
12
|
+
import type { DeliveryPhase } from './decompose.js';
|
|
13
|
+
export type DeliverRunStatus = 'running' | 'delivered' | 'failed' | 'interrupted';
|
|
14
|
+
export interface DeliverRunState {
|
|
15
|
+
runId: string;
|
|
16
|
+
instruction: string;
|
|
17
|
+
presetId: string;
|
|
18
|
+
projectRoot: string;
|
|
19
|
+
status: DeliverRunStatus;
|
|
20
|
+
createdAt: string;
|
|
21
|
+
updatedAt: string;
|
|
22
|
+
/** Loop state after the last completed turn (absent before turn 1). */
|
|
23
|
+
checkpoint?: LoopCheckpoint;
|
|
24
|
+
/** Decomposed missions: the phase plan and the index of the phase in flight. */
|
|
25
|
+
phases?: DeliveryPhase[];
|
|
26
|
+
phaseIndex?: number;
|
|
27
|
+
/** One-line summaries of completed phases (harness-owned, injected into later phases). */
|
|
28
|
+
phaseSummaries?: string[];
|
|
29
|
+
/** Task-DB id opened for this mission, so --resume reuses it instead of duplicating. */
|
|
30
|
+
taskId?: string;
|
|
31
|
+
}
|
|
32
|
+
export declare function deliverRunsDir(projectRoot: string): string;
|
|
33
|
+
export declare function newRunId(): string;
|
|
34
|
+
/** Run ids are path components; refuse anything that is not a plain slug. */
|
|
35
|
+
export declare function isValidRunId(id: string): boolean;
|
|
36
|
+
/** Persist run state atomically. Fail-soft: returns false on any error. */
|
|
37
|
+
export declare function saveRunState(state: DeliverRunState): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Load a run for resumption. `'latest'` resolves to the most recently updated
|
|
40
|
+
* non-delivered run (an interrupted process leaves status 'running' behind —
|
|
41
|
+
* that IS the resumable state). Returns null when nothing resumable exists.
|
|
42
|
+
*/
|
|
43
|
+
export declare function loadRunState(projectRoot: string, runId: string): DeliverRunState | null;
|
|
44
|
+
//# sourceMappingURL=run-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-state.d.ts","sourceRoot":"","sources":["../../src/delivery/run-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,aAAa,CAAC;AAElF,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,gBAAgB,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,gFAAgF;IAChF,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0FAA0F;IAC1F,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,QAAQ,IAAI,MAAM,CAGjC;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAY5D;AA4DD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAqBvF"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable Delivery Runs — persist convergence-loop state across process
|
|
3
|
+
* boundaries so very long missions survive interruption (crash, timeout,
|
|
4
|
+
* operator stop) and resume exactly where they left off.
|
|
5
|
+
*
|
|
6
|
+
* One directory per run under `<projectRoot>/.uap/deliver-runs/<runId>/` with
|
|
7
|
+
* a single `state.json`: run metadata + the loop's last LoopCheckpoint (and,
|
|
8
|
+
* for decomposed runs, the phase plan + cursor). Writes are atomic
|
|
9
|
+
* (tmp + rename) and fail-soft — persistence must never break a run.
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, writeFileSync } from 'fs';
|
|
12
|
+
import { join } from 'path';
|
|
13
|
+
import { randomBytes } from 'crypto';
|
|
14
|
+
export function deliverRunsDir(projectRoot) {
|
|
15
|
+
return join(projectRoot, '.uap', 'deliver-runs');
|
|
16
|
+
}
|
|
17
|
+
export function newRunId() {
|
|
18
|
+
const stamp = new Date().toISOString().replace(/[-:]/g, '').replace(/\..+/, '');
|
|
19
|
+
return `run-${stamp}-${randomBytes(3).toString('hex')}`;
|
|
20
|
+
}
|
|
21
|
+
/** Run ids are path components; refuse anything that is not a plain slug. */
|
|
22
|
+
export function isValidRunId(id) {
|
|
23
|
+
return /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/.test(id) && !id.includes('..');
|
|
24
|
+
}
|
|
25
|
+
/** Persist run state atomically. Fail-soft: returns false on any error. */
|
|
26
|
+
export function saveRunState(state) {
|
|
27
|
+
try {
|
|
28
|
+
const dir = join(deliverRunsDir(state.projectRoot), state.runId);
|
|
29
|
+
mkdirSync(dir, { recursive: true });
|
|
30
|
+
const path = join(dir, 'state.json');
|
|
31
|
+
const tmp = `${path}.tmp`;
|
|
32
|
+
writeFileSync(tmp, JSON.stringify({ ...state, updatedAt: new Date().toISOString() }, null, 2), 'utf-8');
|
|
33
|
+
renameSync(tmp, path);
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const VALID_STATUSES = new Set(['running', 'delivered', 'failed', 'interrupted']);
|
|
41
|
+
const MAX_INSTRUCTION_CHARS = 8000;
|
|
42
|
+
const MAX_PHASES = 5;
|
|
43
|
+
const MAX_SUMMARY_CHARS = 300;
|
|
44
|
+
/**
|
|
45
|
+
* Read + SANITIZE a persisted run state. The state file lives inside the
|
|
46
|
+
* target project tree, i.e. on the untrusted side of the boundary (a generator
|
|
47
|
+
* model or repo content could seed one), so nothing loaded here is trusted:
|
|
48
|
+
* the runId is forced back to the validated directory name (a planted
|
|
49
|
+
* traversal runId would otherwise steer every later save), text fields are
|
|
50
|
+
* length-clamped, phases re-validated against the planner's own limits, and
|
|
51
|
+
* unknown statuses rejected.
|
|
52
|
+
*/
|
|
53
|
+
function readState(projectRoot, runId) {
|
|
54
|
+
try {
|
|
55
|
+
const path = join(deliverRunsDir(projectRoot), runId, 'state.json');
|
|
56
|
+
if (!existsSync(path))
|
|
57
|
+
return null;
|
|
58
|
+
const parsed = JSON.parse(readFileSync(path, 'utf-8'));
|
|
59
|
+
if (!parsed || typeof parsed.instruction !== 'string' || !parsed.instruction.trim()) {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
if (!VALID_STATUSES.has(parsed.status))
|
|
63
|
+
return null;
|
|
64
|
+
// The directory name is the validated identity; never trust the embedded id.
|
|
65
|
+
parsed.runId = runId;
|
|
66
|
+
parsed.projectRoot = projectRoot;
|
|
67
|
+
parsed.instruction = parsed.instruction.slice(0, MAX_INSTRUCTION_CHARS);
|
|
68
|
+
if (typeof parsed.updatedAt !== 'string' || Number.isNaN(Date.parse(parsed.updatedAt))) {
|
|
69
|
+
parsed.updatedAt = new Date(0).toISOString(); // sorts last for 'latest'
|
|
70
|
+
}
|
|
71
|
+
if (parsed.phases !== undefined) {
|
|
72
|
+
if (!Array.isArray(parsed.phases))
|
|
73
|
+
return null;
|
|
74
|
+
const phases = [];
|
|
75
|
+
for (const ph of parsed.phases.slice(0, MAX_PHASES)) {
|
|
76
|
+
if (typeof ph !== 'object' || ph === null)
|
|
77
|
+
return null;
|
|
78
|
+
const { id, title, goal } = ph;
|
|
79
|
+
if (typeof id !== 'string' || typeof title !== 'string' || typeof goal !== 'string')
|
|
80
|
+
return null;
|
|
81
|
+
if (!/^[a-z0-9][a-z0-9-]{0,47}$/.test(id))
|
|
82
|
+
return null;
|
|
83
|
+
phases.push({ id, title: title.slice(0, 120), goal: goal.slice(0, 600) });
|
|
84
|
+
}
|
|
85
|
+
parsed.phases = phases;
|
|
86
|
+
}
|
|
87
|
+
if (parsed.phaseSummaries !== undefined) {
|
|
88
|
+
if (!Array.isArray(parsed.phaseSummaries))
|
|
89
|
+
return null;
|
|
90
|
+
parsed.phaseSummaries = parsed.phaseSummaries
|
|
91
|
+
.slice(0, MAX_PHASES * 2)
|
|
92
|
+
.filter((x) => typeof x === 'string')
|
|
93
|
+
.map((x) => x.slice(0, MAX_SUMMARY_CHARS));
|
|
94
|
+
}
|
|
95
|
+
if (parsed.taskId !== undefined && (typeof parsed.taskId !== 'string' || !/^uap-[0-9a-f]{8}$/.test(parsed.taskId))) {
|
|
96
|
+
delete parsed.taskId;
|
|
97
|
+
}
|
|
98
|
+
return parsed;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Load a run for resumption. `'latest'` resolves to the most recently updated
|
|
106
|
+
* non-delivered run (an interrupted process leaves status 'running' behind —
|
|
107
|
+
* that IS the resumable state). Returns null when nothing resumable exists.
|
|
108
|
+
*/
|
|
109
|
+
export function loadRunState(projectRoot, runId) {
|
|
110
|
+
if (runId !== 'latest') {
|
|
111
|
+
if (!isValidRunId(runId))
|
|
112
|
+
return null;
|
|
113
|
+
return readState(projectRoot, runId);
|
|
114
|
+
}
|
|
115
|
+
const dir = deliverRunsDir(projectRoot);
|
|
116
|
+
if (!existsSync(dir))
|
|
117
|
+
return null;
|
|
118
|
+
let entries;
|
|
119
|
+
try {
|
|
120
|
+
entries = readdirSync(dir);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
let best = null;
|
|
126
|
+
for (const id of entries) {
|
|
127
|
+
if (!isValidRunId(id))
|
|
128
|
+
continue;
|
|
129
|
+
const state = readState(projectRoot, id);
|
|
130
|
+
if (!state || state.status === 'delivered')
|
|
131
|
+
continue;
|
|
132
|
+
if (!best || state.updatedAt > best.updatedAt)
|
|
133
|
+
best = state;
|
|
134
|
+
}
|
|
135
|
+
return best;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=run-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-state.js","sourceRoot":"","sources":["../../src/delivery/run-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delivery ↔ Task/Memory sync — every `uap deliver` run leaves a durable,
|
|
3
|
+
* queryable trail: a task in the project's task DB (opened in_progress at run
|
|
4
|
+
* start, closed on success, reopened-with-notes on failure) and a structured
|
|
5
|
+
* `decision`/`lesson` short-term memory entry describing the outcome.
|
|
6
|
+
*
|
|
7
|
+
* This is how the memory/task system becomes the live "what is actually
|
|
8
|
+
* happening / what actually happened" record instead of a stale import:
|
|
9
|
+
* agents read `uap task ready` + `uap memory query` and see real deliveries.
|
|
10
|
+
*
|
|
11
|
+
* Everything here is fail-soft by contract: task/memory persistence must
|
|
12
|
+
* never block or break a delivery.
|
|
13
|
+
*/
|
|
14
|
+
import type { DeliveryResult } from './convergence-loop.js';
|
|
15
|
+
export interface DeliveryTaskHandle {
|
|
16
|
+
id: string;
|
|
17
|
+
/** Kept so completion reuses the same service/DB the open call bound to. */
|
|
18
|
+
service: import('../tasks/service.js').TaskService;
|
|
19
|
+
}
|
|
20
|
+
/** Only sync tasks for projects that already track tasks — never scaffold a
|
|
21
|
+
* task DB into an arbitrary target repo as a side effect of a delivery. */
|
|
22
|
+
export declare function hasTaskDb(projectRoot: string): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Open (and claim) a task for this delivery run. Returns null when the
|
|
25
|
+
* project has no task DB or anything fails.
|
|
26
|
+
*/
|
|
27
|
+
export declare function openDeliveryTask(instruction: string, projectRoot: string, parentId?: string): Promise<DeliveryTaskHandle | null>;
|
|
28
|
+
/**
|
|
29
|
+
* Re-bind to an existing mission task on --resume (instead of opening a
|
|
30
|
+
* duplicate) and mark it active again. Returns null when the task or DB is
|
|
31
|
+
* gone — callers fall back to leaving the trail incomplete rather than failing.
|
|
32
|
+
*/
|
|
33
|
+
export declare function reopenDeliveryTask(taskId: string, projectRoot: string): Promise<DeliveryTaskHandle | null>;
|
|
34
|
+
/**
|
|
35
|
+
* Record the run's outcome on its task: close as done on success; on failure
|
|
36
|
+
* reopen (status 'open') with the failure context in notes so the work
|
|
37
|
+
* surfaces in `uap task ready` instead of rotting as in_progress.
|
|
38
|
+
*/
|
|
39
|
+
export declare function completeDeliveryTask(handle: DeliveryTaskHandle | null, result: DeliveryResult): void;
|
|
40
|
+
/**
|
|
41
|
+
* Record a structured outcome memory (`decision` on success, `lesson` on
|
|
42
|
+
* failure) so future sessions see what was actually built and how it went —
|
|
43
|
+
* not just session-end heartbeats. Only writes when the project already has
|
|
44
|
+
* a short-term memory DB (never scaffolds one into a target repo).
|
|
45
|
+
*/
|
|
46
|
+
export declare function recordDeliveryOutcome(instruction: string, projectRoot: string, result: DeliveryResult, modelId: string): Promise<void>;
|
|
47
|
+
//# sourceMappingURL=task-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-sync.d.ts","sourceRoot":"","sources":["../../src/delivery/task-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,4EAA4E;IAC5E,OAAO,EAAE,OAAO,qBAAqB,EAAE,WAAW,CAAC;CACpD;AAMD;2EAC2E;AAC3E,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAEtD;AAsBD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAkBpC;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAapC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,kBAAkB,GAAG,IAAI,EACjC,MAAM,EAAE,cAAc,GACrB,IAAI,CAmBN;AAMD;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAiBf"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delivery ↔ Task/Memory sync — every `uap deliver` run leaves a durable,
|
|
3
|
+
* queryable trail: a task in the project's task DB (opened in_progress at run
|
|
4
|
+
* start, closed on success, reopened-with-notes on failure) and a structured
|
|
5
|
+
* `decision`/`lesson` short-term memory entry describing the outcome.
|
|
6
|
+
*
|
|
7
|
+
* This is how the memory/task system becomes the live "what is actually
|
|
8
|
+
* happening / what actually happened" record instead of a stale import:
|
|
9
|
+
* agents read `uap task ready` + `uap memory query` and see real deliveries.
|
|
10
|
+
*
|
|
11
|
+
* Everything here is fail-soft by contract: task/memory persistence must
|
|
12
|
+
* never block or break a delivery.
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync } from 'fs';
|
|
15
|
+
import { join } from 'path';
|
|
16
|
+
function taskDbPath(projectRoot) {
|
|
17
|
+
return join(projectRoot, '.uap', 'tasks', 'tasks.db');
|
|
18
|
+
}
|
|
19
|
+
/** Only sync tasks for projects that already track tasks — never scaffold a
|
|
20
|
+
* task DB into an arbitrary target repo as a side effect of a delivery. */
|
|
21
|
+
export function hasTaskDb(projectRoot) {
|
|
22
|
+
return existsSync(taskDbPath(projectRoot));
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* TaskDatabase is a process-wide singleton keyed by the FIRST dbPath opened;
|
|
26
|
+
* if some other DB is already bound in this process, writing "here" would
|
|
27
|
+
* silently land in the wrong project. Verify the binding and skip sync when
|
|
28
|
+
* it doesn't match. Fail-soft: verification errors mean "don't sync".
|
|
29
|
+
*/
|
|
30
|
+
async function taskDbBindsTo(projectRoot) {
|
|
31
|
+
try {
|
|
32
|
+
const { TaskDatabase } = await import('../tasks/database.js');
|
|
33
|
+
const { realpathSync } = await import('fs');
|
|
34
|
+
const db = TaskDatabase.getInstance(taskDbPath(projectRoot)).getDatabase();
|
|
35
|
+
const list = db.pragma('database_list');
|
|
36
|
+
const main = list.find((d) => d.name === 'main');
|
|
37
|
+
if (!main?.file)
|
|
38
|
+
return false;
|
|
39
|
+
return realpathSync(main.file) === realpathSync(taskDbPath(projectRoot));
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Open (and claim) a task for this delivery run. Returns null when the
|
|
47
|
+
* project has no task DB or anything fails.
|
|
48
|
+
*/
|
|
49
|
+
export async function openDeliveryTask(instruction, projectRoot, parentId) {
|
|
50
|
+
if (!hasTaskDb(projectRoot))
|
|
51
|
+
return null;
|
|
52
|
+
if (!(await taskDbBindsTo(projectRoot)))
|
|
53
|
+
return null;
|
|
54
|
+
try {
|
|
55
|
+
const { TaskService } = await import('../tasks/service.js');
|
|
56
|
+
const service = new TaskService({ dbPath: taskDbPath(projectRoot), agentId: 'uap-deliver' });
|
|
57
|
+
const task = service.create({
|
|
58
|
+
title: `deliver: ${instruction.slice(0, 100)}`,
|
|
59
|
+
description: instruction.slice(0, 2000),
|
|
60
|
+
type: 'task',
|
|
61
|
+
labels: ['deliver'],
|
|
62
|
+
parentId,
|
|
63
|
+
});
|
|
64
|
+
service.update(task.id, { status: 'in_progress', assignee: 'uap-deliver' });
|
|
65
|
+
return { id: task.id, service };
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Re-bind to an existing mission task on --resume (instead of opening a
|
|
73
|
+
* duplicate) and mark it active again. Returns null when the task or DB is
|
|
74
|
+
* gone — callers fall back to leaving the trail incomplete rather than failing.
|
|
75
|
+
*/
|
|
76
|
+
export async function reopenDeliveryTask(taskId, projectRoot) {
|
|
77
|
+
if (!hasTaskDb(projectRoot))
|
|
78
|
+
return null;
|
|
79
|
+
if (!(await taskDbBindsTo(projectRoot)))
|
|
80
|
+
return null;
|
|
81
|
+
try {
|
|
82
|
+
const { TaskService } = await import('../tasks/service.js');
|
|
83
|
+
const service = new TaskService({ dbPath: taskDbPath(projectRoot), agentId: 'uap-deliver' });
|
|
84
|
+
const task = service.get(taskId);
|
|
85
|
+
if (!task)
|
|
86
|
+
return null;
|
|
87
|
+
service.update(taskId, { status: 'in_progress', assignee: 'uap-deliver' });
|
|
88
|
+
return { id: taskId, service };
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Record the run's outcome on its task: close as done on success; on failure
|
|
96
|
+
* reopen (status 'open') with the failure context in notes so the work
|
|
97
|
+
* surfaces in `uap task ready` instead of rotting as in_progress.
|
|
98
|
+
*/
|
|
99
|
+
export function completeDeliveryTask(handle, result) {
|
|
100
|
+
if (!handle)
|
|
101
|
+
return;
|
|
102
|
+
try {
|
|
103
|
+
if (result.success) {
|
|
104
|
+
handle.service.close(handle.id, result.alreadyDelivered
|
|
105
|
+
? 'already delivered (baseline green)'
|
|
106
|
+
: `delivered in ${result.turns} turn(s)`);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
handle.service.update(handle.id, {
|
|
110
|
+
status: 'open',
|
|
111
|
+
notes: `deliver failed after ${result.turns} turn(s); best ${Math.round(result.bestScore * 100)}% of gates (turn ${result.bestTurn}). ${result.finalFeedback.slice(0, 500)}`,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// task sync is best-effort
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function memoryDbPath(projectRoot) {
|
|
120
|
+
return join(projectRoot, 'agents', 'data', 'memory', 'short_term.db');
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Record a structured outcome memory (`decision` on success, `lesson` on
|
|
124
|
+
* failure) so future sessions see what was actually built and how it went —
|
|
125
|
+
* not just session-end heartbeats. Only writes when the project already has
|
|
126
|
+
* a short-term memory DB (never scaffolds one into a target repo).
|
|
127
|
+
*/
|
|
128
|
+
export async function recordDeliveryOutcome(instruction, projectRoot, result, modelId) {
|
|
129
|
+
if (!existsSync(memoryDbPath(projectRoot)))
|
|
130
|
+
return;
|
|
131
|
+
try {
|
|
132
|
+
const { SQLiteShortTermMemory } = await import('../memory/short-term/sqlite.js');
|
|
133
|
+
const memory = new SQLiteShortTermMemory({ dbPath: memoryDbPath(projectRoot) });
|
|
134
|
+
const type = result.success ? 'decision' : 'lesson';
|
|
135
|
+
const verdict = result.success
|
|
136
|
+
? result.alreadyDelivered
|
|
137
|
+
? 'already delivered (baseline green)'
|
|
138
|
+
: `delivered in ${result.turns} turn(s)`
|
|
139
|
+
: `NOT delivered after ${result.turns} turn(s), best ${Math.round(result.bestScore * 100)}% of gates`;
|
|
140
|
+
const content = `[deliver] ${verdict} — model ${modelId} — task: ${instruction.slice(0, 300)}`;
|
|
141
|
+
await memory.store(type, content, result.success ? 6 : 7);
|
|
142
|
+
await memory.close?.();
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// memory recording is best-effort
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=task-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-sync.js","sourceRoot":"","sources":["../../src/delivery/task-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,6 +38,22 @@ export interface DeliverArgs {
|
|
|
38
38
|
dryRun?: boolean;
|
|
39
39
|
/** Hard wall-clock cap in seconds (default 1800) */
|
|
40
40
|
timeoutSec?: number;
|
|
41
|
+
/** Judge spec behavioral completeness (LLM) after objective gates pass */
|
|
42
|
+
acceptance?: boolean;
|
|
43
|
+
/** Separate evaluator model preset (generator never grades its own work) */
|
|
44
|
+
evaluatorModel?: string;
|
|
45
|
+
/** Escalation ladder on stagnation (widen → critic → reseed → stronger model) */
|
|
46
|
+
escalate?: boolean;
|
|
47
|
+
/** Register/announce/heartbeat via the coordination layer */
|
|
48
|
+
coordinate?: boolean;
|
|
49
|
+
/** Loop past maxTurns to a ceiling until every gate passes (CLI default: on) */
|
|
50
|
+
untilDelivered?: boolean;
|
|
51
|
+
/** Hard turn ceiling for untilDelivered (1-50) */
|
|
52
|
+
ceiling?: number;
|
|
53
|
+
/** Resume an interrupted durable run: a run id or 'latest' */
|
|
54
|
+
resume?: string;
|
|
55
|
+
/** Decompose the mission into sequential phases (auto for long complex tasks) */
|
|
56
|
+
decompose?: boolean;
|
|
41
57
|
}
|
|
42
58
|
export declare const DELIVER_TOOL_DEFINITION: {
|
|
43
59
|
name: string;
|
|
@@ -70,6 +86,38 @@ export declare const DELIVER_TOOL_DEFINITION: {
|
|
|
70
86
|
type: string;
|
|
71
87
|
description: string;
|
|
72
88
|
};
|
|
89
|
+
acceptance: {
|
|
90
|
+
type: string;
|
|
91
|
+
description: string;
|
|
92
|
+
};
|
|
93
|
+
evaluatorModel: {
|
|
94
|
+
type: string;
|
|
95
|
+
description: string;
|
|
96
|
+
};
|
|
97
|
+
escalate: {
|
|
98
|
+
type: string;
|
|
99
|
+
description: string;
|
|
100
|
+
};
|
|
101
|
+
coordinate: {
|
|
102
|
+
type: string;
|
|
103
|
+
description: string;
|
|
104
|
+
};
|
|
105
|
+
untilDelivered: {
|
|
106
|
+
type: string;
|
|
107
|
+
description: string;
|
|
108
|
+
};
|
|
109
|
+
ceiling: {
|
|
110
|
+
type: string;
|
|
111
|
+
description: string;
|
|
112
|
+
};
|
|
113
|
+
resume: {
|
|
114
|
+
type: string;
|
|
115
|
+
description: string;
|
|
116
|
+
};
|
|
117
|
+
decompose: {
|
|
118
|
+
type: string;
|
|
119
|
+
description: string;
|
|
120
|
+
};
|
|
73
121
|
};
|
|
74
122
|
required: string[];
|
|
75
123
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deliver.d.ts","sourceRoot":"","sources":["../../../src/mcp-router/tools/deliver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;
|
|
1
|
+
{"version":3,"file":"deliver.d.ts","sourceRoot":"","sources":["../../../src/mcp-router/tools/deliver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAQH,MAAM,WAAW,WAAW;IAC1B,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gFAAgF;IAChF,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwEnC,CAAC;AAwDF;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAyBvD;AAsBD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC;IAChB,yFAAyF;IACzF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CA4FvE;AAED,mEAAmE;AACnE,wBAAgB,yBAAyB,IAAI,MAAM,CAElD"}
|
|
@@ -29,6 +29,7 @@ import { execFile } from 'child_process';
|
|
|
29
29
|
import { fileURLToPath } from 'url';
|
|
30
30
|
import { dirname, resolve, sep } from 'path';
|
|
31
31
|
import { existsSync, realpathSync, statSync } from 'fs';
|
|
32
|
+
import { isValidRunId } from '../../delivery/run-state.js';
|
|
32
33
|
export const DELIVER_TOOL_DEFINITION = {
|
|
33
34
|
name: 'deliver',
|
|
34
35
|
description: `Autonomously build-and-verify a non-trivial coding task using the convergence loop (uap deliver).
|
|
@@ -66,6 +67,38 @@ Best for: implement a feature, fix a bug across files, refactor with tests. Not
|
|
|
66
67
|
type: 'number',
|
|
67
68
|
description: 'Hard wall-clock cap in seconds (default 1800)',
|
|
68
69
|
},
|
|
70
|
+
acceptance: {
|
|
71
|
+
type: 'boolean',
|
|
72
|
+
description: 'After objective gates pass, judge spec behavioral completeness (LLM) and iterate on unmet requirements (auto-on for moderate/complex tasks)',
|
|
73
|
+
},
|
|
74
|
+
evaluatorModel: {
|
|
75
|
+
type: 'string',
|
|
76
|
+
description: 'Model preset that AUTHORS + JUDGES acceptance, separate from the generator',
|
|
77
|
+
},
|
|
78
|
+
escalate: {
|
|
79
|
+
type: 'boolean',
|
|
80
|
+
description: 'Escalation ladder on stagnation: widen exploration → critic → reseed ideation → stronger model',
|
|
81
|
+
},
|
|
82
|
+
coordinate: {
|
|
83
|
+
type: 'boolean',
|
|
84
|
+
description: 'Register the run with the coordination layer (announce, heartbeat, overlap detection)',
|
|
85
|
+
},
|
|
86
|
+
untilDelivered: {
|
|
87
|
+
type: 'boolean',
|
|
88
|
+
description: 'Loop past maxTurns to a hard ceiling until every gate passes (default: on; false disables)',
|
|
89
|
+
},
|
|
90
|
+
ceiling: {
|
|
91
|
+
type: 'number',
|
|
92
|
+
description: 'Hard turn ceiling for untilDelivered, 1-50 (default 30)',
|
|
93
|
+
},
|
|
94
|
+
resume: {
|
|
95
|
+
type: 'string',
|
|
96
|
+
description: "Resume an interrupted durable run: a run id or 'latest'",
|
|
97
|
+
},
|
|
98
|
+
decompose: {
|
|
99
|
+
type: 'boolean',
|
|
100
|
+
description: 'Decompose the mission into sequential phases, each converged by its own loop (auto for long complex tasks; false disables)',
|
|
101
|
+
},
|
|
69
102
|
},
|
|
70
103
|
required: ['instruction'],
|
|
71
104
|
},
|
|
@@ -191,9 +224,9 @@ function resolveCliEntry() {
|
|
|
191
224
|
* aids, gates, test protection) is handled by deliver itself.
|
|
192
225
|
*/
|
|
193
226
|
export function handleDeliver(args) {
|
|
194
|
-
const { instruction, projectRoot, maxTurns, model, dryRun = false, timeoutSec } = args;
|
|
195
|
-
if (!instruction || !instruction.trim()) {
|
|
196
|
-
return Promise.resolve({ ok: false, dryRun, error: 'instruction is required' });
|
|
227
|
+
const { instruction, projectRoot, maxTurns, model, dryRun = false, timeoutSec, acceptance, evaluatorModel, escalate, coordinate, untilDelivered, ceiling, resume, decompose, } = args;
|
|
228
|
+
if ((!instruction || !instruction.trim()) && !resume) {
|
|
229
|
+
return Promise.resolve({ ok: false, dryRun, error: 'instruction is required (or pass resume)' });
|
|
197
230
|
}
|
|
198
231
|
if (maxTurns !== undefined && (!Number.isInteger(maxTurns) || maxTurns < 1 || maxTurns > MAX_TURNS_LIMIT)) {
|
|
199
232
|
return Promise.resolve({ ok: false, dryRun, error: `maxTurns must be an integer 1-${MAX_TURNS_LIMIT}` });
|
|
@@ -204,6 +237,15 @@ export function handleDeliver(args) {
|
|
|
204
237
|
if (model !== undefined && !/^[A-Za-z0-9._-]+$/.test(model)) {
|
|
205
238
|
return Promise.resolve({ ok: false, dryRun, error: 'model must be a plain preset id' });
|
|
206
239
|
}
|
|
240
|
+
if (evaluatorModel !== undefined && !/^[A-Za-z0-9._-]+$/.test(evaluatorModel)) {
|
|
241
|
+
return Promise.resolve({ ok: false, dryRun, error: 'evaluatorModel must be a plain preset id' });
|
|
242
|
+
}
|
|
243
|
+
if (ceiling !== undefined && (!Number.isInteger(ceiling) || ceiling < 1 || ceiling > 50)) {
|
|
244
|
+
return Promise.resolve({ ok: false, dryRun, error: 'ceiling must be an integer 1-50' });
|
|
245
|
+
}
|
|
246
|
+
if (resume !== undefined && resume !== 'latest' && !isValidRunId(resume)) {
|
|
247
|
+
return Promise.resolve({ ok: false, dryRun, error: 'resume must be a plain run id or latest' });
|
|
248
|
+
}
|
|
207
249
|
const sandbox = resolveSandboxedRoot(projectRoot);
|
|
208
250
|
if ('error' in sandbox) {
|
|
209
251
|
return Promise.resolve({ ok: false, dryRun, error: sandbox.error });
|
|
@@ -224,7 +266,25 @@ export function handleDeliver(args) {
|
|
|
224
266
|
cliArgs.push('--max-turns', String(maxTurns));
|
|
225
267
|
if (model)
|
|
226
268
|
cliArgs.push('--model', model);
|
|
227
|
-
|
|
269
|
+
if (acceptance)
|
|
270
|
+
cliArgs.push('--acceptance');
|
|
271
|
+
if (evaluatorModel)
|
|
272
|
+
cliArgs.push('--evaluator-model', evaluatorModel);
|
|
273
|
+
if (escalate)
|
|
274
|
+
cliArgs.push('--escalate');
|
|
275
|
+
if (coordinate)
|
|
276
|
+
cliArgs.push('--coordinate');
|
|
277
|
+
if (untilDelivered === false)
|
|
278
|
+
cliArgs.push('--no-until-delivered');
|
|
279
|
+
if (ceiling !== undefined)
|
|
280
|
+
cliArgs.push('--ceiling', String(ceiling));
|
|
281
|
+
if (resume)
|
|
282
|
+
cliArgs.push('--resume', resume);
|
|
283
|
+
if (decompose === true)
|
|
284
|
+
cliArgs.push('--decompose');
|
|
285
|
+
if (decompose === false)
|
|
286
|
+
cliArgs.push('--no-decompose');
|
|
287
|
+
cliArgs.push('--', instruction ?? '');
|
|
228
288
|
const timeoutMs = Math.min(MAX_TIMEOUT_SEC, Math.max(1, timeoutSec ?? DEFAULT_TIMEOUT_SEC)) * 1000;
|
|
229
289
|
return new Promise((resolvePromise) => {
|
|
230
290
|
execFile(process.execPath, cliArgs, { cwd: root, timeout: timeoutMs, maxBuffer: MAX_OUTPUT_BYTES, env: buildChildEnv() }, (err, stdout) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deliver.js","sourceRoot":"","sources":["../../../src/mcp-router/tools/deliver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"deliver.js","sourceRoot":"","sources":["../../../src/mcp-router/tools/deliver.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
* shape that the HALO engine (https://github.com/context-labs/HALO) ingests
|
|
6
6
|
* for systemic harness-failure analysis. One JSON object per line.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* ON BY DEFAULT (near-zero overhead: one JSONL append per span) so every run
|
|
9
|
+
* feeds the self-improvement loop; every emit path still short-circuits on
|
|
10
|
+
* `isHaloTracingEnabled()`. Configure with:
|
|
10
11
|
*
|
|
11
|
-
* UAP_HALO_TRACE=
|
|
12
|
+
* UAP_HALO_TRACE=0 # opt out (default: on)
|
|
12
13
|
* UAP_HALO_TRACE_PATH=/path/traces.jsonl # output file (default .uap/halo/traces.jsonl)
|
|
13
14
|
* UAP_HALO_PROJECT_ID=uap # inference.project_id (default "uap")
|
|
14
15
|
*
|