@enderfga/claw-orchestrator 5.1.0 → 6.0.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/README.md +26 -26
- package/dist/bin/cli.js +107 -1
- package/dist/bin/cli.js.map +1 -1
- package/dist/src/acp-server.d.ts +5 -5
- package/dist/src/acp-server.js +3 -3
- package/dist/src/acp-server.js.map +1 -1
- package/dist/src/autoloop/dispatcher.d.ts +22 -0
- package/dist/src/autoloop/dispatcher.js +71 -13
- package/dist/src/autoloop/dispatcher.js.map +1 -1
- package/dist/src/autoloop/messages.d.ts +10 -0
- package/dist/src/autoloop/messages.js.map +1 -1
- package/dist/src/autoloop/runner.js +6 -0
- package/dist/src/autoloop/runner.js.map +1 -1
- package/dist/src/constants.d.ts +0 -6
- package/dist/src/constants.js +0 -6
- package/dist/src/constants.js.map +1 -1
- package/dist/src/council.d.ts +15 -0
- package/dist/src/council.js +48 -35
- package/dist/src/council.js.map +1 -1
- package/dist/src/dashboard/index.html +191 -6
- package/dist/src/embedded-server.js +132 -9
- package/dist/src/embedded-server.js.map +1 -1
- package/dist/src/fanout.d.ts +30 -1
- package/dist/src/fanout.js +32 -3
- package/dist/src/fanout.js.map +1 -1
- package/dist/src/index.js +359 -4
- package/dist/src/index.js.map +1 -1
- package/dist/src/kernel/agent-step.d.ts +59 -0
- package/dist/src/kernel/agent-step.js +100 -0
- package/dist/src/kernel/agent-step.js.map +1 -0
- package/dist/src/kernel/conditions.d.ts +11 -0
- package/dist/src/kernel/conditions.js +24 -0
- package/dist/src/kernel/conditions.js.map +1 -0
- package/dist/src/kernel/engine.d.ts +319 -0
- package/dist/src/kernel/engine.js +1047 -0
- package/dist/src/kernel/engine.js.map +1 -0
- package/dist/src/kernel/exec.d.ts +43 -0
- package/dist/src/kernel/exec.js +112 -0
- package/dist/src/kernel/exec.js.map +1 -0
- package/dist/src/kernel/file-lock.d.ts +50 -0
- package/dist/src/kernel/file-lock.js +135 -0
- package/dist/src/kernel/file-lock.js.map +1 -0
- package/dist/src/kernel/nodes/agent.d.ts +4 -0
- package/dist/src/kernel/nodes/agent.js +35 -0
- package/dist/src/kernel/nodes/agent.js.map +1 -0
- package/dist/src/kernel/nodes/autoloop.d.ts +78 -0
- package/dist/src/kernel/nodes/autoloop.js +75 -0
- package/dist/src/kernel/nodes/autoloop.js.map +1 -0
- package/dist/src/kernel/nodes/council.d.ts +12 -0
- package/dist/src/kernel/nodes/council.js +88 -0
- package/dist/src/kernel/nodes/council.js.map +1 -0
- package/dist/src/kernel/nodes/fanout.d.ts +11 -0
- package/dist/src/kernel/nodes/fanout.js +63 -0
- package/dist/src/kernel/nodes/fanout.js.map +1 -0
- package/dist/src/kernel/nodes/human-gate.d.ts +4 -0
- package/dist/src/kernel/nodes/human-gate.js +7 -0
- package/dist/src/kernel/nodes/human-gate.js.map +1 -0
- package/dist/src/kernel/nodes/index.d.ts +12 -0
- package/dist/src/kernel/nodes/index.js +21 -0
- package/dist/src/kernel/nodes/index.js.map +1 -0
- package/dist/src/kernel/nodes/router.d.ts +4 -0
- package/dist/src/kernel/nodes/router.js +12 -0
- package/dist/src/kernel/nodes/router.js.map +1 -0
- package/dist/src/kernel/nodes/subflow.d.ts +13 -0
- package/dist/src/kernel/nodes/subflow.js +38 -0
- package/dist/src/kernel/nodes/subflow.js.map +1 -0
- package/dist/src/kernel/nodes/ultraapp.d.ts +60 -0
- package/dist/src/kernel/nodes/ultraapp.js +62 -0
- package/dist/src/kernel/nodes/ultraapp.js.map +1 -0
- package/dist/src/kernel/nodes/verifier.d.ts +14 -0
- package/dist/src/kernel/nodes/verifier.js +84 -0
- package/dist/src/kernel/nodes/verifier.js.map +1 -0
- package/dist/src/kernel/projections.d.ts +42 -0
- package/dist/src/kernel/projections.js +133 -0
- package/dist/src/kernel/projections.js.map +1 -0
- package/dist/src/kernel/repo.d.ts +13 -0
- package/dist/src/kernel/repo.js +64 -0
- package/dist/src/kernel/repo.js.map +1 -0
- package/dist/src/kernel/secrets.d.ts +25 -0
- package/dist/src/kernel/secrets.js +48 -0
- package/dist/src/kernel/secrets.js.map +1 -0
- package/dist/src/kernel/store.d.ts +225 -0
- package/dist/src/kernel/store.js +838 -0
- package/dist/src/kernel/store.js.map +1 -0
- package/dist/src/kernel/templates/index.d.ts +140 -0
- package/dist/src/kernel/templates/index.js +266 -0
- package/dist/src/kernel/templates/index.js.map +1 -0
- package/dist/src/kernel/types.d.ts +326 -0
- package/dist/src/kernel/types.js +19 -0
- package/dist/src/kernel/types.js.map +1 -0
- package/dist/src/run-ledger.d.ts +57 -3
- package/dist/src/run-ledger.js +45 -2
- package/dist/src/run-ledger.js.map +1 -1
- package/dist/src/session-manager.d.ts +176 -129
- package/dist/src/session-manager.js +652 -603
- package/dist/src/session-manager.js.map +1 -1
- package/dist/src/types.d.ts +33 -3
- package/dist/src/ultraapp/build.d.ts +117 -3
- package/dist/src/ultraapp/build.js +319 -3
- package/dist/src/ultraapp/build.js.map +1 -1
- package/dist/src/ultraapp/contract.d.ts +52 -0
- package/dist/src/ultraapp/contract.js +83 -0
- package/dist/src/ultraapp/contract.js.map +1 -0
- package/dist/src/ultraapp/conventions.js +9 -2
- package/dist/src/ultraapp/conventions.js.map +1 -1
- package/dist/src/ultraapp/fix-on-failure.d.ts +21 -2
- package/dist/src/ultraapp/fix-on-failure.js +46 -62
- package/dist/src/ultraapp/fix-on-failure.js.map +1 -1
- package/dist/src/ultraapp/manager.d.ts +107 -2
- package/dist/src/ultraapp/manager.js +305 -86
- package/dist/src/ultraapp/manager.js.map +1 -1
- package/dist/src/verify/baseline.d.ts +73 -0
- package/dist/src/verify/baseline.js +186 -0
- package/dist/src/verify/baseline.js.map +1 -0
- package/dist/src/verify/contract.d.ts +116 -0
- package/dist/src/verify/contract.js +142 -0
- package/dist/src/verify/contract.js.map +1 -0
- package/dist/src/verify/evidence.d.ts +61 -0
- package/dist/src/verify/evidence.js +133 -0
- package/dist/src/verify/evidence.js.map +1 -0
- package/dist/src/verify/runner.d.ts +63 -0
- package/dist/src/verify/runner.js +317 -0
- package/dist/src/verify/runner.js.map +1 -0
- package/openclaw.plugin.json +8 -0
- package/package.json +2 -2
- package/skills/SKILL.md +120 -79
- package/skills/references/acp.md +17 -17
- package/skills/references/autoloop.md +139 -65
- package/skills/references/claude-cli-tracking.md +4 -4
- package/skills/references/cli.md +101 -59
- package/skills/references/council.md +109 -37
- package/skills/references/dashboard.md +34 -6
- package/skills/references/getting-started.md +13 -13
- package/skills/references/inbox.md +4 -4
- package/skills/references/mcp.md +39 -34
- package/skills/references/multi-engine.md +51 -47
- package/skills/references/observability.md +88 -28
- package/skills/references/openai-compat.md +39 -39
- package/skills/references/sessions.md +43 -25
- package/skills/references/tools.md +402 -309
- package/skills/references/ultra.md +45 -45
- package/skills/references/ultraapp.md +126 -50
- package/skills/references/verification.md +187 -0
- package/skills/references/workflow.md +362 -0
- package/dist/src/ultraapp/fix-on-failure-session.d.ts +0 -23
- package/dist/src/ultraapp/fix-on-failure-session.js +0 -51
- package/dist/src/ultraapp/fix-on-failure-session.js.map +0 -1
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evidence bundles — the machine-readable record of what was checked.
|
|
3
|
+
*
|
|
4
|
+
* A run's claim to be finished is only as good as what can be re-read after the
|
|
5
|
+
* process that made it is gone. So every verifier attempt writes a directory:
|
|
6
|
+
* the verdict and per-check results as JSON, the failure tails as plain text,
|
|
7
|
+
* whatever files the checks produced (screenshots), and the patch the run
|
|
8
|
+
* actually made, against the base commit recorded when it started.
|
|
9
|
+
*/
|
|
10
|
+
import fs from 'node:fs';
|
|
11
|
+
import path from 'node:path';
|
|
12
|
+
import { exec } from '../kernel/exec.js';
|
|
13
|
+
import { capturePatch, changedFilesSince, treeFingerprint } from './baseline.js';
|
|
14
|
+
import { contractPassed } from './contract.js';
|
|
15
|
+
export function evidenceRoot(runDir) {
|
|
16
|
+
return path.join(runDir, 'evidence');
|
|
17
|
+
}
|
|
18
|
+
export function evidenceDir(runDir, evidenceId) {
|
|
19
|
+
return path.join(evidenceRoot(runDir), evidenceId);
|
|
20
|
+
}
|
|
21
|
+
/** `<node>-<attempt>` — stable, sortable, and readable in a ledger row. */
|
|
22
|
+
export function makeEvidenceId(node, attempt) {
|
|
23
|
+
return `${node.replace(/[^\w.-]/g, '_')}-${String(attempt).padStart(2, '0')}`;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Write the bundle. Best-effort like the run ledger: a bundle that fails to land
|
|
27
|
+
* must not change the verdict it is describing — the verdict is already decided
|
|
28
|
+
* by `results`.
|
|
29
|
+
*/
|
|
30
|
+
export async function writeEvidence(args) {
|
|
31
|
+
const dir = evidenceDir(args.runDir, args.evidenceId);
|
|
32
|
+
const head = await exec('git', ['-C', args.cwd, 'rev-parse', 'HEAD'], { timeoutMs: 60_000 });
|
|
33
|
+
const headSha = head.code === 0 ? head.out.trim() : undefined;
|
|
34
|
+
let changedFiles = [];
|
|
35
|
+
try {
|
|
36
|
+
changedFiles = await changedFilesSince(args.cwd, args.baseSha);
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
args.logger?.warn?.(`[evidence] change listing failed: ${e.message}`);
|
|
40
|
+
}
|
|
41
|
+
const bundle = {
|
|
42
|
+
evidenceId: args.evidenceId,
|
|
43
|
+
runId: args.runId,
|
|
44
|
+
node: args.node,
|
|
45
|
+
contractId: args.contractId,
|
|
46
|
+
createdAt: new Date().toISOString(),
|
|
47
|
+
cwd: args.cwd,
|
|
48
|
+
baseSha: args.baseSha,
|
|
49
|
+
headSha,
|
|
50
|
+
passed: contractPassed(args.results),
|
|
51
|
+
rounds: args.rounds,
|
|
52
|
+
results: args.results,
|
|
53
|
+
changedFiles,
|
|
54
|
+
treeFingerprint: await treeFingerprint(args.cwd),
|
|
55
|
+
};
|
|
56
|
+
try {
|
|
57
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
58
|
+
fs.writeFileSync(path.join(dir, 'bundle.json'), JSON.stringify(bundle, null, 2));
|
|
59
|
+
const logDir = path.join(dir, 'checks');
|
|
60
|
+
let wroteLog = false;
|
|
61
|
+
for (const r of args.results) {
|
|
62
|
+
if (!r.tail)
|
|
63
|
+
continue;
|
|
64
|
+
if (!wroteLog) {
|
|
65
|
+
fs.mkdirSync(logDir, { recursive: true });
|
|
66
|
+
wroteLog = true;
|
|
67
|
+
}
|
|
68
|
+
fs.writeFileSync(path.join(logDir, `${r.id.replace(/[^\w.-]/g, '_')}.log`), r.tail);
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
const patch = await capturePatch(args.cwd, args.baseSha);
|
|
72
|
+
if (patch.trim())
|
|
73
|
+
fs.writeFileSync(path.join(dir, 'diff.patch'), patch);
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
args.logger?.warn?.(`[evidence] patch capture failed: ${e.message}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
args.logger?.warn?.(`[evidence] write failed: ${e.message}`);
|
|
81
|
+
}
|
|
82
|
+
return bundle;
|
|
83
|
+
}
|
|
84
|
+
export function readEvidence(runDir, evidenceId) {
|
|
85
|
+
try {
|
|
86
|
+
const raw = fs.readFileSync(path.join(evidenceDir(runDir, evidenceId), 'bundle.json'), 'utf8');
|
|
87
|
+
return JSON.parse(raw);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export function listEvidence(runDir) {
|
|
94
|
+
try {
|
|
95
|
+
return fs
|
|
96
|
+
.readdirSync(evidenceRoot(runDir), { withFileTypes: true })
|
|
97
|
+
.filter((d) => d.isDirectory())
|
|
98
|
+
.map((d) => d.name)
|
|
99
|
+
.sort();
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/** Render a bundle for the CLI. Pure — no I/O. */
|
|
106
|
+
export function formatEvidence(bundle) {
|
|
107
|
+
const lines = [];
|
|
108
|
+
lines.push(`evidence ${bundle.evidenceId} (${bundle.passed ? 'PASSED' : 'FAILED'})`);
|
|
109
|
+
lines.push(`run ${bundle.runId} · node ${bundle.node} · ${bundle.createdAt}`);
|
|
110
|
+
if (bundle.baseSha) {
|
|
111
|
+
lines.push(`base ${bundle.baseSha.slice(0, 12)}${bundle.headSha ? ` → head ${bundle.headSha.slice(0, 12)}` : ''}`);
|
|
112
|
+
}
|
|
113
|
+
if (bundle.rounds > 0)
|
|
114
|
+
lines.push(`${bundle.rounds} fix round(s) consumed`);
|
|
115
|
+
lines.push('');
|
|
116
|
+
for (const r of bundle.results) {
|
|
117
|
+
const mark = r.passed ? 'PASS' : r.required ? 'FAIL' : 'warn';
|
|
118
|
+
lines.push(` [${mark}] ${r.id} (${r.type}) ${r.detail}`);
|
|
119
|
+
if (r.artifacts?.length)
|
|
120
|
+
lines.push(` artifacts: ${r.artifacts.join(', ')}`);
|
|
121
|
+
}
|
|
122
|
+
if (bundle.changedFiles.length > 0) {
|
|
123
|
+
lines.push('');
|
|
124
|
+
lines.push(`changed files (${bundle.changedFiles.length}):`);
|
|
125
|
+
for (const f of bundle.changedFiles.slice(0, 40)) {
|
|
126
|
+
lines.push(` ${f.status.padEnd(9)} +${f.insertions} -${f.deletions} ${f.path}`);
|
|
127
|
+
}
|
|
128
|
+
if (bundle.changedFiles.length > 40)
|
|
129
|
+
lines.push(` … ${bundle.changedFiles.length - 40} more`);
|
|
130
|
+
}
|
|
131
|
+
return lines.join('\n');
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence.js","sourceRoot":"","sources":["../../../src/verify/evidence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The check runner — the part of the runtime that actually looks.
|
|
3
|
+
*
|
|
4
|
+
* Extracted and generalised from `ultraapp/fix-on-failure.ts`, which was the one
|
|
5
|
+
* piece of real verification in the codebase but was private to ultraapp,
|
|
6
|
+
* hardcoded to an npm/docker step list, and had two defects this module fixes:
|
|
7
|
+
*
|
|
8
|
+
* 1. No timeout. A wedged `npm test` hung the pipeline forever.
|
|
9
|
+
* 2. `steps[].required` was declared in the type and never read — every step
|
|
10
|
+
* was fatal. Here a non-required failure is recorded and carries on.
|
|
11
|
+
*
|
|
12
|
+
* What is kept: the injectable runner seam (so tests drive it without spawning),
|
|
13
|
+
* the byte-capped tail, and the fix-on-red retry loop.
|
|
14
|
+
*/
|
|
15
|
+
import type { Logger } from '../logger.js';
|
|
16
|
+
import { type ExecResult } from '../kernel/exec.js';
|
|
17
|
+
import { type AcceptanceContract, type CheckResult } from './contract.js';
|
|
18
|
+
export type ExecFn = (cmd: string, args: string[], opts: {
|
|
19
|
+
cwd?: string;
|
|
20
|
+
timeoutMs?: number;
|
|
21
|
+
}) => Promise<ExecResult>;
|
|
22
|
+
export interface FixerArgs {
|
|
23
|
+
cwd: string;
|
|
24
|
+
failingCheck: string;
|
|
25
|
+
tail: string;
|
|
26
|
+
round: number;
|
|
27
|
+
}
|
|
28
|
+
export type FixerSpawner = (args: FixerArgs) => Promise<void>;
|
|
29
|
+
export interface VerifyContext {
|
|
30
|
+
cwd: string;
|
|
31
|
+
/** Directory for check-produced files (screenshots). Created on demand. */
|
|
32
|
+
artifactDir: string;
|
|
33
|
+
baseSha?: string;
|
|
34
|
+
exec?: ExecFn;
|
|
35
|
+
fetchFn?: typeof fetch;
|
|
36
|
+
logger?: Logger;
|
|
37
|
+
/** Aborts the run between checks. */
|
|
38
|
+
signal?: {
|
|
39
|
+
aborted: boolean;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export interface ContractRunResult {
|
|
43
|
+
results: CheckResult[];
|
|
44
|
+
passed: boolean;
|
|
45
|
+
/** Fix rounds consumed. 0 means it went green first try (or there was no fixer). */
|
|
46
|
+
rounds: number;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Run every check once, in order. Unlike the predecessor pipeline this does not
|
|
50
|
+
* stop at the first red: a full result set is far more useful in an evidence
|
|
51
|
+
* bundle than "the first thing that broke", and non-required checks must run
|
|
52
|
+
* regardless. Required failures short-circuit only the *remaining required*
|
|
53
|
+
* command checks when `stopOnRequiredFailure` is set.
|
|
54
|
+
*/
|
|
55
|
+
export declare function runChecks(contract: AcceptanceContract, ctx: VerifyContext, opts?: {
|
|
56
|
+
stopOnRequiredFailure?: boolean;
|
|
57
|
+
}): Promise<CheckResult[]>;
|
|
58
|
+
/**
|
|
59
|
+
* Run the contract, and on red optionally hand the failure to a fixer agent and
|
|
60
|
+
* run the whole list again. The fixer's own claim of success is ignored — only
|
|
61
|
+
* the re-run decides, which is what made the ultraapp version trustworthy.
|
|
62
|
+
*/
|
|
63
|
+
export declare function runContract(contract: AcceptanceContract, ctx: VerifyContext, spawnFixer?: FixerSpawner): Promise<ContractRunResult>;
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The check runner — the part of the runtime that actually looks.
|
|
3
|
+
*
|
|
4
|
+
* Extracted and generalised from `ultraapp/fix-on-failure.ts`, which was the one
|
|
5
|
+
* piece of real verification in the codebase but was private to ultraapp,
|
|
6
|
+
* hardcoded to an npm/docker step list, and had two defects this module fixes:
|
|
7
|
+
*
|
|
8
|
+
* 1. No timeout. A wedged `npm test` hung the pipeline forever.
|
|
9
|
+
* 2. `steps[].required` was declared in the type and never read — every step
|
|
10
|
+
* was fatal. Here a non-required failure is recorded and carries on.
|
|
11
|
+
*
|
|
12
|
+
* What is kept: the injectable runner seam (so tests drive it without spawning),
|
|
13
|
+
* the byte-capped tail, and the fix-on-red retry loop.
|
|
14
|
+
*/
|
|
15
|
+
import fs from 'node:fs';
|
|
16
|
+
import path from 'node:path';
|
|
17
|
+
import { exec as realExec, lastLines } from '../kernel/exec.js';
|
|
18
|
+
import { changedFilesSince, isUnder, resolveIn } from './baseline.js';
|
|
19
|
+
import { contractPassed, DEFAULT_CHECK_TIMEOUT_MS, DEFAULT_HTTP_TIMEOUT_MS, DEFAULT_SCREENSHOT_TIMEOUT_MS, } from './contract.js';
|
|
20
|
+
const TAIL_LINES = 200;
|
|
21
|
+
// ─── Individual check kinds ─────────────────────────────────────────────────
|
|
22
|
+
async function runCommandCheck(spec, ctx) {
|
|
23
|
+
const run = ctx.exec ?? realExec;
|
|
24
|
+
const cwd = spec.cwd ? resolveIn(ctx.cwd, spec.cwd) : ctx.cwd;
|
|
25
|
+
const r = await run(spec.cmd, spec.args ?? [], { cwd, timeoutMs: spec.timeoutMs ?? DEFAULT_CHECK_TIMEOUT_MS });
|
|
26
|
+
const cmdline = [spec.cmd, ...(spec.args ?? [])].join(' ');
|
|
27
|
+
const expect = spec.expectExit ?? 0;
|
|
28
|
+
const passed = r.code === expect;
|
|
29
|
+
return {
|
|
30
|
+
passed,
|
|
31
|
+
durationMs: r.durationMs,
|
|
32
|
+
timedOut: r.timedOut,
|
|
33
|
+
detail: r.timedOut
|
|
34
|
+
? `\`${cmdline}\` timed out after ${spec.timeoutMs ?? DEFAULT_CHECK_TIMEOUT_MS}ms`
|
|
35
|
+
: passed
|
|
36
|
+
? `\`${cmdline}\` exited ${r.code}`
|
|
37
|
+
: `\`${cmdline}\` exited ${r.code}, expected ${expect}`,
|
|
38
|
+
tail: passed ? undefined : lastLines(r.err || r.out, TAIL_LINES),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
async function runHttpCheck(spec, ctx) {
|
|
42
|
+
// Same shape as ultraapp's waitForHealth: poll until the deadline rather than
|
|
43
|
+
// failing on the first refused connection, because the thing under test is
|
|
44
|
+
// usually still coming up.
|
|
45
|
+
const doFetch = ctx.fetchFn ?? fetch;
|
|
46
|
+
const expect = spec.expectStatus ?? 200;
|
|
47
|
+
const timeoutMs = spec.timeoutMs ?? DEFAULT_HTTP_TIMEOUT_MS;
|
|
48
|
+
const intervalMs = spec.intervalMs ?? 1000;
|
|
49
|
+
const startedAt = Date.now();
|
|
50
|
+
let lastDetail = 'never reached';
|
|
51
|
+
while (Date.now() - startedAt < timeoutMs) {
|
|
52
|
+
if (ctx.signal?.aborted)
|
|
53
|
+
break;
|
|
54
|
+
try {
|
|
55
|
+
const res = await doFetch(spec.url);
|
|
56
|
+
if (res.status === expect) {
|
|
57
|
+
return { passed: true, durationMs: Date.now() - startedAt, detail: `GET ${spec.url} → ${res.status}` };
|
|
58
|
+
}
|
|
59
|
+
lastDetail = `GET ${spec.url} → ${res.status}, expected ${expect}`;
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
lastDetail = `GET ${spec.url} → ${e.message}`;
|
|
63
|
+
}
|
|
64
|
+
await new Promise((r) => setTimeout(r, intervalMs));
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
passed: false,
|
|
68
|
+
durationMs: Date.now() - startedAt,
|
|
69
|
+
detail: `${lastDetail} (gave up after ${timeoutMs}ms)`,
|
|
70
|
+
timedOut: true,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const CHROME_CANDIDATES = [
|
|
74
|
+
process.env.CLAWO_CHROME_BIN,
|
|
75
|
+
'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
|
|
76
|
+
'/Applications/Chromium.app/Contents/MacOS/Chromium',
|
|
77
|
+
'google-chrome',
|
|
78
|
+
'chromium',
|
|
79
|
+
'chromium-browser',
|
|
80
|
+
].filter((x) => Boolean(x));
|
|
81
|
+
function onPath(name) {
|
|
82
|
+
for (const dir of (process.env.PATH || '').split(path.delimiter)) {
|
|
83
|
+
if (!dir)
|
|
84
|
+
continue;
|
|
85
|
+
const candidate = path.join(dir, name);
|
|
86
|
+
try {
|
|
87
|
+
if (fs.existsSync(candidate))
|
|
88
|
+
return candidate;
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// Unreadable PATH entry — keep looking.
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Resolve a browser, checking PATH for bare names rather than handing them to
|
|
98
|
+
* spawn and hoping. A host with no Chrome should be told so immediately; letting
|
|
99
|
+
* the spawn fail means paying the check's full timeout to learn it.
|
|
100
|
+
*/
|
|
101
|
+
function resolveChrome(explicit) {
|
|
102
|
+
if (explicit)
|
|
103
|
+
return explicit;
|
|
104
|
+
for (const c of CHROME_CANDIDATES) {
|
|
105
|
+
if (c.includes('/')) {
|
|
106
|
+
if (fs.existsSync(c))
|
|
107
|
+
return c;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
const resolved = onPath(c);
|
|
111
|
+
if (resolved)
|
|
112
|
+
return resolved;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
async function runScreenshotCheck(spec, ctx) {
|
|
118
|
+
const run = ctx.exec ?? realExec;
|
|
119
|
+
const bin = resolveChrome(spec.browserBin);
|
|
120
|
+
const startedAt = Date.now();
|
|
121
|
+
if (!bin) {
|
|
122
|
+
return { passed: false, durationMs: 0, detail: 'no Chrome/Chromium binary found (set CLAWO_CHROME_BIN)' };
|
|
123
|
+
}
|
|
124
|
+
fs.mkdirSync(ctx.artifactDir, { recursive: true });
|
|
125
|
+
const artifacts = [];
|
|
126
|
+
const failures = [];
|
|
127
|
+
for (const vp of spec.viewports) {
|
|
128
|
+
const label = vp.label || `${vp.width}x${vp.height}`;
|
|
129
|
+
const file = path.join(ctx.artifactDir, `shot-${label.replace(/[^\w.-]/g, '_')}.png`);
|
|
130
|
+
const r = await run(bin, [
|
|
131
|
+
'--headless=new',
|
|
132
|
+
'--disable-gpu',
|
|
133
|
+
'--hide-scrollbars',
|
|
134
|
+
`--window-size=${vp.width},${vp.height}`,
|
|
135
|
+
'--virtual-time-budget=4000',
|
|
136
|
+
`--screenshot=${file}`,
|
|
137
|
+
spec.url,
|
|
138
|
+
], { cwd: ctx.cwd, timeoutMs: spec.timeoutMs ?? DEFAULT_SCREENSHOT_TIMEOUT_MS });
|
|
139
|
+
// Chrome's exit code is unreliable in headless screenshot mode; the file
|
|
140
|
+
// landing on disk with content is the signal that matters.
|
|
141
|
+
let bytes = 0;
|
|
142
|
+
try {
|
|
143
|
+
bytes = fs.statSync(file).size;
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
bytes = 0;
|
|
147
|
+
}
|
|
148
|
+
if (bytes > 0) {
|
|
149
|
+
artifacts.push(path.basename(file));
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
failures.push(`${label}: no image produced (${r.timedOut ? 'timed out' : `exit ${r.code}`})`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
passed: failures.length === 0,
|
|
157
|
+
durationMs: Date.now() - startedAt,
|
|
158
|
+
detail: failures.length === 0
|
|
159
|
+
? `captured ${artifacts.length} screenshot(s) of ${spec.url}`
|
|
160
|
+
: `screenshot capture failed — ${failures.join('; ')}`,
|
|
161
|
+
artifacts,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
async function runDiffPolicyCheck(spec, ctx) {
|
|
165
|
+
const startedAt = Date.now();
|
|
166
|
+
const changed = await changedFilesSince(ctx.cwd, ctx.baseSha);
|
|
167
|
+
const problems = [];
|
|
168
|
+
if (spec.maxFiles !== undefined && changed.length > spec.maxFiles) {
|
|
169
|
+
problems.push(`${changed.length} files changed, limit ${spec.maxFiles}`);
|
|
170
|
+
}
|
|
171
|
+
for (const prefix of spec.forbidPaths ?? []) {
|
|
172
|
+
const hits = changed.filter((f) => isUnder(f.path, prefix)).map((f) => f.path);
|
|
173
|
+
if (hits.length > 0)
|
|
174
|
+
problems.push(`forbidden path ${prefix} touched: ${hits.slice(0, 5).join(', ')}`);
|
|
175
|
+
}
|
|
176
|
+
if (spec.requirePaths && spec.requirePaths.length > 0) {
|
|
177
|
+
const any = changed.some((f) => spec.requirePaths.some((p) => isUnder(f.path, p)));
|
|
178
|
+
if (!any)
|
|
179
|
+
problems.push(`no change under any of: ${spec.requirePaths.join(', ')}`);
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
passed: problems.length === 0,
|
|
183
|
+
durationMs: Date.now() - startedAt,
|
|
184
|
+
detail: problems.length === 0 ? `${changed.length} file(s) changed, policy satisfied` : problems.join('; '),
|
|
185
|
+
tail: problems.length === 0 ? undefined : changed.map((f) => `${f.status} ${f.path}`).join('\n'),
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
function runFileCheck(spec, ctx) {
|
|
189
|
+
const startedAt = Date.now();
|
|
190
|
+
const target = resolveIn(ctx.cwd, spec.path);
|
|
191
|
+
const shouldExist = spec.exists !== false;
|
|
192
|
+
let exists = false;
|
|
193
|
+
try {
|
|
194
|
+
exists = fs.existsSync(target);
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
exists = false;
|
|
198
|
+
}
|
|
199
|
+
if (exists !== shouldExist) {
|
|
200
|
+
return {
|
|
201
|
+
passed: false,
|
|
202
|
+
durationMs: Date.now() - startedAt,
|
|
203
|
+
detail: shouldExist ? `${spec.path} is missing` : `${spec.path} exists but must not`,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
if (exists && spec.matches) {
|
|
207
|
+
let body = '';
|
|
208
|
+
try {
|
|
209
|
+
body = fs.readFileSync(target, 'utf8');
|
|
210
|
+
}
|
|
211
|
+
catch (e) {
|
|
212
|
+
return {
|
|
213
|
+
passed: false,
|
|
214
|
+
durationMs: Date.now() - startedAt,
|
|
215
|
+
detail: `${spec.path} unreadable: ${e.message}`,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
let re;
|
|
219
|
+
try {
|
|
220
|
+
re = new RegExp(spec.matches);
|
|
221
|
+
}
|
|
222
|
+
catch (e) {
|
|
223
|
+
return { passed: false, durationMs: Date.now() - startedAt, detail: `invalid matcher: ${e.message}` };
|
|
224
|
+
}
|
|
225
|
+
if (!re.test(body)) {
|
|
226
|
+
return {
|
|
227
|
+
passed: false,
|
|
228
|
+
durationMs: Date.now() - startedAt,
|
|
229
|
+
detail: `${spec.path} does not match /${spec.matches}/`,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return { passed: true, durationMs: Date.now() - startedAt, detail: `${spec.path} ok` };
|
|
234
|
+
}
|
|
235
|
+
// ─── Orchestration ──────────────────────────────────────────────────────────
|
|
236
|
+
async function runOne(check, index, ctx) {
|
|
237
|
+
const id = check.id || `${check.spec.type}-${index + 1}`;
|
|
238
|
+
const required = check.required !== false;
|
|
239
|
+
const base = { id, type: check.spec.type, required };
|
|
240
|
+
switch (check.spec.type) {
|
|
241
|
+
case 'command':
|
|
242
|
+
return { ...base, ...(await runCommandCheck(check.spec, ctx)) };
|
|
243
|
+
case 'http':
|
|
244
|
+
return { ...base, ...(await runHttpCheck(check.spec, ctx)) };
|
|
245
|
+
case 'screenshot':
|
|
246
|
+
return { ...base, ...(await runScreenshotCheck(check.spec, ctx)) };
|
|
247
|
+
case 'diff_policy':
|
|
248
|
+
return { ...base, ...(await runDiffPolicyCheck(check.spec, ctx)) };
|
|
249
|
+
case 'file':
|
|
250
|
+
return { ...base, ...runFileCheck(check.spec, ctx) };
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Run every check once, in order. Unlike the predecessor pipeline this does not
|
|
255
|
+
* stop at the first red: a full result set is far more useful in an evidence
|
|
256
|
+
* bundle than "the first thing that broke", and non-required checks must run
|
|
257
|
+
* regardless. Required failures short-circuit only the *remaining required*
|
|
258
|
+
* command checks when `stopOnRequiredFailure` is set.
|
|
259
|
+
*/
|
|
260
|
+
export async function runChecks(contract, ctx, opts = {}) {
|
|
261
|
+
const results = [];
|
|
262
|
+
for (let i = 0; i < contract.checks.length; i++) {
|
|
263
|
+
if (ctx.signal?.aborted)
|
|
264
|
+
break;
|
|
265
|
+
const check = contract.checks[i];
|
|
266
|
+
if (opts.stopOnRequiredFailure && results.some((r) => r.required && !r.passed) && check.required !== false) {
|
|
267
|
+
results.push({
|
|
268
|
+
id: check.id || `${check.spec.type}-${i + 1}`,
|
|
269
|
+
type: check.spec.type,
|
|
270
|
+
required: true,
|
|
271
|
+
passed: false,
|
|
272
|
+
durationMs: 0,
|
|
273
|
+
detail: 'skipped — an earlier required check failed',
|
|
274
|
+
});
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
try {
|
|
278
|
+
results.push(await runOne(check, i, ctx));
|
|
279
|
+
}
|
|
280
|
+
catch (e) {
|
|
281
|
+
results.push({
|
|
282
|
+
id: check.id || `${check.spec.type}-${i + 1}`,
|
|
283
|
+
type: check.spec.type,
|
|
284
|
+
required: check.required !== false,
|
|
285
|
+
passed: false,
|
|
286
|
+
durationMs: 0,
|
|
287
|
+
detail: `check threw: ${e.message}`,
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return results;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Run the contract, and on red optionally hand the failure to a fixer agent and
|
|
295
|
+
* run the whole list again. The fixer's own claim of success is ignored — only
|
|
296
|
+
* the re-run decides, which is what made the ultraapp version trustworthy.
|
|
297
|
+
*/
|
|
298
|
+
export async function runContract(contract, ctx, spawnFixer) {
|
|
299
|
+
const maxRounds = spawnFixer ? (contract.fixOnFailureRounds ?? 0) : 0;
|
|
300
|
+
let rounds = 0;
|
|
301
|
+
for (;;) {
|
|
302
|
+
const results = await runChecks(contract, ctx);
|
|
303
|
+
if (contractPassed(results) || rounds >= maxRounds || ctx.signal?.aborted) {
|
|
304
|
+
return { results, passed: contractPassed(results), rounds };
|
|
305
|
+
}
|
|
306
|
+
const failed = results.find((r) => r.required && !r.passed);
|
|
307
|
+
rounds++;
|
|
308
|
+
ctx.logger?.info?.(`[verify] round ${rounds}/${maxRounds} — fixing: ${failed?.detail ?? 'unknown'}`);
|
|
309
|
+
await spawnFixer({
|
|
310
|
+
cwd: ctx.cwd,
|
|
311
|
+
failingCheck: failed?.detail ?? 'unknown',
|
|
312
|
+
tail: failed?.tail ?? '',
|
|
313
|
+
round: rounds,
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/verify/runner.ts"],"names":[],"mappings":"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"}
|
package/openclaw.plugin.json
CHANGED
|
@@ -115,6 +115,14 @@
|
|
|
115
115
|
"fanout_start",
|
|
116
116
|
"fanout_status",
|
|
117
117
|
"fanout_abort",
|
|
118
|
+
"workflow_start",
|
|
119
|
+
"workflow_status",
|
|
120
|
+
"workflow_list",
|
|
121
|
+
"workflow_resume",
|
|
122
|
+
"workflow_cancel",
|
|
123
|
+
"workflow_steer",
|
|
124
|
+
"workflow_approve",
|
|
125
|
+
"verify_run",
|
|
118
126
|
"council_start",
|
|
119
127
|
"council_status",
|
|
120
128
|
"council_abort",
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@enderfga/claw-orchestrator",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "Claw Orchestrator
|
|
3
|
+
"version": "6.0.0",
|
|
4
|
+
"description": "Claw Orchestrator \u2014 run Claude Code, Codex, Gemini, Cursor Agent, OpenCode and custom coding CLIs as one unified runtime. Drop into Hermes Agent, Claude Desktop, Cursor, Cline, Continue, Zed, Windsurf, Goose or any Model Context Protocol (MCP) host, install as an OpenClaw plugin, or run standalone. Persistent sessions, multi-agent council, ultraplan, ultrareview, autoloop, tool orchestration.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/src/index.js",
|
|
7
7
|
"types": "./dist/src/index.d.ts",
|