@miller-tech/uap 1.45.1 → 1.46.1
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/bin/cli.js +1 -0
- package/dist/bin/cli.js.map +1 -1
- package/dist/cli/deliver.d.ts +2 -0
- package/dist/cli/deliver.d.ts.map +1 -1
- package/dist/cli/deliver.js +27 -1
- package/dist/cli/deliver.js.map +1 -1
- package/dist/delivery/snapshot.d.ts +15 -0
- package/dist/delivery/snapshot.d.ts.map +1 -0
- package/dist/delivery/snapshot.js +37 -0
- package/dist/delivery/snapshot.js.map +1 -0
- package/dist/delivery/verifier-ladder.d.ts +5 -0
- package/dist/delivery/verifier-ladder.d.ts.map +1 -1
- package/dist/delivery/verifier-ladder.js +84 -11
- package/dist/delivery/verifier-ladder.js.map +1 -1
- package/package.json +1 -1
- package/src/policies/enforcers/__pycache__/_common.cpython-312.pyc +0 -0
- package/tools/agents/deliver_hybrid_agent.py +71 -0
- package/tools/agents/opencode_uap_agent.py +6 -2
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* ecosystems can pass explicit rungs.
|
|
12
12
|
*/
|
|
13
13
|
import { spawnSync } from 'child_process';
|
|
14
|
-
import { existsSync, readFileSync } from 'fs';
|
|
14
|
+
import { existsSync, readFileSync, readdirSync } from 'fs';
|
|
15
15
|
import { join } from 'path';
|
|
16
16
|
const DEFAULT_TIMEOUT_MS = 300_000;
|
|
17
17
|
const DEFAULT_TAIL_CHARS = 2_000;
|
|
@@ -34,19 +34,18 @@ function sanitizedEnv() {
|
|
|
34
34
|
* feedback arrives fast.
|
|
35
35
|
*/
|
|
36
36
|
export function detectRungs(projectRoot, timeoutMs = DEFAULT_TIMEOUT_MS) {
|
|
37
|
+
const rungs = [];
|
|
37
38
|
const pkgPath = join(projectRoot, 'package.json');
|
|
38
|
-
if (!existsSync(pkgPath)) {
|
|
39
|
-
return [];
|
|
40
|
-
}
|
|
41
39
|
let scripts = {};
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
40
|
+
if (existsSync(pkgPath)) {
|
|
41
|
+
try {
|
|
42
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
43
|
+
scripts = pkg.scripts ?? {};
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
scripts = {};
|
|
47
|
+
}
|
|
48
48
|
}
|
|
49
|
-
const rungs = [];
|
|
50
49
|
if (scripts['build']) {
|
|
51
50
|
rungs.push({
|
|
52
51
|
id: 'build',
|
|
@@ -91,6 +90,80 @@ export function detectRungs(projectRoot, timeoutMs = DEFAULT_TIMEOUT_MS) {
|
|
|
91
90
|
timeoutMs,
|
|
92
91
|
});
|
|
93
92
|
}
|
|
93
|
+
// Non-npm projects (the common case for polyglot CLI tasks) expose their
|
|
94
|
+
// checks differently. Detect the real ones so deliver gates on the task's
|
|
95
|
+
// own verifier instead of a hallucinated self-gate.
|
|
96
|
+
if (rungs.length === 0) {
|
|
97
|
+
rungs.push(...detectNonNpmRungs(projectRoot, timeoutMs));
|
|
98
|
+
}
|
|
99
|
+
return rungs;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Detect real gates in non-npm projects: a Makefile test/check/build target,
|
|
103
|
+
* a pytest suite, or a conventional shell test script. Ordered cheap→expensive.
|
|
104
|
+
*/
|
|
105
|
+
export function detectNonNpmRungs(projectRoot, timeoutMs = DEFAULT_TIMEOUT_MS) {
|
|
106
|
+
const rungs = [];
|
|
107
|
+
const has = (p) => existsSync(join(projectRoot, p));
|
|
108
|
+
// Makefile — prefer a test/check target, else the default build target.
|
|
109
|
+
const makefile = ['Makefile', 'makefile', 'GNUmakefile'].find((m) => has(m));
|
|
110
|
+
if (makefile) {
|
|
111
|
+
let target = null;
|
|
112
|
+
try {
|
|
113
|
+
const body = readFileSync(join(projectRoot, makefile), 'utf-8');
|
|
114
|
+
if (/^test\s*:/m.test(body))
|
|
115
|
+
target = 'test';
|
|
116
|
+
else if (/^check\s*:/m.test(body))
|
|
117
|
+
target = 'check';
|
|
118
|
+
else if (/^(all|build)\s*:/m.test(body))
|
|
119
|
+
target = null; // default goal
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
/* unreadable Makefile — fall back to default goal */
|
|
123
|
+
}
|
|
124
|
+
rungs.push({
|
|
125
|
+
id: 'make',
|
|
126
|
+
name: `Make (${target ? `make ${target}` : 'make'})`,
|
|
127
|
+
command: 'make',
|
|
128
|
+
args: target ? [target] : [],
|
|
129
|
+
required: true,
|
|
130
|
+
timeoutMs,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
// pytest — only when there are actual test files (an empty suite exits 5).
|
|
134
|
+
let hasPyTests = has('tests') || has('test');
|
|
135
|
+
if (!hasPyTests) {
|
|
136
|
+
try {
|
|
137
|
+
hasPyTests = readdirSync(projectRoot).some((f) => /^test_.*\.py$|.*_test\.py$/.test(f));
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
/* unreadable dir */
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
if (hasPyTests && rungs.length === 0) {
|
|
144
|
+
rungs.push({
|
|
145
|
+
id: 'pytest',
|
|
146
|
+
name: 'Tests (pytest)',
|
|
147
|
+
command: 'python3',
|
|
148
|
+
args: ['-m', 'pytest', '-q'],
|
|
149
|
+
required: true,
|
|
150
|
+
timeoutMs,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
// Conventional shell test/check scripts (NOT deliver's own .uap-deliver gate).
|
|
154
|
+
if (rungs.length === 0) {
|
|
155
|
+
const script = ['run_tests.sh', 'run-tests.sh', 'test.sh', 'tests.sh', 'check.sh'].find((s) => has(s));
|
|
156
|
+
if (script) {
|
|
157
|
+
rungs.push({
|
|
158
|
+
id: 'script',
|
|
159
|
+
name: `Script (bash ${script})`,
|
|
160
|
+
command: 'bash',
|
|
161
|
+
args: [script],
|
|
162
|
+
required: true,
|
|
163
|
+
timeoutMs,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
94
167
|
return rungs;
|
|
95
168
|
}
|
|
96
169
|
function truncateTail(text, maxChars) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifier-ladder.js","sourceRoot":"","sources":["../../src/delivery/verifier-ladder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"verifier-ladder.js","sourceRoot":"","sources":["../../src/delivery/verifier-ladder.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
Binary file
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Deliver-hybrid harbor agent: opencode solves, then `uap deliver` repairs —
|
|
3
|
+
never regressing.
|
|
4
|
+
|
|
5
|
+
Empirically, deliver-as-the-sole-solver underperforms a strong agentic baseline
|
|
6
|
+
on a hidden-verifier benchmark (its self-gate is a misleading proxy). This agent
|
|
7
|
+
instead makes deliver STRICTLY ADDITIVE:
|
|
8
|
+
|
|
9
|
+
1. opencode (the strong baseline harness) solves the task — this is the floor.
|
|
10
|
+
2. `uap deliver --no-self-gate --keep-best` runs an agentic repair pass against
|
|
11
|
+
the project's REAL detected gates (Makefile/pytest/test-script/npm). With
|
|
12
|
+
no real gate it no-ops and opencode's output stands; with a real gate it can
|
|
13
|
+
only improve the gate score (`--keep-best` rolls back any regression).
|
|
14
|
+
|
|
15
|
+
So the result is >= baseline by construction, and beats it where a detectable
|
|
16
|
+
gate was left failing and deliver repairs it.
|
|
17
|
+
|
|
18
|
+
Run:
|
|
19
|
+
harbor run -d terminal-bench@2.0 \
|
|
20
|
+
--agent-import-path tools.agents.deliver_hybrid_agent:DeliverHybrid ...
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
import shlex
|
|
26
|
+
|
|
27
|
+
from harbor.agents.installed.base import ExecInput
|
|
28
|
+
from harbor.environments.base import BaseEnvironment
|
|
29
|
+
from harbor.models.agent.context import AgentContext
|
|
30
|
+
|
|
31
|
+
from tools.agents.opencode_uap_agent import OpenCodeUAP, logger
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class DeliverHybrid(OpenCodeUAP):
|
|
35
|
+
"""opencode solves; `uap deliver --keep-best` repairs against real gates."""
|
|
36
|
+
|
|
37
|
+
@staticmethod
|
|
38
|
+
def name() -> str:
|
|
39
|
+
return "deliver-hybrid"
|
|
40
|
+
|
|
41
|
+
# Single execution — the opencode retry-on-zero-tools logic would also
|
|
42
|
+
# re-run the appended deliver-repair step, which is wasteful.
|
|
43
|
+
async def run(
|
|
44
|
+
self,
|
|
45
|
+
instruction: str,
|
|
46
|
+
environment: BaseEnvironment,
|
|
47
|
+
context: AgentContext,
|
|
48
|
+
) -> None:
|
|
49
|
+
await self._execute_run(instruction, environment, context, attempt=0)
|
|
50
|
+
self.populate_context_post_run(context)
|
|
51
|
+
|
|
52
|
+
def create_run_agent_commands(self, instruction: str) -> list[ExecInput]:
|
|
53
|
+
# Stage 1: the full opencode solve (baseline floor).
|
|
54
|
+
commands = super().create_run_agent_commands(instruction)
|
|
55
|
+
|
|
56
|
+
# Stage 2: deliver repair against REAL gates only, never regressing.
|
|
57
|
+
# --no-self-gate: do NOT invent a proxy gate; if no real gate is
|
|
58
|
+
# detected, deliver exits non-zero and `|| true` keeps opencode's work.
|
|
59
|
+
# --keep-best: snapshot first; roll back if the real-gate score drops.
|
|
60
|
+
escaped = shlex.quote(instruction)
|
|
61
|
+
endpoint = self._api_endpoint
|
|
62
|
+
repair = (
|
|
63
|
+
"source $HOME/.nvm/nvm.sh && cd /app && "
|
|
64
|
+
f"UAP_DELIVER_ACTIVE=1 uap deliver {escaped} "
|
|
65
|
+
f"--project-root /app --endpoint {endpoint} --model qwen35-a3b "
|
|
66
|
+
"--executor agentic --no-self-gate --keep-best --max-turns 4 --no-until-delivered "
|
|
67
|
+
"2>&1 | tee /logs/agent/uap-deliver-repair.txt || true"
|
|
68
|
+
)
|
|
69
|
+
logger.info("[DeliverHybrid] appending deliver repair pass (real gates, --keep-best)")
|
|
70
|
+
commands.append(ExecInput(command=repair))
|
|
71
|
+
return commands
|
|
@@ -1037,8 +1037,12 @@ class OpenCodeBaseline(BaseInstalledAgent):
|
|
|
1037
1037
|
|
|
1038
1038
|
run = ExecInput(
|
|
1039
1039
|
command=(
|
|
1040
|
-
|
|
1041
|
-
|
|
1040
|
+
# `cd /app` + `--dir /app` so opencode indexes the task directory
|
|
1041
|
+
# (matches OpenCodeUAP). Without it opencode runs from the wrong
|
|
1042
|
+
# cwd and fails file-exploration tasks — which made the baseline a
|
|
1043
|
+
# handicapped, unfair control in A/B comparisons.
|
|
1044
|
+
f"source $HOME/.nvm/nvm.sh && cd /app && "
|
|
1045
|
+
f"opencode --model {model} --dir /app run --format=json {escaped} "
|
|
1042
1046
|
f"2>&1 | tee /logs/agent/opencode.txt"
|
|
1043
1047
|
),
|
|
1044
1048
|
env=env,
|