@ccdd/project 4.3.0 → 5.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/dist/monitor-ui/assets/{GraphView-6yzqBOLv.js → GraphView-BDrRFY2b.js} +3 -3
- package/dist/monitor-ui/assets/ValidationView-CznEpoWz.js +1 -0
- package/dist/monitor-ui/assets/ValidationView-DBRoun_B.css +1 -0
- package/dist/monitor-ui/assets/{elk-api-BwZQovT5.js → elk-api-BJkhNJwW.js} +1 -1
- package/dist/monitor-ui/assets/{elk.bundled-CQowIhI8.js → elk.bundled-uROSxMms.js} +1 -1
- package/dist/monitor-ui/assets/{index-D0yfhUlt.css → index-CRKnM9pk.css} +1 -1
- package/dist/monitor-ui/assets/index-CTW1fvAj.js +6 -0
- package/dist/monitor-ui/index.html +2 -2
- package/dist/src/artifacts/tool-check.js +1 -3
- package/dist/src/artifacts/tool-check.js.map +1 -1
- package/dist/src/broker/config.js +5 -1
- package/dist/src/broker/config.js.map +1 -1
- package/dist/src/broker/index.d.ts +44 -84
- package/dist/src/broker/index.js +175 -50
- package/dist/src/broker/index.js.map +1 -1
- package/dist/src/broker/polling.d.ts +11 -0
- package/dist/src/broker/polling.js +27 -0
- package/dist/src/broker/polling.js.map +1 -0
- package/dist/src/contracts.d.ts +4 -4
- package/dist/src/definitions.d.ts +3 -1
- package/dist/src/executors/index.js +6 -21
- package/dist/src/executors/index.js.map +1 -1
- package/dist/src/executors/pi.d.ts +3 -1
- package/dist/src/executors/pi.js +2 -0
- package/dist/src/executors/pi.js.map +1 -1
- package/dist/src/executors/telemetry.d.ts +2 -0
- package/dist/src/executors/telemetry.js +12 -0
- package/dist/src/executors/telemetry.js.map +1 -1
- package/dist/src/monitor/actions.d.ts +1 -1
- package/dist/src/monitor/actions.js +3 -3
- package/dist/src/monitor/actions.js.map +1 -1
- package/dist/src/monitor/server.js +10 -5
- package/dist/src/monitor/server.js.map +1 -1
- package/dist/src/monitor/store.js +10 -6
- package/dist/src/monitor/store.js.map +1 -1
- package/dist/src/monitor/types.d.ts +5 -7
- package/dist/src/project/cli.js +47 -24
- package/dist/src/project/cli.js.map +1 -1
- package/dist/src/project/identity.d.ts +6 -1
- package/dist/src/project/identity.js +42 -13
- package/dist/src/project/identity.js.map +1 -1
- package/dist/src/project/index.d.ts +21 -6
- package/dist/src/project/index.js +19 -8
- package/dist/src/project/index.js.map +1 -1
- package/dist/src/project/owner-identity.d.ts +0 -4
- package/dist/src/project/owner-identity.js +5 -3
- package/dist/src/project/owner-identity.js.map +1 -1
- package/dist/src/project/prune.d.ts +12 -0
- package/dist/src/project/prune.js +132 -0
- package/dist/src/project/prune.js.map +1 -0
- package/dist/src/project/query.js +9 -9
- package/dist/src/project/query.js.map +1 -1
- package/dist/src/project/store.d.ts +4 -3
- package/dist/src/project/store.js +12 -7
- package/dist/src/project/store.js.map +1 -1
- package/dist/src/project/types.d.ts +8 -6
- package/dist/src/requester/index.js +1 -1
- package/dist/src/requester/index.js.map +1 -1
- package/dist/src/response-schema.d.ts +13 -0
- package/dist/src/response-schema.js +33 -0
- package/dist/src/response-schema.js.map +1 -0
- package/dist/src/result-view.d.ts +72 -0
- package/dist/src/result-view.js +44 -0
- package/dist/src/result-view.js.map +1 -0
- package/dist/src/review/local-claim.d.ts +1 -1
- package/dist/src/review/local-claim.js.map +1 -1
- package/dist/src/review-result.d.ts +2 -1
- package/dist/src/review-result.js +9 -8
- package/dist/src/review-result.js.map +1 -1
- package/dist/src/state-format.d.ts +8 -0
- package/dist/src/state-format.js +18 -0
- package/dist/src/state-format.js.map +1 -0
- package/dist/src/tools/runner.d.ts +2 -0
- package/dist/src/tools/runner.js +41 -11
- package/dist/src/tools/runner.js.map +1 -1
- package/dist/src/worker-client.d.ts +3 -2
- package/dist/src/worker-client.js +7 -4
- package/dist/src/worker-client.js.map +1 -1
- package/dist/src/worker.js +1 -1
- package/dist/src/worker.js.map +1 -1
- package/package.json +2 -2
- package/dist/monitor-ui/assets/ValidationView-BMqI2XQ5.css +0 -1
- package/dist/monitor-ui/assets/ValidationView-BwHWjMUI.js +0 -1
- package/dist/monitor-ui/assets/index-CoJ9_gC3.js +0 -7
|
@@ -3,7 +3,6 @@ import { tmpdir } from 'node:os';
|
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { fileURLToPath } from 'node:url';
|
|
5
5
|
import { environmentOutputDirectory, runEnvironmentScript } from '../tools/environment.js';
|
|
6
|
-
import { hashExecutionInputs } from '../tools/inputs.js';
|
|
7
6
|
import { scopedPath } from '../tools/paths.js';
|
|
8
7
|
/** Identity scripts use the readiness executor; the snapshot caller owns the read-only workspace lease. */
|
|
9
8
|
export async function ownerIdentity(root, owner, id, strategy, signal) {
|
|
@@ -13,7 +12,10 @@ export async function ownerIdentity(root, owner, id, strategy, signal) {
|
|
|
13
12
|
const script = await scopedPath(cwd, entry);
|
|
14
13
|
if (!(await lstat(script)).isFile())
|
|
15
14
|
throw new Error(`${label} requires a regular entry file.`);
|
|
16
|
-
const
|
|
15
|
+
for (const input of strategy.inputs ?? []) {
|
|
16
|
+
signal?.throwIfAborted();
|
|
17
|
+
await lstat(await scopedPath(cwd, input));
|
|
18
|
+
}
|
|
17
19
|
// Temporary output is never state and is removed even on invalid output, timeout or cancellation.
|
|
18
20
|
const base = await environmentOutputDirectory(root, tmpdir());
|
|
19
21
|
const outputDir = await mkdtemp(join(base, 'ccdd-identity-'));
|
|
@@ -32,7 +34,7 @@ export async function ownerIdentity(root, owner, id, strategy, signal) {
|
|
|
32
34
|
const value = result.stdout.endsWith('\n') ? result.stdout.slice(0, -1) : result.stdout;
|
|
33
35
|
if (value.length < 1 || value.length > 128 || /[^A-Za-z0-9._:-]/.test(value))
|
|
34
36
|
throw new Error(`${label} stdout must be one line of 1–128 characters from [A-Za-z0-9._:-], with only one optional trailing newline.`);
|
|
35
|
-
return {
|
|
37
|
+
return { value };
|
|
36
38
|
}
|
|
37
39
|
finally {
|
|
38
40
|
await rm(outputDir, { recursive: true, force: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"owner-identity.js","sourceRoot":"","sources":["../../../src/project/owner-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC3F,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"owner-identity.js","sourceRoot":"","sources":["../../../src/project/owner-identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface PruneResult {
|
|
2
|
+
removed: string[];
|
|
3
|
+
skippedRequests: string[];
|
|
4
|
+
}
|
|
5
|
+
/** Internal deterministic test seam; not exported by the project SDK. */
|
|
6
|
+
export declare const pruneTestHooks: {
|
|
7
|
+
beforeMove?: (path: string) => void;
|
|
8
|
+
beforeDelete?: () => void;
|
|
9
|
+
removeQuarantine?: (path: string) => void;
|
|
10
|
+
};
|
|
11
|
+
/** Explicit Linux-only pruning with descriptor-anchored moves and private deletion. */
|
|
12
|
+
export declare function pruneProject(stateDir: string): PruneResult;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { assertStateFormat } from '../state-format.js';
|
|
2
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
3
|
+
import { constants, openSync, closeSync, lstatSync, readdirSync, rmSync, renameSync, mkdtempSync, chmodSync } from 'node:fs';
|
|
4
|
+
import { join, relative, sep } from 'node:path';
|
|
5
|
+
import { readStateContext } from '../broker/index.js';
|
|
6
|
+
/** Internal deterministic test seam; not exported by the project SDK. */
|
|
7
|
+
export const pruneTestHooks = {};
|
|
8
|
+
const terminal = new Set(['GREEN', 'RED', 'ERROR', 'INCOMPLETE']);
|
|
9
|
+
const segment = (value) => value !== '.' && value !== '..' && /^[A-Za-z0-9_-]+$/.test(value);
|
|
10
|
+
const transient = (name) => ['output', 'tmp', 'home', 'cache', 'human-tools', 'preparation'].includes(name) || /^tool-output-[A-Za-z0-9]+$/.test(name);
|
|
11
|
+
const anchor = (fd) => `/proc/self/fd/${fd}`;
|
|
12
|
+
const openDirectory = (path) => openSync(path, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW);
|
|
13
|
+
const missing = (error) => ['ENOENT', 'ENOTDIR', 'ELOOP'].includes(error.code ?? '');
|
|
14
|
+
/** Explicit Linux-only pruning with descriptor-anchored moves and private deletion. */
|
|
15
|
+
export function pruneProject(stateDir) {
|
|
16
|
+
if (process.platform !== 'linux')
|
|
17
|
+
throw new Error('Explicit prune requires Linux /proc/self/fd for race-safe deletion. No files were removed.');
|
|
18
|
+
const context = readStateContext(stateDir), root = context.stateDir;
|
|
19
|
+
const relation = relative(context.repoPath, root);
|
|
20
|
+
if (!relation || (!relation.startsWith(`..${sep}`) && relation !== '..'))
|
|
21
|
+
throw new Error('Pruning requires state outside the reviewed repository.');
|
|
22
|
+
const rootFd = openDirectory(root);
|
|
23
|
+
let db, quarantineFd, quarantineName;
|
|
24
|
+
const result = { removed: [], skippedRequests: [] };
|
|
25
|
+
const staged = [];
|
|
26
|
+
let preserveQuarantine = false, failed = false;
|
|
27
|
+
try {
|
|
28
|
+
db = new DatabaseSync(join(anchor(rootFd), 'broker.sqlite'), { timeout: 5000 });
|
|
29
|
+
assertStateFormat(db);
|
|
30
|
+
db.exec('CREATE TABLE IF NOT EXISTS prune_claims (id TEXT PRIMARY KEY, created_at TEXT NOT NULL)');
|
|
31
|
+
const quarantine = mkdtempSync(join(anchor(rootFd), '.prune-'));
|
|
32
|
+
chmodSync(quarantine, 0o700);
|
|
33
|
+
quarantineName = quarantine.split('/').at(-1);
|
|
34
|
+
quarantineFd = openDirectory(quarantine);
|
|
35
|
+
const candidates = db.prepare('SELECT id, run_id FROM requests').all();
|
|
36
|
+
for (const row of candidates) {
|
|
37
|
+
const id = String(row.id), runId = String(row.run_id), fds = [];
|
|
38
|
+
db.exec('BEGIN IMMEDIATE');
|
|
39
|
+
try {
|
|
40
|
+
const eligible = db.prepare('SELECT q.status, r.status AS run_status, o.run_id AS owned FROM requests q JOIN runs r ON r.id = q.run_id LEFT JOIN run_owners o ON o.run_id = r.id WHERE q.id = ?').get(id);
|
|
41
|
+
if (!eligible || !terminal.has(String(eligible.status)) || !terminal.has(String(eligible.run_status)) || eligible.owned != null || !segment(id) || !segment(runId)) {
|
|
42
|
+
result.skippedRequests.push(id);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
// The private quarantine is the exclusive physical claim. Terminal runs
|
|
46
|
+
// cannot reacquire a worker; active/owned runs are excluded under lock.
|
|
47
|
+
db.prepare('INSERT OR IGNORE INTO prune_claims VALUES (?,?)').run(quarantineName, new Date().toISOString());
|
|
48
|
+
try {
|
|
49
|
+
let parent = rootFd;
|
|
50
|
+
for (const part of ['runs', runId, id]) {
|
|
51
|
+
parent = openDirectory(join(anchor(parent), part));
|
|
52
|
+
fds.push(parent);
|
|
53
|
+
}
|
|
54
|
+
for (const name of readdirSync(anchor(parent))) {
|
|
55
|
+
if (!transient(name))
|
|
56
|
+
continue;
|
|
57
|
+
const source = join(anchor(parent), name), before = lstatSync(source);
|
|
58
|
+
const movedName = String(staged.length), destination = join(anchor(quarantineFd), movedName);
|
|
59
|
+
pruneTestHooks.beforeMove?.(join(root, 'runs', runId, id, name));
|
|
60
|
+
renameSync(source, destination);
|
|
61
|
+
const moved = lstatSync(destination);
|
|
62
|
+
if (before.dev !== moved.dev || before.ino !== moved.ino) {
|
|
63
|
+
// Never overwrite a replacement at source or delete suspect data.
|
|
64
|
+
preserveQuarantine = true;
|
|
65
|
+
throw new Error(`Scratch entry changed during prune; preserved in ${join(root, quarantineName, movedName)}.`);
|
|
66
|
+
}
|
|
67
|
+
staged.push({ name: movedName, original: join('runs', runId, id, name) });
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
if (!missing(error))
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
db.exec('COMMIT');
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
db.exec('ROLLBACK');
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
for (const fd of fds.reverse())
|
|
83
|
+
closeSync(fd);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Recursive deletion holds no write transaction or broker lock.
|
|
87
|
+
pruneTestHooks.beforeDelete?.();
|
|
88
|
+
for (const entry of staged) {
|
|
89
|
+
rmSync(join(anchor(quarantineFd), entry.name), { recursive: true, force: true });
|
|
90
|
+
result.removed.push(entry.original);
|
|
91
|
+
}
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
failed = true;
|
|
96
|
+
preserveQuarantine = true;
|
|
97
|
+
throw error;
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
let cleanupFailed = false, cleanupError;
|
|
101
|
+
const cleanup = (action) => {
|
|
102
|
+
try {
|
|
103
|
+
action();
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
if (!cleanupFailed)
|
|
107
|
+
cleanupError = error;
|
|
108
|
+
cleanupFailed = true;
|
|
109
|
+
preserveQuarantine = true;
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
// Each resource gets its own attempt. A cleanup error must neither strand
|
|
113
|
+
// later resources nor replace an error from the operation itself.
|
|
114
|
+
cleanup(() => { if (quarantineFd !== undefined)
|
|
115
|
+
closeSync(quarantineFd); });
|
|
116
|
+
cleanup(() => {
|
|
117
|
+
if (!quarantineName || preserveQuarantine)
|
|
118
|
+
return;
|
|
119
|
+
const directory = join(anchor(rootFd), quarantineName);
|
|
120
|
+
if (pruneTestHooks.removeQuarantine)
|
|
121
|
+
pruneTestHooks.removeQuarantine(directory);
|
|
122
|
+
else
|
|
123
|
+
rmSync(directory, { recursive: true, force: true });
|
|
124
|
+
db?.prepare('DELETE FROM prune_claims WHERE id = ?').run(quarantineName);
|
|
125
|
+
});
|
|
126
|
+
cleanup(() => { db?.close(); });
|
|
127
|
+
cleanup(() => { closeSync(rootFd); });
|
|
128
|
+
if (!failed && cleanupFailed)
|
|
129
|
+
throw cleanupError;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=prune.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prune.js","sourceRoot":"","sources":["../../../src/project/prune.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,23 +27,23 @@ export function includedCritics(snapshot, selection, recursive) {
|
|
|
27
27
|
}
|
|
28
28
|
/** Pull actual evidence once; dependency traversal never calls back into Critic evaluation. */
|
|
29
29
|
export function queryProject(snapshot, history, options = {}) {
|
|
30
|
-
if (snapshot.version !==
|
|
31
|
-
throw new Error('
|
|
30
|
+
if (snapshot.version !== 3)
|
|
31
|
+
throw new Error('Invalid validation input format.');
|
|
32
32
|
createGraphDefinition(snapshot.config);
|
|
33
33
|
const selection = options.selection ?? { kind: 'all' }, required = requiredArtifacts(snapshot, selection);
|
|
34
34
|
const byKey = new Map(), byRunKey = new Map(), byCritic = new Map();
|
|
35
|
-
for (const evidence of [...history].filter(e => e.input.version ===
|
|
35
|
+
for (const evidence of [...history].filter(e => e.input.version === 3).sort((a, b) => a.completedAt.localeCompare(b.completedAt))) {
|
|
36
36
|
const key = `${evidence.criticId}:${evidence.input.key}`;
|
|
37
37
|
byKey.set(key, evidence);
|
|
38
38
|
byCritic.set(evidence.criticId, evidence);
|
|
39
|
-
if (evidence.runId === options.runId)
|
|
39
|
+
if (evidence.runId === options.runId || options.coalescedRequestIds?.includes(evidence.requestId))
|
|
40
40
|
byRunKey.set(key, evidence);
|
|
41
41
|
}
|
|
42
42
|
const attempts = new Map(options.attempts?.map(request => [request.criticId, request])), forced = new Set(options.forceCriticIds ?? []);
|
|
43
43
|
const requiredSet = new Set(required);
|
|
44
44
|
const critics = snapshot.config.critics.filter(definition => requiredSet.has(definition.target)).map(definition => {
|
|
45
45
|
const id = definition.id, input = snapshot.inputs[id];
|
|
46
|
-
if (!input || input.version !==
|
|
46
|
+
if (!input || input.version !== 3)
|
|
47
47
|
throw new Error(`Missing current validation input: ${id}`);
|
|
48
48
|
const key = `${id}:${input.key}`, evidence = (input.reusable && !forced.has(id) ? byKey : byRunKey).get(key) ?? null;
|
|
49
49
|
const attempt = attempts.get(id), ownPass = evidence?.verdict === 'GREEN';
|
|
@@ -62,7 +62,7 @@ export function queryProject(snapshot, history, options = {}) {
|
|
|
62
62
|
}
|
|
63
63
|
else if (evidence?.verdict === 'RED') {
|
|
64
64
|
status = 'RED';
|
|
65
|
-
reason = evidence.
|
|
65
|
+
reason = `Actual RED evidence ${evidence.requestId} matches this input.`;
|
|
66
66
|
}
|
|
67
67
|
else if (forced.has(id)) {
|
|
68
68
|
status = 'STALE';
|
|
@@ -80,8 +80,8 @@ export function queryProject(snapshot, history, options = {}) {
|
|
|
80
80
|
status = 'UNREVIEWED';
|
|
81
81
|
reason = 'No actual review has been recorded for this input.';
|
|
82
82
|
}
|
|
83
|
-
return { id, title: definition.title, target: definition.target, deps: [...definition.deps], status, isStale: status !== 'PASS', needsReview: !
|
|
84
|
-
canExecute: !
|
|
83
|
+
return { id, title: definition.title, target: definition.target, deps: [...definition.deps], status, isStale: status !== 'PASS', needsReview: !evidence,
|
|
84
|
+
canExecute: !evidence && !attempt, blockedBy: [], reason, input, result: evidence, requestId: attempt?.id ?? null };
|
|
85
85
|
});
|
|
86
86
|
const own = new Map(required.map(id => [id, critics.filter(c => c.target === id)]));
|
|
87
87
|
const ownSatisfied = (id) => snapshot.config.artifacts[id].basis === true || own.get(id).length > 0 && own.get(id).every(c => c.status === 'PASS');
|
|
@@ -103,7 +103,7 @@ export function planProject(snapshot, history, options = {}) {
|
|
|
103
103
|
const selection = options.selection ?? { kind: 'all' }, selectedCriticIds = selectedCritics(snapshot, selection), includedCriticIds = includedCritics(snapshot, selection, Boolean(options.recursive));
|
|
104
104
|
const query = queryProject(snapshot, history, { ...options, selection, forceCriticIds: options.force ? selectedCriticIds : options.forceCriticIds });
|
|
105
105
|
const items = query.critics.filter(c => includedCriticIds.includes(c.id)).map(c => {
|
|
106
|
-
const action = (c.
|
|
106
|
+
const action = (c.result ? 'REUSE' : ['QUEUED', 'RUNNING', 'WAITING_HUMAN'].includes(c.status) ? 'ACTIVE' : c.canExecute ? 'EXECUTE' : c.requestId ? 'FAILED' : 'WAIT');
|
|
107
107
|
return { ...c, action };
|
|
108
108
|
});
|
|
109
109
|
return { ...query, recursive: Boolean(options.recursive), force: Boolean(options.force), selectedCriticIds, includedCriticIds, items,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/project/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAG1D,MAAM,UAAU,eAAe,CAAC,QAAyC,EAAE,SAA2B;IACpG,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC/B,IAAI,SAAS,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACnE,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrH,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC;IACzH,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAyC,EAAE,SAA2B;IACtG,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,QAAQ,CAAE,CAAC,MAAM,CAAC,CAAC;IACpN,OAAO,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAyC,EAAE,SAA2B,EAAE,SAAkB;IACxH,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACtD,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,QAAQ,CAAC;IAC5D,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IAC9D,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,YAAY,CAAC,QAAyB,EAAE,OAAsC,EAAE,OAAO,GAAiB,EAAE;IACxH,IAAI,QAAQ,CAAC,OAAO,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/project/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type ResultDetail, type ResultOptions } from '../result-view.js';
|
|
1
2
|
import { DatabaseSync } from 'node:sqlite';
|
|
2
3
|
import type { ReviewRequest } from '../contracts.js';
|
|
3
4
|
import type { RunView } from '../broker/index.js';
|
|
@@ -5,11 +6,11 @@ import type { ValidationEvidence, ProjectPlan } from './types.js';
|
|
|
5
6
|
export declare function readEvidence(database: DatabaseSync): ValidationEvidence[];
|
|
6
7
|
/** Existing databases only; no migrations, ownership reconciliation or write connection. */
|
|
7
8
|
export declare function withProjectStore<T>(stateDir: string, read: (database: DatabaseSync) => T, empty: T): T;
|
|
8
|
-
export declare function projectHistory(stateDir: string): ValidationEvidence[];
|
|
9
|
+
export declare function projectHistory<D extends ResultDetail = 'compact'>(stateDir: string, options?: ResultOptions<D>): import("../result-view.js").ResultView<D, ValidationEvidence, import("../result-view.js").RequesterResult>[];
|
|
9
10
|
export type ProjectRunView = RunView & {
|
|
10
11
|
validation?: ProjectPlan;
|
|
11
12
|
};
|
|
12
13
|
export declare function storedRun(database: DatabaseSync, id: string): ProjectRunView | null;
|
|
13
14
|
export declare function projectRun(stateDir: string, id: string): ProjectRunView | null;
|
|
14
|
-
export declare function projectRuns(stateDir: string): ProjectRunView[];
|
|
15
|
-
export declare function projectRequests(stateDir: string, runId?: string): ReviewRequest[];
|
|
15
|
+
export declare function projectRuns<D extends ResultDetail = 'compact'>(stateDir: string, options?: ResultOptions<D>): import("../result-view.js").ResultView<D, ProjectRunView, import("../result-view.js").RequesterRun>[];
|
|
16
|
+
export declare function projectRequests<D extends ResultDetail = 'compact'>(stateDir: string, runId?: string, options?: ResultOptions<D>): import("../result-view.js").ResultView<D, ReviewRequest, import("../result-view.js").RequesterRequest>[];
|
|
@@ -1,14 +1,17 @@
|
|
|
1
|
+
import { assertStateFormat } from '../state-format.js';
|
|
2
|
+
import { semanticResult } from '../response-schema.js';
|
|
3
|
+
import { requesterRun, requesterRequest, requesterEvidence, resultView } from '../result-view.js';
|
|
1
4
|
import { DatabaseSync } from 'node:sqlite';
|
|
2
5
|
import { existsSync } from 'node:fs';
|
|
3
6
|
import { join } from 'node:path';
|
|
4
7
|
import { planProject } from './query.js';
|
|
5
8
|
export function readEvidence(database) {
|
|
6
|
-
const rows = database.prepare("SELECT data FROM requests WHERE status IN ('GREEN','RED') AND json_extract(data, '$.validationInput.version') =
|
|
9
|
+
const rows = database.prepare("SELECT data FROM requests WHERE status IN ('GREEN','RED') AND json_extract(data, '$.validationInput.version') = 3 ORDER BY json_extract(data, '$.completedAt'), rowid").all();
|
|
7
10
|
return rows.flatMap(row => {
|
|
8
11
|
const request = JSON.parse(String(row.data));
|
|
9
12
|
if (!request.validationInput || !/^[a-f0-9]{64}$/.test(request.validationInput.key) || !request.result || request.result.verdict !== request.status || !request.completedAt)
|
|
10
13
|
return [];
|
|
11
|
-
return [{ requestId: request.id, runId: request.runId, criticId: request.criticId, input: request.validationInput, completedAt: request.completedAt, verdict: request.result.verdict,
|
|
14
|
+
return [{ requestId: request.id, runId: request.runId, criticId: request.criticId, input: request.validationInput, completedAt: request.completedAt, verdict: request.result.verdict, result: semanticResult(request.result) }];
|
|
12
15
|
});
|
|
13
16
|
}
|
|
14
17
|
/** Existing databases only; no migrations, ownership reconciliation or write connection. */
|
|
@@ -20,6 +23,7 @@ export function withProjectStore(stateDir, read, empty) {
|
|
|
20
23
|
const database = new DatabaseSync(filename, { readOnly: true, timeout: 5000 });
|
|
21
24
|
try {
|
|
22
25
|
database.exec('BEGIN');
|
|
26
|
+
assertStateFormat(database);
|
|
23
27
|
const result = read(database);
|
|
24
28
|
database.exec('COMMIT');
|
|
25
29
|
return result;
|
|
@@ -28,21 +32,22 @@ export function withProjectStore(stateDir, read, empty) {
|
|
|
28
32
|
database.close();
|
|
29
33
|
}
|
|
30
34
|
}
|
|
31
|
-
export function projectHistory(stateDir) { return withProjectStore(stateDir, readEvidence, []); }
|
|
35
|
+
export function projectHistory(stateDir, options = {}) { return withProjectStore(stateDir, db => readEvidence(db).map(evidence => resultView(options, evidence, () => requesterEvidence(evidence, stateDir))), []); }
|
|
32
36
|
export function storedRun(database, id) {
|
|
33
37
|
const row = database.prepare('SELECT data FROM runs WHERE id = ?').get(id);
|
|
34
38
|
if (!row)
|
|
35
39
|
return null;
|
|
36
40
|
const run = JSON.parse(String(row.data));
|
|
37
41
|
const requests = database.prepare('SELECT data FROM requests WHERE run_id = ? ORDER BY ordinal').all(id).map(row => JSON.parse(String(row.data)));
|
|
42
|
+
const shared = (run.project?.coalescedRequestIds ?? []).flatMap(id => { const row = database.prepare('SELECT data FROM requests WHERE id = ?').get(id); return row ? [JSON.parse(String(row.data))] : []; });
|
|
38
43
|
const events = database.prepare('SELECT * FROM (SELECT * FROM events WHERE run_id = ? ORDER BY id DESC LIMIT 500) ORDER BY id').all(id).map(event => ({ id: Number(event.id), runId: String(event.run_id), requestId: event.request_id === null ? null : String(event.request_id), createdAt: String(event.created_at), type: String(event.type), message: String(event.message), ...(event.data ? { data: JSON.parse(String(event.data)) } : {}) }));
|
|
39
44
|
const owner = database.prepare('SELECT pid, claimed_at FROM run_owners WHERE run_id = ?').get(id);
|
|
40
45
|
return { ...run, scope: run.scope ?? { kind: run.graph ? 'graph' : 'chain' }, requests, events, owner: owner ? { pid: Number(owner.pid), claimedAt: String(owner.claimed_at) } : null,
|
|
41
|
-
...(run.project?.version ===
|
|
46
|
+
...(run.project?.version === 3 ? { validation: planProject(run.project.snapshot, readEvidence(database).filter(e => !run.project.evidenceRequestIds || run.project.evidenceRequestIds.includes(e.requestId)), { selection: run.project.selection, recursive: run.project.recursive, force: run.project.force, runId: id, coalescedRequestIds: run.project.coalescedRequestIds, attempts: [...requests, ...shared] }) } : {}) };
|
|
42
47
|
}
|
|
43
48
|
export function projectRun(stateDir, id) { return withProjectStore(stateDir, db => storedRun(db, id), null); }
|
|
44
|
-
export function projectRuns(stateDir) { return withProjectStore(stateDir, db => db.prepare('SELECT id FROM runs ORDER BY created_at DESC, rowid DESC').all().map(row => storedRun(db, String(row.id))), []); }
|
|
45
|
-
export function projectRequests(stateDir, runId) {
|
|
46
|
-
return withProjectStore(stateDir, db => (runId ? db.prepare('SELECT data FROM requests WHERE run_id = ? ORDER BY ordinal').all(runId) : db.prepare("SELECT data FROM requests ORDER BY json_extract(data, '$.createdAt') DESC, rowid DESC").all()).map(row => JSON.parse(String(row.data))), []);
|
|
49
|
+
export function projectRuns(stateDir, options = {}) { return withProjectStore(stateDir, db => db.prepare('SELECT id FROM runs ORDER BY created_at DESC, rowid DESC').all().map(row => { const run = storedRun(db, String(row.id)); return resultView(options, run, () => requesterRun(run, stateDir)); }), []); }
|
|
50
|
+
export function projectRequests(stateDir, runId, options = {}) {
|
|
51
|
+
return withProjectStore(stateDir, db => (runId ? db.prepare('SELECT data FROM requests WHERE run_id = ? ORDER BY ordinal').all(runId) : db.prepare("SELECT data FROM requests ORDER BY json_extract(data, '$.createdAt') DESC, rowid DESC").all()).map(row => { const request = JSON.parse(String(row.data)); return resultView(options, request, () => requesterRequest(request, stateDir)); }), []);
|
|
47
52
|
}
|
|
48
53
|
//# sourceMappingURL=store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/project/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,UAAU,YAAY,CAAC,QAAsB;IACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,uKAAuK,CAAC,CAAC,GAAG,EAAE,CAAC;IAC7M,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAkB,CAAC;QAC9D,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW;YAAE,OAAO,EAAE,CAAC;QACvL,OAAO,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,eAAe,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/project/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ export type ProjectSelection = {
|
|
|
9
9
|
criticId: string;
|
|
10
10
|
};
|
|
11
11
|
export interface ValidationInput {
|
|
12
|
-
version:
|
|
12
|
+
version: 3;
|
|
13
13
|
key: string;
|
|
14
14
|
criticHash: string;
|
|
15
15
|
target: {
|
|
@@ -21,7 +21,7 @@ export interface ValidationInput {
|
|
|
21
21
|
hash: string;
|
|
22
22
|
}[];
|
|
23
23
|
reusable: boolean;
|
|
24
|
-
/** Omitted for
|
|
24
|
+
/** Omitted for default content verification. Included in default Artifact identity. */
|
|
25
25
|
workspaceIntegrity?: WorkspaceIntegrity;
|
|
26
26
|
}
|
|
27
27
|
export interface ArtifactIdentity {
|
|
@@ -29,7 +29,7 @@ export interface ArtifactIdentity {
|
|
|
29
29
|
value: string;
|
|
30
30
|
}
|
|
31
31
|
export interface ProjectSnapshot {
|
|
32
|
-
version:
|
|
32
|
+
version: 3;
|
|
33
33
|
config: RepoConfig;
|
|
34
34
|
snapshotHash: string;
|
|
35
35
|
artifactIdentities?: Record<string, ArtifactIdentity>;
|
|
@@ -45,11 +45,10 @@ export interface ValidationEvidence {
|
|
|
45
45
|
input: ValidationInput;
|
|
46
46
|
completedAt: string;
|
|
47
47
|
verdict: ReviewResult['verdict'];
|
|
48
|
-
|
|
49
|
-
evidence: string[];
|
|
48
|
+
result: ReviewResult;
|
|
50
49
|
}
|
|
51
50
|
export interface ProjectRunDefinition {
|
|
52
|
-
version:
|
|
51
|
+
version: 3;
|
|
53
52
|
snapshot: ProjectSnapshot;
|
|
54
53
|
selection: ProjectSelection;
|
|
55
54
|
recursive: boolean;
|
|
@@ -58,6 +57,8 @@ export interface ProjectRunDefinition {
|
|
|
58
57
|
templates: ReviewEnvelope[];
|
|
59
58
|
/** Original evidence consumed by a completed execution; never a cached stale flag. */
|
|
60
59
|
evidenceRequestIds?: string[];
|
|
60
|
+
/** Existing active requests adopted by this Run; never duplicate executions. */
|
|
61
|
+
coalescedRequestIds?: string[];
|
|
61
62
|
}
|
|
62
63
|
export type ValidationStatus = 'PASS' | 'BASIS' | 'UNREVIEWED' | 'STALE' | 'RED' | 'ERROR' | 'INCOMPLETE' | 'QUEUED' | 'RUNNING' | 'WAITING_HUMAN';
|
|
63
64
|
export interface CriticValidation {
|
|
@@ -114,5 +115,6 @@ export interface QueryOptions {
|
|
|
114
115
|
selection?: ProjectSelection;
|
|
115
116
|
forceCriticIds?: readonly string[];
|
|
116
117
|
runId?: string;
|
|
118
|
+
coalescedRequestIds?: readonly string[];
|
|
117
119
|
attempts?: readonly ReviewRequest[];
|
|
118
120
|
}
|
|
@@ -17,7 +17,7 @@ export async function prepareReviewRequests({ repoPath, repoId = 'local', snapsh
|
|
|
17
17
|
const request = structuredClone({ repoId, snapshotHash, criticId: critic.id, title: critic.title,
|
|
18
18
|
...resolveArtifactScope(config.artifacts, [critic.target, ...critic.deps]), configManifest: config.configManifest,
|
|
19
19
|
references: critic.references, requiredObservations: [critic.target, ...critic.deps],
|
|
20
|
-
payload: critic.payload, profile: critic.profile, target: critic.target, deps: critic.deps });
|
|
20
|
+
payload: critic.payload, ...(critic.passSchema ? { passSchema: critic.passSchema } : {}), ...(critic.failSchema ? { failSchema: critic.failSchema } : {}), profile: critic.profile, target: critic.target, deps: critic.deps });
|
|
21
21
|
assertArtifactAudience(request);
|
|
22
22
|
return request;
|
|
23
23
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/requester/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAkH;IAChO,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IACtJ,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IAC7J,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9J,MAAM,MAAM,GAAG,cAAc,IAAI,CAAC,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9E,MAAM,OAAO,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;IACxG,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;IAC9F,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;QAC1B,MAAM,OAAO,GAAmB,eAAe,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK;YAC9G,GAAG,oBAAoB,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc;YACjH,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,oBAAoB,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;YACpF,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/requester/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAkH;IAChO,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IACtJ,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IAC7J,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9J,MAAM,MAAM,GAAG,cAAc,IAAI,CAAC,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;IAC9E,MAAM,OAAO,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;IACxG,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;IAC9F,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;QAC1B,MAAM,OAAO,GAAmB,eAAe,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK;YAC9G,GAAG,oBAAoB,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc;YACjH,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,oBAAoB,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;YACpF,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAClO,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { JsonSchema } from './tools/contracts.js';
|
|
2
|
+
export interface ResponseSchemas {
|
|
3
|
+
passSchema?: JsonSchema;
|
|
4
|
+
failSchema?: JsonSchema;
|
|
5
|
+
}
|
|
6
|
+
export declare const auditFields: Set<string>;
|
|
7
|
+
/** Owner schemas describe extra top-level result fields, never transport or audit fields. */
|
|
8
|
+
export declare function validateResponseSchema(schema: unknown): asserts schema is JsonSchema;
|
|
9
|
+
export declare function finalResultSchema(schemas?: ResponseSchemas): JsonSchema;
|
|
10
|
+
export declare function semanticResult(result: Record<string, unknown>): Record<string, unknown>;
|
|
11
|
+
export declare function validateFinalResult(value: unknown, schemas?: ResponseSchemas): Record<string, unknown> & {
|
|
12
|
+
verdict: 'GREEN' | 'RED';
|
|
13
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Compile } from 'typebox/compile';
|
|
2
|
+
import { jsonCopy, object, validateSchema } from './tools/schema.js';
|
|
3
|
+
export const auditFields = new Set(['provider', 'model', 'stdout', 'stderr', 'durationMs', 'exitCode', 'toolCalls']);
|
|
4
|
+
const reserved = new Set(['verdict', 'reference', 'reusedFrom', ...auditFields]);
|
|
5
|
+
/** Owner schemas describe extra top-level result fields, never transport or audit fields. */
|
|
6
|
+
export function validateResponseSchema(schema) {
|
|
7
|
+
validateSchema(schema);
|
|
8
|
+
if (['allOf', 'anyOf', 'oneOf', 'not'].some(key => Object.hasOwn(schema, key)))
|
|
9
|
+
throw new Error('Response schemas cannot use top-level composition; compose schemas inside owner fields instead.');
|
|
10
|
+
if (Object.keys(schema.properties ?? {}).some(key => reserved.has(key)))
|
|
11
|
+
throw new Error('Response schemas cannot declare reserved result fields.');
|
|
12
|
+
if ((schema.required ?? []).some(key => reserved.has(key)))
|
|
13
|
+
throw new Error('Response schemas cannot require reserved result fields.');
|
|
14
|
+
if (schema.additionalProperties !== undefined && schema.additionalProperties !== false)
|
|
15
|
+
throw new Error('Response schemas must forbid undeclared top-level fields.');
|
|
16
|
+
}
|
|
17
|
+
export function finalResultSchema(schemas = {}) {
|
|
18
|
+
const branch = (verdict, schema) => ({
|
|
19
|
+
...schema, type: 'object', additionalProperties: false,
|
|
20
|
+
properties: { ...schema?.properties, verdict: { const: verdict, type: 'string' } },
|
|
21
|
+
required: ['verdict', ...(schema?.required ?? [])],
|
|
22
|
+
});
|
|
23
|
+
return { type: 'object', oneOf: [branch('GREEN', schemas.passSchema), branch('RED', schemas.failSchema)] };
|
|
24
|
+
}
|
|
25
|
+
export function semanticResult(result) {
|
|
26
|
+
return Object.fromEntries(Object.entries(result).filter(([key]) => !auditFields.has(key)));
|
|
27
|
+
}
|
|
28
|
+
export function validateFinalResult(value, schemas = {}) {
|
|
29
|
+
if (!object(value) || !Compile(finalResultSchema(schemas)).Check(value))
|
|
30
|
+
throw new Error('Review result does not match the verdict and owner response schema.');
|
|
31
|
+
return jsonCopy(value);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=response-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-schema.js","sourceRoot":"","sources":["../../src/response-schema.ts"],"names":[],"mappings":"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"}
|