@ccdd/project 5.1.2 → 6.0.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/monitor-ui/assets/{GraphView-BILt_jGR.js → GraphView-Dvqux-3b.js} +3 -3
- package/dist/monitor-ui/assets/ValidationView-ksCr_lB7.css +1 -0
- package/dist/monitor-ui/assets/ValidationView-qhnNfj00.js +1 -0
- package/dist/monitor-ui/assets/{elk-api-CW6DDhyE.js → elk-api-D1k8qsLm.js} +1 -1
- package/dist/monitor-ui/assets/{elk.bundled-WR-av3nY.js → elk.bundled-DgeQWR_s.js} +1 -1
- package/dist/monitor-ui/assets/{index-Drtw0yLv.js → index-beXagC6U.js} +3 -3
- package/dist/monitor-ui/index.html +1 -1
- package/dist/src/artifacts/scope.d.ts +1 -1
- package/dist/src/artifacts/scope.js +2 -2
- package/dist/src/artifacts/scope.js.map +1 -1
- package/dist/src/broker/admission.d.ts +19 -0
- package/dist/src/broker/admission.js +33 -0
- package/dist/src/broker/admission.js.map +1 -0
- package/dist/src/broker/changes.d.ts +25 -0
- package/dist/src/broker/changes.js +27 -0
- package/dist/src/broker/changes.js.map +1 -0
- package/dist/src/broker/coalescing.d.ts +1 -0
- package/dist/src/broker/coalescing.js +5 -3
- package/dist/src/broker/coalescing.js.map +1 -1
- package/dist/src/broker/graph.d.ts +1 -1
- package/dist/src/broker/graph.js +1 -1
- package/dist/src/broker/graph.js.map +1 -1
- package/dist/src/broker/index.d.ts +29 -3
- package/dist/src/broker/index.js +263 -307
- package/dist/src/broker/index.js.map +1 -1
- package/dist/src/broker/readiness.d.ts +17 -0
- package/dist/src/broker/readiness.js +252 -0
- package/dist/src/broker/readiness.js.map +1 -0
- package/dist/src/broker/storage.d.ts +101 -0
- package/dist/src/broker/storage.js +315 -0
- package/dist/src/broker/storage.js.map +1 -0
- package/dist/src/contracts.d.ts +1 -1
- package/dist/src/monitor/store.js +6 -4
- package/dist/src/monitor/store.js.map +1 -1
- package/dist/src/monitor/ui/format.js +1 -1
- package/dist/src/monitor/ui/format.js.map +1 -1
- package/dist/src/project/cli.js +8 -7
- package/dist/src/project/cli.js.map +1 -1
- package/dist/src/project/gates.d.ts +6 -0
- package/dist/src/project/gates.js +33 -0
- package/dist/src/project/gates.js.map +1 -0
- package/dist/src/project/index.d.ts +2 -1
- package/dist/src/project/index.js +2 -2
- package/dist/src/project/index.js.map +1 -1
- package/dist/src/project/query.js +35 -8
- package/dist/src/project/query.js.map +1 -1
- package/dist/src/project/store.d.ts +1 -1
- package/dist/src/project/store.js +29 -17
- package/dist/src/project/store.js.map +1 -1
- package/dist/src/project/types.d.ts +7 -3
- package/dist/src/requester/index.d.ts +3 -2
- package/dist/src/requester/index.js +6 -5
- package/dist/src/requester/index.js.map +1 -1
- package/dist/src/state-format.js +2 -2
- package/package.json +2 -2
- package/dist/monitor-ui/assets/ValidationView-D18mwExY.css +0 -1
- package/dist/monitor-ui/assets/ValidationView-L-a3hI_A.js +0 -1
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { DatabaseSync } from 'node:sqlite';
|
|
2
|
+
import type { ReviewRequest } from '../contracts.js';
|
|
3
|
+
import type { RunRecord } from './index.js';
|
|
4
|
+
export declare const storageTestHooks: {
|
|
5
|
+
read?: (bytes: number) => void;
|
|
6
|
+
write?: (bytes: number) => void;
|
|
7
|
+
};
|
|
8
|
+
export declare function initializeRecords(db: DatabaseSync): void;
|
|
9
|
+
export declare function records(db: DatabaseSync): {
|
|
10
|
+
put: (value: unknown) => string;
|
|
11
|
+
get: <T>(hash: string) => T;
|
|
12
|
+
packRun: (run: RunRecord) => {
|
|
13
|
+
workspaceRef: string;
|
|
14
|
+
definitionRef: string;
|
|
15
|
+
projectionRef: string;
|
|
16
|
+
project?: {
|
|
17
|
+
version: 3;
|
|
18
|
+
selection: import("../project/types.js").ProjectSelection;
|
|
19
|
+
recursive: boolean;
|
|
20
|
+
force: boolean;
|
|
21
|
+
ignoreGates: boolean | undefined;
|
|
22
|
+
} | undefined;
|
|
23
|
+
id: string;
|
|
24
|
+
repoId: string;
|
|
25
|
+
snapshotHash: string;
|
|
26
|
+
requesterId: string;
|
|
27
|
+
scope?: {
|
|
28
|
+
kind: 'graph';
|
|
29
|
+
} | {
|
|
30
|
+
kind: 'chain';
|
|
31
|
+
} | {
|
|
32
|
+
kind: 'critic';
|
|
33
|
+
criticId: string;
|
|
34
|
+
} | {
|
|
35
|
+
kind: 'project';
|
|
36
|
+
};
|
|
37
|
+
status: import("../contracts.js").RunStatus;
|
|
38
|
+
coalescingGraceMs?: number;
|
|
39
|
+
createdAt: string;
|
|
40
|
+
completedAt?: string;
|
|
41
|
+
error?: string;
|
|
42
|
+
};
|
|
43
|
+
prepareRun: (run: RunRecord, signal?: AbortSignal) => Promise<{
|
|
44
|
+
verify: () => void;
|
|
45
|
+
header: {
|
|
46
|
+
workspaceRef: string;
|
|
47
|
+
definitionRef: string;
|
|
48
|
+
projectionRef: string;
|
|
49
|
+
project: {
|
|
50
|
+
version: 3;
|
|
51
|
+
selection: import("../project/types.js").ProjectSelection;
|
|
52
|
+
recursive: boolean;
|
|
53
|
+
force: boolean;
|
|
54
|
+
ignoreGates: boolean | undefined;
|
|
55
|
+
};
|
|
56
|
+
id: string;
|
|
57
|
+
repoId: string;
|
|
58
|
+
snapshotHash: string;
|
|
59
|
+
requesterId: string;
|
|
60
|
+
scope?: {
|
|
61
|
+
kind: 'graph';
|
|
62
|
+
} | {
|
|
63
|
+
kind: 'chain';
|
|
64
|
+
} | {
|
|
65
|
+
kind: 'critic';
|
|
66
|
+
criticId: string;
|
|
67
|
+
} | {
|
|
68
|
+
kind: 'project';
|
|
69
|
+
};
|
|
70
|
+
status: import("../contracts.js").RunStatus;
|
|
71
|
+
coalescingGraceMs?: number;
|
|
72
|
+
createdAt: string;
|
|
73
|
+
completedAt?: string;
|
|
74
|
+
error?: string;
|
|
75
|
+
};
|
|
76
|
+
inputs: Map<string, string>;
|
|
77
|
+
envelopes: Map<string, string>;
|
|
78
|
+
}>;
|
|
79
|
+
packRequest: (request: ReviewRequest) => {
|
|
80
|
+
criticId: string;
|
|
81
|
+
target: string;
|
|
82
|
+
profile: {
|
|
83
|
+
kind: "agent" | "human" | "runtime";
|
|
84
|
+
provider?: string | undefined;
|
|
85
|
+
model?: string | undefined;
|
|
86
|
+
};
|
|
87
|
+
envelopeRef: string;
|
|
88
|
+
workspaceRef: string;
|
|
89
|
+
inputRef: string | null;
|
|
90
|
+
inputKey: string | null;
|
|
91
|
+
inputVersion: 3 | null;
|
|
92
|
+
title: string;
|
|
93
|
+
snapshotHash: string;
|
|
94
|
+
deps: string[];
|
|
95
|
+
resultRef: string | null;
|
|
96
|
+
semanticRef: string | null;
|
|
97
|
+
};
|
|
98
|
+
run: (id: string, full?: boolean) => RunRecord | null;
|
|
99
|
+
request: (id: string, full?: boolean) => ReviewRequest | null;
|
|
100
|
+
clear: () => void;
|
|
101
|
+
};
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import { semanticResult } from '../response-schema.js';
|
|
2
|
+
import { canonical } from '../project/identity.js';
|
|
3
|
+
import { setImmediate as yieldTurn } from 'node:timers/promises';
|
|
4
|
+
import { createHash } from 'node:crypto';
|
|
5
|
+
export const storageTestHooks = {};
|
|
6
|
+
export function initializeRecords(db) {
|
|
7
|
+
db.exec(`CREATE TABLE IF NOT EXISTS definitions(hash TEXT PRIMARY KEY, data TEXT NOT NULL);
|
|
8
|
+
CREATE TABLE IF NOT EXISTS run_members(run_id TEXT NOT NULL REFERENCES runs(id), critic_id TEXT NOT NULL, ordinal INTEGER NOT NULL,
|
|
9
|
+
target TEXT NOT NULL, input_key TEXT NOT NULL, input_ref TEXT NOT NULL, envelope_ref TEXT,
|
|
10
|
+
request_id TEXT, evidence_id TEXT, state TEXT NOT NULL, included INTEGER NOT NULL,
|
|
11
|
+
PRIMARY KEY(run_id,critic_id));
|
|
12
|
+
CREATE INDEX IF NOT EXISTS members_request ON run_members(request_id,run_id);
|
|
13
|
+
CREATE INDEX IF NOT EXISTS members_input ON run_members(critic_id,input_key);
|
|
14
|
+
CREATE INDEX IF NOT EXISTS members_pending ON run_members(run_id,state,request_id);
|
|
15
|
+
CREATE INDEX IF NOT EXISTS members_evidence ON run_members(run_id,evidence_id) WHERE evidence_id IS NOT NULL;
|
|
16
|
+
CREATE TABLE IF NOT EXISTS shared_members(run_id TEXT NOT NULL,critic_id TEXT NOT NULL,request_id TEXT NOT NULL,source_run_id TEXT NOT NULL,PRIMARY KEY(run_id,critic_id));
|
|
17
|
+
CREATE INDEX IF NOT EXISTS shared_request ON shared_members(request_id);
|
|
18
|
+
CREATE INDEX IF NOT EXISTS members_run_state ON run_members(run_id,state,ordinal);
|
|
19
|
+
CREATE TABLE IF NOT EXISTS run_counts(run_id TEXT PRIMARY KEY REFERENCES runs(id), queued INTEGER NOT NULL DEFAULT 0,
|
|
20
|
+
running INTEGER NOT NULL DEFAULT 0, waiting INTEGER NOT NULL DEFAULT 0, errors INTEGER NOT NULL DEFAULT 0,
|
|
21
|
+
red INTEGER NOT NULL DEFAULT 0, missing INTEGER NOT NULL DEFAULT 0);
|
|
22
|
+
CREATE TABLE IF NOT EXISTS request_changes(cursor INTEGER PRIMARY KEY AUTOINCREMENT,run_id TEXT NOT NULL,request_id TEXT NOT NULL,critic_id TEXT NOT NULL,status TEXT NOT NULL,result_ref TEXT,error TEXT,error_code TEXT);
|
|
23
|
+
CREATE INDEX IF NOT EXISTS changes_run_cursor ON request_changes(run_id,cursor);
|
|
24
|
+
CREATE TABLE IF NOT EXISTS gate_edges(run_id TEXT NOT NULL,dependent TEXT NOT NULL,dependency TEXT NOT NULL,PRIMARY KEY(run_id,dependent,dependency));
|
|
25
|
+
CREATE INDEX IF NOT EXISTS gates_reverse ON gate_edges(run_id,dependency,dependent);
|
|
26
|
+
CREATE TABLE IF NOT EXISTS gate_counts(run_id TEXT NOT NULL,critic_id TEXT NOT NULL,unmet INTEGER NOT NULL,red INTEGER NOT NULL,PRIMARY KEY(run_id,critic_id));
|
|
27
|
+
CREATE TABLE IF NOT EXISTS run_dependencies(run_id TEXT NOT NULL, artifact_id TEXT NOT NULL,dependency_id TEXT NOT NULL,PRIMARY KEY(run_id,artifact_id,dependency_id));`);
|
|
28
|
+
}
|
|
29
|
+
export function records(db) {
|
|
30
|
+
// Cache encoded nodes only, bounded by bytes. Decoded values are always caller-owned.
|
|
31
|
+
const nodes = new Map();
|
|
32
|
+
let bytes = 0;
|
|
33
|
+
const revision = db.prepare('SELECT (SELECT data_version FROM pragma_data_version) AS external, total_changes() AS local');
|
|
34
|
+
let generation = '';
|
|
35
|
+
const sync = () => {
|
|
36
|
+
const row = revision.get(), next = `${row.external}/${row.local}`;
|
|
37
|
+
if (next !== generation) {
|
|
38
|
+
nodes.clear();
|
|
39
|
+
bytes = 0;
|
|
40
|
+
generation = next;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const remember = (hash, data) => {
|
|
44
|
+
if (nodes.has(hash) || Buffer.byteLength(data) > 4 * 1024 ** 2)
|
|
45
|
+
return;
|
|
46
|
+
while (nodes.size && bytes + Buffer.byteLength(data) > 4 * 1024 ** 2) {
|
|
47
|
+
const first = nodes.keys().next().value;
|
|
48
|
+
bytes -= Buffer.byteLength(nodes.get(first));
|
|
49
|
+
nodes.delete(first);
|
|
50
|
+
}
|
|
51
|
+
nodes.set(hash, data);
|
|
52
|
+
bytes += Buffer.byteLength(data);
|
|
53
|
+
};
|
|
54
|
+
const insert = db.prepare('INSERT OR IGNORE INTO definitions(hash,data) VALUES (?,?)');
|
|
55
|
+
const read = db.prepare('SELECT data FROM definitions WHERE hash=?');
|
|
56
|
+
const put = (value) => {
|
|
57
|
+
sync();
|
|
58
|
+
const memo = new WeakMap();
|
|
59
|
+
const visit = (value) => {
|
|
60
|
+
if (value && typeof value === 'object' && memo.has(value))
|
|
61
|
+
return memo.get(value);
|
|
62
|
+
const json = JSON.stringify(value);
|
|
63
|
+
if (json === undefined)
|
|
64
|
+
throw new Error('Immutable records must be JSON.');
|
|
65
|
+
const node = json.length < 1024 || !value || typeof value !== 'object' ? { json: value } : Array.isArray(value)
|
|
66
|
+
? { array: value.map(visit) }
|
|
67
|
+
: { object: Object.entries(value).filter(([, v]) => v !== undefined).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0).map(([key, v]) => [key, visit(v)]) };
|
|
68
|
+
const data = canonical(node), hash = createHash('sha256').update(data).digest('hex');
|
|
69
|
+
// Never infer persistence from the cache: a previous transaction may have rolled back.
|
|
70
|
+
const result = insert.run(hash, data);
|
|
71
|
+
if (result.changes)
|
|
72
|
+
storageTestHooks.write?.(Buffer.byteLength(data));
|
|
73
|
+
if (result.changes)
|
|
74
|
+
remember(hash, data);
|
|
75
|
+
else {
|
|
76
|
+
const stored = read.get(hash);
|
|
77
|
+
if (!stored || stored.data !== data)
|
|
78
|
+
throw new Error(`Corrupt immutable definition ${hash}`);
|
|
79
|
+
}
|
|
80
|
+
if (value && typeof value === 'object')
|
|
81
|
+
memo.set(value, hash);
|
|
82
|
+
return hash;
|
|
83
|
+
};
|
|
84
|
+
return visit(value);
|
|
85
|
+
};
|
|
86
|
+
const get = (hash) => {
|
|
87
|
+
sync();
|
|
88
|
+
const active = new Set();
|
|
89
|
+
const reference = (value) => typeof value === 'string' && /^[a-f0-9]{64}$/.test(value);
|
|
90
|
+
const visit = (hash) => {
|
|
91
|
+
if (!reference(hash) || active.has(hash) || active.size >= 512)
|
|
92
|
+
throw new Error('Invalid immutable reference.');
|
|
93
|
+
active.add(hash);
|
|
94
|
+
try {
|
|
95
|
+
let data = nodes.get(hash);
|
|
96
|
+
if (data === undefined) {
|
|
97
|
+
const row = read.get(hash);
|
|
98
|
+
if (!row)
|
|
99
|
+
throw new Error(`Missing immutable definition ${hash}`);
|
|
100
|
+
data = String(row.data);
|
|
101
|
+
storageTestHooks.read?.(Buffer.byteLength(data));
|
|
102
|
+
const parsed = JSON.parse(data);
|
|
103
|
+
if (createHash('sha256').update(canonical(parsed)).digest('hex') !== hash)
|
|
104
|
+
throw new Error(`Corrupt immutable definition ${hash}`);
|
|
105
|
+
}
|
|
106
|
+
const node = JSON.parse(data);
|
|
107
|
+
if (!node || typeof node !== 'object' || Array.isArray(node) || Object.keys(node).length !== 1)
|
|
108
|
+
throw new Error('Invalid immutable node.');
|
|
109
|
+
if ('json' in node) {
|
|
110
|
+
remember(hash, data);
|
|
111
|
+
return node.json;
|
|
112
|
+
}
|
|
113
|
+
if ('array' in node) {
|
|
114
|
+
if (!Array.isArray(node.array) || !node.array.every(reference))
|
|
115
|
+
throw new Error('Invalid immutable array references.');
|
|
116
|
+
const value = node.array.map(visit);
|
|
117
|
+
remember(hash, data);
|
|
118
|
+
return value;
|
|
119
|
+
}
|
|
120
|
+
if (!('object' in node) || !Array.isArray(node.object) || !node.object.every((pair, i, all) => Array.isArray(pair) && pair.length === 2 && typeof pair[0] === 'string' && reference(pair[1]) && (i === 0 || all[i - 1][0] < pair[0])))
|
|
121
|
+
throw new Error('Invalid immutable object references.');
|
|
122
|
+
const value = Object.fromEntries(node.object.map(([key, ref]) => [key, visit(ref)]));
|
|
123
|
+
remember(hash, data);
|
|
124
|
+
return value;
|
|
125
|
+
}
|
|
126
|
+
finally {
|
|
127
|
+
active.delete(hash);
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
return visit(hash);
|
|
131
|
+
};
|
|
132
|
+
/** One private immutable submission graph: memo lifetime never crosses calls. */
|
|
133
|
+
const prepare = async (roots, signal) => {
|
|
134
|
+
const memo = new WeakMap();
|
|
135
|
+
const staged = new Map();
|
|
136
|
+
const encoded = new Map();
|
|
137
|
+
const primitives = new Map();
|
|
138
|
+
let deadline = performance.now() + 8;
|
|
139
|
+
const checkpoint = async () => { if (performance.now() >= deadline) {
|
|
140
|
+
signal?.throwIfAborted();
|
|
141
|
+
await yieldTurn();
|
|
142
|
+
deadline = performance.now() + 8;
|
|
143
|
+
} };
|
|
144
|
+
const visit = async (value) => {
|
|
145
|
+
const object = value !== null && typeof value === 'object';
|
|
146
|
+
if (object && memo.has(value))
|
|
147
|
+
return memo.get(value);
|
|
148
|
+
if (!object && primitives.has(value))
|
|
149
|
+
return primitives.get(value);
|
|
150
|
+
await checkpoint();
|
|
151
|
+
let node, size;
|
|
152
|
+
if (!object) {
|
|
153
|
+
const text = JSON.stringify(value);
|
|
154
|
+
if (text === undefined)
|
|
155
|
+
throw new Error('Immutable records must be JSON.');
|
|
156
|
+
size = text.length;
|
|
157
|
+
node = { json: value };
|
|
158
|
+
}
|
|
159
|
+
else if (Array.isArray(value)) {
|
|
160
|
+
const children = [];
|
|
161
|
+
size = 2 + Math.max(0, value.length - 1);
|
|
162
|
+
for (const child of value) {
|
|
163
|
+
const saved = await visit(child);
|
|
164
|
+
children.push(saved.hash);
|
|
165
|
+
size += saved.size;
|
|
166
|
+
}
|
|
167
|
+
node = size < 1024 ? { json: value } : { array: children };
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
const entries = Object.entries(value).filter(([, v]) => v !== undefined).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
|
|
171
|
+
const children = [];
|
|
172
|
+
size = 2 + Math.max(0, entries.length - 1);
|
|
173
|
+
for (const [key, child] of entries) {
|
|
174
|
+
const saved = await visit(child);
|
|
175
|
+
children.push([key, saved.hash]);
|
|
176
|
+
size += JSON.stringify(key).length + 1 + saved.size;
|
|
177
|
+
}
|
|
178
|
+
node = size < 1024 ? { json: value } : { object: children };
|
|
179
|
+
}
|
|
180
|
+
const data = canonical(node);
|
|
181
|
+
let result = encoded.get(data);
|
|
182
|
+
if (!result) {
|
|
183
|
+
const hash = createHash('sha256').update(data).digest('hex');
|
|
184
|
+
staged.set(hash, data);
|
|
185
|
+
result = { hash, size };
|
|
186
|
+
encoded.set(data, result);
|
|
187
|
+
}
|
|
188
|
+
if (object)
|
|
189
|
+
memo.set(value, result);
|
|
190
|
+
else
|
|
191
|
+
primitives.set(value, result);
|
|
192
|
+
return result;
|
|
193
|
+
};
|
|
194
|
+
for (const value of roots)
|
|
195
|
+
await visit(value);
|
|
196
|
+
// Only nodes reachable through emitted references are needed. Tiny JSON
|
|
197
|
+
// leaves were traversed for size, but their children are embedded, not refs.
|
|
198
|
+
const needed = new Set();
|
|
199
|
+
const queue = roots.map(value => value && typeof value === 'object' ? memo.get(value).hash : '');
|
|
200
|
+
while (queue.length) {
|
|
201
|
+
const hash = queue.pop();
|
|
202
|
+
if (!hash || needed.has(hash))
|
|
203
|
+
continue;
|
|
204
|
+
needed.add(hash);
|
|
205
|
+
const node = JSON.parse(staged.get(hash));
|
|
206
|
+
if ('array' in node)
|
|
207
|
+
queue.push(...node.array);
|
|
208
|
+
else if ('object' in node)
|
|
209
|
+
for (const [, ref] of node.object)
|
|
210
|
+
queue.push(ref);
|
|
211
|
+
await checkpoint();
|
|
212
|
+
}
|
|
213
|
+
let batch = [];
|
|
214
|
+
const flush = () => {
|
|
215
|
+
db.exec('BEGIN IMMEDIATE');
|
|
216
|
+
try {
|
|
217
|
+
for (const [hash, data] of batch) {
|
|
218
|
+
const result = insert.run(hash, data);
|
|
219
|
+
if (!result.changes && read.get(hash)?.data !== data)
|
|
220
|
+
throw new Error(`Corrupt immutable definition ${hash}`);
|
|
221
|
+
if (result.changes)
|
|
222
|
+
storageTestHooks.write?.(Buffer.byteLength(data));
|
|
223
|
+
}
|
|
224
|
+
db.exec('COMMIT');
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
db.exec('ROLLBACK');
|
|
228
|
+
throw error;
|
|
229
|
+
}
|
|
230
|
+
batch = [];
|
|
231
|
+
};
|
|
232
|
+
for (const hash of needed) {
|
|
233
|
+
signal?.throwIfAborted();
|
|
234
|
+
batch.push([hash, staged.get(hash)]);
|
|
235
|
+
if (batch.length === 128) {
|
|
236
|
+
flush();
|
|
237
|
+
await yieldTurn();
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
if (batch.length)
|
|
241
|
+
flush();
|
|
242
|
+
signal?.throwIfAborted();
|
|
243
|
+
const references = new Map(roots.map(value => [value, memo.get(value).hash]));
|
|
244
|
+
return { ref: (value) => { const ref = references.get(value); if (!ref)
|
|
245
|
+
throw new Error('Unprepared immutable root.'); return ref; },
|
|
246
|
+
verify: () => { for (const hash of needed) {
|
|
247
|
+
const row = read.get(hash);
|
|
248
|
+
if (!row || row.data !== staged.get(hash))
|
|
249
|
+
throw new Error(`Corrupt or missing prepared definition ${hash}`);
|
|
250
|
+
} } };
|
|
251
|
+
};
|
|
252
|
+
const runRoots = (run) => {
|
|
253
|
+
const { graph, project, workspace } = run;
|
|
254
|
+
const definition = { graph, ...(project ? { project: { ...project, coalescedRequestIds: undefined, evidenceRequestIds: undefined } } : {}) };
|
|
255
|
+
const projection = project ? { project: { ...project, templates: [], snapshot: { ...project.snapshot, config: { ...project.snapshot.config,
|
|
256
|
+
artifacts: Object.fromEntries(Object.entries(project.snapshot.config.artifacts).map(([id, artifact]) => [id, { ...artifact, views: {} }])), configManifest: undefined } } } } : {};
|
|
257
|
+
return { definition, projection, workspace };
|
|
258
|
+
};
|
|
259
|
+
const prepareRun = async (run, signal) => {
|
|
260
|
+
const roots = runRoots(run), project = run.project;
|
|
261
|
+
const values = [...Object.values(roots), ...Object.values(project.snapshot.inputs), ...project.templates];
|
|
262
|
+
const { ref, verify } = await prepare(values, signal);
|
|
263
|
+
const { graph: _, project: __, workspace: ___, ...header } = run;
|
|
264
|
+
return { verify, header: { ...header, workspaceRef: ref(roots.workspace), definitionRef: ref(roots.definition), projectionRef: ref(roots.projection), project: { version: project.version, selection: project.selection, recursive: project.recursive, force: project.force, ignoreGates: project.ignoreGates } },
|
|
265
|
+
inputs: new Map(Object.entries(project.snapshot.inputs).map(([id, input]) => [id, ref(input)])),
|
|
266
|
+
envelopes: new Map(project.templates.map(envelope => [envelope.criticId, ref(envelope)])) };
|
|
267
|
+
};
|
|
268
|
+
const packRun = (run) => {
|
|
269
|
+
const { graph, project, workspace, ...header } = run;
|
|
270
|
+
const definitionRef = put({ graph, ...(project ? { project: { ...project, coalescedRequestIds: undefined, evidenceRequestIds: undefined } } : {}) });
|
|
271
|
+
const projection = project ? { project: { ...project, templates: [], snapshot: { ...project.snapshot, config: { ...project.snapshot.config,
|
|
272
|
+
artifacts: Object.fromEntries(Object.entries(project.snapshot.config.artifacts).map(([id, artifact]) => [id, { ...artifact, views: {} }])), configManifest: undefined } } } } : {};
|
|
273
|
+
return { ...header, workspaceRef: put(workspace), definitionRef, projectionRef: put(projection), ...(project ? { project: { version: project.version, selection: project.selection, recursive: project.recursive, force: project.force, ignoreGates: project.ignoreGates } } : {}) };
|
|
274
|
+
};
|
|
275
|
+
const run = (id, full = true) => {
|
|
276
|
+
const row = db.prepare('SELECT data FROM runs WHERE id=?').get(id);
|
|
277
|
+
if (!row)
|
|
278
|
+
return null;
|
|
279
|
+
const header = JSON.parse(String(row.data));
|
|
280
|
+
const definition = get(full ? header.definitionRef : header.projectionRef);
|
|
281
|
+
const { definitionRef: _, projectionRef: __, workspaceRef, ...rest } = header;
|
|
282
|
+
const shared = db.prepare('SELECT DISTINCT m.request_id FROM run_members m JOIN requests q ON q.id=m.request_id WHERE m.run_id=? AND q.run_id!=?').all(id, id).map(row => String(row.request_id));
|
|
283
|
+
const evidence = db.prepare('SELECT DISTINCT evidence_id FROM run_members WHERE run_id=? AND evidence_id IS NOT NULL').all(id).map(row => String(row.evidence_id));
|
|
284
|
+
return { ...rest, workspace: get(workspaceRef), ...definition, ...(definition.project ? { project: { ...definition.project, coalescedRequestIds: shared, ...(header.completedAt ? { evidenceRequestIds: evidence } : {}) } } : {}) };
|
|
285
|
+
};
|
|
286
|
+
const envelopeKeys = ['repoId', 'snapshotHash', 'criticId', 'title', 'artifacts', 'references', 'requiredObservations', 'configManifest', 'payload', 'profile', 'target', 'deps', 'passSchema', 'failSchema'];
|
|
287
|
+
const packRequest = (request) => {
|
|
288
|
+
const header = { ...request }, envelope = {};
|
|
289
|
+
for (const key of envelopeKeys) {
|
|
290
|
+
if (header[key] !== undefined)
|
|
291
|
+
envelope[key] = header[key];
|
|
292
|
+
delete header[key];
|
|
293
|
+
}
|
|
294
|
+
const envelopeRef = put(envelope);
|
|
295
|
+
delete header.workspace;
|
|
296
|
+
delete header.validationInput;
|
|
297
|
+
delete header.result;
|
|
298
|
+
return { ...header, criticId: request.criticId, target: request.target, profile: { kind: request.profile.kind, ...(request.profile.kind === 'agent' ? { provider: request.profile.provider, model: request.profile.model } : {}) }, envelopeRef,
|
|
299
|
+
workspaceRef: put(request.workspace), inputRef: request.validationInput ? put(request.validationInput) : null,
|
|
300
|
+
inputKey: request.validationInput?.key ?? null, inputVersion: request.validationInput?.version ?? null, title: request.title, snapshotHash: request.snapshotHash, deps: request.deps, resultRef: request.result ? put(request.result) : null, semanticRef: request.result ? put(semanticResult(request.result)) : null };
|
|
301
|
+
};
|
|
302
|
+
const request = (id, full = true) => {
|
|
303
|
+
const row = db.prepare('SELECT data FROM requests WHERE id=?').get(id);
|
|
304
|
+
if (!row)
|
|
305
|
+
return null;
|
|
306
|
+
const header = JSON.parse(String(row.data));
|
|
307
|
+
const { envelopeRef, workspaceRef, inputRef, resultRef, inputKey: _, inputVersion: __, semanticRef, ...rest } = header;
|
|
308
|
+
const result = resultRef ? get(full ? resultRef : semanticRef) : null;
|
|
309
|
+
if (result && (result.verdict !== header.status || !['GREEN', 'RED'].includes(header.status)))
|
|
310
|
+
throw new Error('Stored result/status mismatch.');
|
|
311
|
+
return { ...rest, ...(full ? get(envelopeRef) : {}), workspace: get(workspaceRef), ...(inputRef ? { validationInput: get(inputRef) } : {}), result };
|
|
312
|
+
};
|
|
313
|
+
return { put, get, packRun, prepareRun, packRequest, run, request, clear: () => { nodes.clear(); bytes = 0; } };
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/broker/storage.ts"],"names":[],"mappings":"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"}
|
package/dist/src/contracts.d.ts
CHANGED
|
@@ -22,7 +22,7 @@ export interface ReviewEnvelope extends ResponseSchemas {
|
|
|
22
22
|
target: string;
|
|
23
23
|
deps: string[];
|
|
24
24
|
}
|
|
25
|
-
export type ReviewStatus = 'BLOCKED' | 'QUEUED' | 'RUNNING' | 'WAITING_HUMAN' | 'GREEN' | 'RED' | 'ERROR';
|
|
25
|
+
export type ReviewStatus = 'WAIT_DEPENDENCY' | 'BLOCKED' | 'QUEUED' | 'RUNNING' | 'WAITING_HUMAN' | 'GREEN' | 'RED' | 'ERROR';
|
|
26
26
|
export type RunStatus = ReviewStatus | 'INCOMPLETE';
|
|
27
27
|
export interface ReviewToolCall {
|
|
28
28
|
name: string;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { records } from '../broker/storage.js';
|
|
1
2
|
import { assertStateFormat, StateFormatError } from '../state-format.js';
|
|
2
3
|
import { semanticResult } from '../response-schema.js';
|
|
3
4
|
import { reviewReference } from '../result-view.js';
|
|
@@ -11,7 +12,7 @@ import { promisify } from 'node:util';
|
|
|
11
12
|
import { projectGraph, validateGraphDefinition } from '../broker/graph.js';
|
|
12
13
|
import { storedValidation } from '../project/store.js';
|
|
13
14
|
import { projectValidationGraph } from '../project/graph.js';
|
|
14
|
-
const statuses = new Set(['BLOCKED', 'QUEUED', 'RUNNING', 'WAITING_HUMAN', 'GREEN', 'RED', 'ERROR']);
|
|
15
|
+
const statuses = new Set(['WAIT_DEPENDENCY', 'BLOCKED', 'QUEUED', 'RUNNING', 'WAITING_HUMAN', 'GREEN', 'RED', 'ERROR']);
|
|
15
16
|
export function monitorLane(request) {
|
|
16
17
|
if (request.status === 'GREEN')
|
|
17
18
|
return 'success';
|
|
@@ -81,7 +82,7 @@ const headerSql = `SELECT id,run_id,status,
|
|
|
81
82
|
const runSql = `SELECT id,status,created_at,
|
|
82
83
|
json_extract(data,'$.id') AS json_id,json_extract(data,'$.status') AS json_status,
|
|
83
84
|
json_extract(data,'$.snapshotHash') AS snapshot_hash,json_extract(data,'$.completedAt') AS completed_at,
|
|
84
|
-
json_extract(data,'$.scope') AS scope,
|
|
85
|
+
json_extract(data,'$.scope') AS scope,'object' AS graph_type,2 AS graph_version
|
|
85
86
|
FROM runs`;
|
|
86
87
|
function readRun(row, project) {
|
|
87
88
|
const status = string(row.status);
|
|
@@ -124,7 +125,8 @@ async function readSnapshot(source, requestId, runId) {
|
|
|
124
125
|
snapshot.requests = db.prepare(headerSql).all().map(readHeader);
|
|
125
126
|
snapshot.runs = db.prepare(runSql).all().map(row => readRun(row, source.id));
|
|
126
127
|
if (runId !== undefined) {
|
|
127
|
-
const
|
|
128
|
+
const graph = records(db).run(runId)?.graph;
|
|
129
|
+
const row = graph ? { graph: JSON.stringify(graph) } : undefined;
|
|
128
130
|
if (row?.graph != null) {
|
|
129
131
|
try {
|
|
130
132
|
snapshot.graph = JSON.parse(string(row.graph));
|
|
@@ -146,7 +148,7 @@ async function readSnapshot(source, requestId, runId) {
|
|
|
146
148
|
const header = snapshot.requests.find(request => request.id === requestId);
|
|
147
149
|
if (header) {
|
|
148
150
|
const target = db.prepare('SELECT data FROM requests WHERE id=?').get(requestId);
|
|
149
|
-
snapshot.target =
|
|
151
|
+
snapshot.target = records(db).request(requestId);
|
|
150
152
|
snapshot.events = db.prepare('SELECT id,request_id,type,created_at FROM events WHERE run_id=? AND (request_id=? OR request_id IS NULL) ORDER BY id').all(header.runId, requestId).map(row => ({
|
|
151
153
|
id: Number(row.id), requestId: nullableString(row.request_id), type: string(row.type), at: date(row.created_at),
|
|
152
154
|
}));
|