agent-conveyor 0.1.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 +1123 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +19 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/program-name.d.ts +2 -0
- package/dist/cli/program-name.js +12 -0
- package/dist/cli/program-name.js.map +1 -0
- package/dist/cli/typescript-runtime.d.ts +52 -0
- package/dist/cli/typescript-runtime.js +18009 -0
- package/dist/cli/typescript-runtime.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/audit.d.ts +96 -0
- package/dist/runtime/audit.js +298 -0
- package/dist/runtime/audit.js.map +1 -0
- package/dist/runtime/classify.d.ts +8 -0
- package/dist/runtime/classify.js +128 -0
- package/dist/runtime/classify.js.map +1 -0
- package/dist/runtime/codex-session.d.ts +103 -0
- package/dist/runtime/codex-session.js +408 -0
- package/dist/runtime/codex-session.js.map +1 -0
- package/dist/runtime/commands.d.ts +92 -0
- package/dist/runtime/commands.js +408 -0
- package/dist/runtime/commands.js.map +1 -0
- package/dist/runtime/dispatch.d.ts +74 -0
- package/dist/runtime/dispatch.js +669 -0
- package/dist/runtime/dispatch.js.map +1 -0
- package/dist/runtime/export.d.ts +22 -0
- package/dist/runtime/export.js +77 -0
- package/dist/runtime/export.js.map +1 -0
- package/dist/runtime/ingest.d.ts +28 -0
- package/dist/runtime/ingest.js +177 -0
- package/dist/runtime/ingest.js.map +1 -0
- package/dist/runtime/loop-evidence.d.ts +87 -0
- package/dist/runtime/loop-evidence.js +448 -0
- package/dist/runtime/loop-evidence.js.map +1 -0
- package/dist/runtime/manager-config.d.ts +20 -0
- package/dist/runtime/manager-config.js +34 -0
- package/dist/runtime/manager-config.js.map +1 -0
- package/dist/runtime/manager-permissions.d.ts +7 -0
- package/dist/runtime/manager-permissions.js +85 -0
- package/dist/runtime/manager-permissions.js.map +1 -0
- package/dist/runtime/notifications.d.ts +89 -0
- package/dist/runtime/notifications.js +208 -0
- package/dist/runtime/notifications.js.map +1 -0
- package/dist/runtime/replay.d.ts +29 -0
- package/dist/runtime/replay.js +331 -0
- package/dist/runtime/replay.js.map +1 -0
- package/dist/runtime/tasks.d.ts +54 -0
- package/dist/runtime/tasks.js +195 -0
- package/dist/runtime/tasks.js.map +1 -0
- package/dist/runtime/tmux.d.ts +61 -0
- package/dist/runtime/tmux.js +189 -0
- package/dist/runtime/tmux.js.map +1 -0
- package/dist/runtime/visual-diff.d.ts +23 -0
- package/dist/runtime/visual-diff.js +234 -0
- package/dist/runtime/visual-diff.js.map +1 -0
- package/dist/state/database.d.ts +21 -0
- package/dist/state/database.js +142 -0
- package/dist/state/database.js.map +1 -0
- package/dist/state/files.d.ts +38 -0
- package/dist/state/files.js +73 -0
- package/dist/state/files.js.map +1 -0
- package/dist/state/schema-v22.d.ts +1 -0
- package/dist/state/schema-v22.js +566 -0
- package/dist/state/schema-v22.js.map +1 -0
- package/dist/state/sqlite-contract.d.ts +4 -0
- package/dist/state/sqlite-contract.js +78 -0
- package/dist/state/sqlite-contract.js.map +1 -0
- package/dist/state/status.d.ts +12 -0
- package/dist/state/status.js +40 -0
- package/dist/state/status.js.map +1 -0
- package/docs/typescript-migration/cli-contract.md +147 -0
- package/docs/typescript-migration/dashboard-contract.md +76 -0
- package/docs/typescript-migration/package-install-contract.md +98 -0
- package/docs/typescript-migration/qa-gate-matrix.md +103 -0
- package/docs/typescript-migration/sqlite-state-contract.md +92 -0
- package/docs/typescript-migration/t005-runtime-parity.md +47 -0
- package/package.json +88 -0
- package/scripts/capture-static-html-screenshot.mjs +88 -0
- package/skills/codex-review/SKILL.md +116 -0
- package/skills/codex-review/scripts/codex-review +344 -0
- package/skills/manage-codex-workers/SKILL.md +696 -0
- package/skills/manage-codex-workers/agents/openai.yaml +5 -0
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { computeVisualDiffSync } from "./visual-diff.js";
|
|
3
|
+
export class LoopEvidenceError extends Error {
|
|
4
|
+
constructor(message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = "LoopEvidenceError";
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export function loopEvidenceCriterion(runId, iteration, evidenceType) {
|
|
10
|
+
return `Ralph loop ${runId} iteration ${iteration} ${evidenceType} evidence`;
|
|
11
|
+
}
|
|
12
|
+
export function recordLoopEvidenceSync(database, options) {
|
|
13
|
+
if (options.iteration < 1) {
|
|
14
|
+
throw new LoopEvidenceError("--iteration must be at least 1");
|
|
15
|
+
}
|
|
16
|
+
const evidenceType = options.evidenceType.trim();
|
|
17
|
+
if (!evidenceType) {
|
|
18
|
+
throw new LoopEvidenceError("--evidence-type must be non-empty");
|
|
19
|
+
}
|
|
20
|
+
const metadata = evidenceType === "adversarial_check"
|
|
21
|
+
? adversarialCheckMetadata(options.metadata ?? {})
|
|
22
|
+
: { ...(options.metadata ?? {}) };
|
|
23
|
+
const task = taskRowSync(database, options.task);
|
|
24
|
+
const run = ralphLoopRunForTaskSync(database, { loopRunId: options.loopRunId, task });
|
|
25
|
+
const status = options.status ?? "pass";
|
|
26
|
+
const criterionStatus = loopEvidenceCriterionStatus(status);
|
|
27
|
+
const evidence = {
|
|
28
|
+
...metadata,
|
|
29
|
+
evidence_type: evidenceType,
|
|
30
|
+
iteration: options.iteration,
|
|
31
|
+
ralph_loop_run_id: run.id,
|
|
32
|
+
status,
|
|
33
|
+
};
|
|
34
|
+
if (options.artifactPath) {
|
|
35
|
+
evidence.artifact_path = String(options.artifactPath);
|
|
36
|
+
}
|
|
37
|
+
if (options.correlationId) {
|
|
38
|
+
evidence.correlation_id = options.correlationId;
|
|
39
|
+
}
|
|
40
|
+
const criterionText = loopEvidenceCriterion(run.id, options.iteration, evidenceType);
|
|
41
|
+
const existing = acceptanceCriteriaForTaskSync(database, { taskId: task.id })
|
|
42
|
+
.filter((criterion) => criterion.criterion === criterionText);
|
|
43
|
+
let criterion = null;
|
|
44
|
+
if (existing.length === 0) {
|
|
45
|
+
const criterionId = insertAcceptanceCriterionSync(database, {
|
|
46
|
+
criterion: criterionText,
|
|
47
|
+
evidence,
|
|
48
|
+
now: options.now,
|
|
49
|
+
proof: options.proof ?? `${evidenceType} evidence recorded for Ralph loop ${run.id} iteration ${options.iteration}.`,
|
|
50
|
+
source: options.source ?? "manager_inferred",
|
|
51
|
+
status: criterionStatus,
|
|
52
|
+
taskId: task.id,
|
|
53
|
+
});
|
|
54
|
+
criterion = acceptanceCriteriaForTaskSync(database, { taskId: task.id }).find((row) => row.id === criterionId) ?? null;
|
|
55
|
+
if (!criterion) {
|
|
56
|
+
throw new LoopEvidenceError(`Unknown acceptance criterion: ${criterionId}`);
|
|
57
|
+
}
|
|
58
|
+
insertAcceptanceCriterionEventSync(database, {
|
|
59
|
+
criterion,
|
|
60
|
+
created: true,
|
|
61
|
+
eventType: "acceptance_criterion_added",
|
|
62
|
+
now: options.now,
|
|
63
|
+
taskId: task.id,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
for (const previous of existing) {
|
|
68
|
+
criterion = updateAcceptanceCriterionSync(database, {
|
|
69
|
+
criterionId: previous.id,
|
|
70
|
+
evidence,
|
|
71
|
+
now: options.now,
|
|
72
|
+
proof: options.proof ?? previous.proof,
|
|
73
|
+
status: criterionStatus,
|
|
74
|
+
});
|
|
75
|
+
insertAcceptanceCriterionEventSync(database, {
|
|
76
|
+
criterion,
|
|
77
|
+
eventType: "acceptance_criterion_updated",
|
|
78
|
+
now: options.now,
|
|
79
|
+
previous,
|
|
80
|
+
taskId: task.id,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (!criterion) {
|
|
85
|
+
throw new LoopEvidenceError("failed to record loop evidence");
|
|
86
|
+
}
|
|
87
|
+
return { criterion, evidence, run };
|
|
88
|
+
}
|
|
89
|
+
export function recordAdversarialLoopEvidenceSync(database, options) {
|
|
90
|
+
const metadata = adversarialCheckMetadata({
|
|
91
|
+
check: options.check,
|
|
92
|
+
failure_mode: options.failureMode,
|
|
93
|
+
result: options.result,
|
|
94
|
+
});
|
|
95
|
+
return recordLoopEvidenceSync(database, {
|
|
96
|
+
artifactPath: options.artifactPath,
|
|
97
|
+
correlationId: options.correlationId,
|
|
98
|
+
evidenceType: "adversarial_check",
|
|
99
|
+
iteration: options.iteration,
|
|
100
|
+
loopRunId: options.loopRunId,
|
|
101
|
+
metadata,
|
|
102
|
+
now: options.now,
|
|
103
|
+
proof: `Adversarial check: ${metadata.failure_mode} -> ${metadata.result}`,
|
|
104
|
+
source: options.source,
|
|
105
|
+
status: options.status,
|
|
106
|
+
task: options.task,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
export function recordVisualDiffLoopEvidenceSync(database, options) {
|
|
110
|
+
const task = taskRowSync(database, options.task);
|
|
111
|
+
ralphLoopRunForTaskSync(database, { loopRunId: options.loopRunId, task });
|
|
112
|
+
const report = computeVisualDiffSync({
|
|
113
|
+
candidatePath: options.candidatePath,
|
|
114
|
+
diffOutput: options.diffOutput,
|
|
115
|
+
referencePath: options.referencePath,
|
|
116
|
+
reportOutput: options.reportOutput,
|
|
117
|
+
threshold: options.threshold,
|
|
118
|
+
});
|
|
119
|
+
const reportResult = recordLoopEvidenceSync(database, {
|
|
120
|
+
artifactPath: options.reportOutput,
|
|
121
|
+
correlationId: options.correlationId,
|
|
122
|
+
evidenceType: "visual_diff_report",
|
|
123
|
+
iteration: options.iteration,
|
|
124
|
+
loopRunId: options.loopRunId,
|
|
125
|
+
metadata: { ...report },
|
|
126
|
+
now: options.now,
|
|
127
|
+
proof: "Visual diff report recorded.",
|
|
128
|
+
source: options.source,
|
|
129
|
+
status: "pass",
|
|
130
|
+
task: task.id,
|
|
131
|
+
});
|
|
132
|
+
const thresholdStatus = report.below_threshold ? "pass" : "fail";
|
|
133
|
+
const thresholdProof = report.below_threshold
|
|
134
|
+
? `Visual diff score ${formatNumber(report.diff_score)} is at or below threshold ${formatNumber(report.threshold)}.`
|
|
135
|
+
: `Visual diff score ${formatNumber(report.diff_score)} exceeds threshold ${formatNumber(report.threshold)}.`;
|
|
136
|
+
const thresholdResult = recordLoopEvidenceSync(database, {
|
|
137
|
+
artifactPath: options.reportOutput,
|
|
138
|
+
correlationId: options.correlationId,
|
|
139
|
+
evidenceType: "diff_below_threshold",
|
|
140
|
+
iteration: options.iteration,
|
|
141
|
+
loopRunId: options.loopRunId,
|
|
142
|
+
metadata: { ...report },
|
|
143
|
+
now: options.now,
|
|
144
|
+
proof: thresholdProof,
|
|
145
|
+
source: options.source,
|
|
146
|
+
status: thresholdStatus,
|
|
147
|
+
task: task.id,
|
|
148
|
+
});
|
|
149
|
+
return {
|
|
150
|
+
criterion: reportResult.criterion,
|
|
151
|
+
diff: report,
|
|
152
|
+
evidence: reportResult.evidence,
|
|
153
|
+
threshold_criterion: thresholdResult.criterion,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
export function acceptanceCriteriaForTaskSync(database, options) {
|
|
157
|
+
const params = [options.taskId];
|
|
158
|
+
let where = "where task_id = ?";
|
|
159
|
+
if (options.statuses !== undefined) {
|
|
160
|
+
if (options.statuses.length === 0) {
|
|
161
|
+
return [];
|
|
162
|
+
}
|
|
163
|
+
for (const status of options.statuses) {
|
|
164
|
+
validateAcceptanceCriterionStatus(status);
|
|
165
|
+
}
|
|
166
|
+
where += ` and status in (${options.statuses.map(() => "?").join(", ")})`;
|
|
167
|
+
params.push(...options.statuses);
|
|
168
|
+
}
|
|
169
|
+
const rows = database.prepare(`
|
|
170
|
+
select id, task_id, criterion, status, source, proof, rationale,
|
|
171
|
+
evidence_json, created_at, updated_at
|
|
172
|
+
from acceptance_criteria
|
|
173
|
+
${where}
|
|
174
|
+
order by id
|
|
175
|
+
`).all(...params);
|
|
176
|
+
return rows.map(acceptanceCriterionRecord);
|
|
177
|
+
}
|
|
178
|
+
function insertAcceptanceCriterionSync(database, options) {
|
|
179
|
+
validateAcceptanceCriterionStatus(options.status);
|
|
180
|
+
validateAcceptanceCriterionSource(options.source);
|
|
181
|
+
const existing = database.prepare(`
|
|
182
|
+
select id
|
|
183
|
+
from acceptance_criteria
|
|
184
|
+
where task_id = ? and source = ? and criterion = ?
|
|
185
|
+
`).get(options.taskId, options.source, options.criterion);
|
|
186
|
+
if (existing) {
|
|
187
|
+
return existing.id;
|
|
188
|
+
}
|
|
189
|
+
const timestamp = options.now ?? new Date().toISOString();
|
|
190
|
+
const result = database.prepare(`
|
|
191
|
+
insert into acceptance_criteria(
|
|
192
|
+
task_id, criterion, status, source, proof, rationale,
|
|
193
|
+
evidence_json, created_at, updated_at
|
|
194
|
+
)
|
|
195
|
+
values (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
196
|
+
`).run(options.taskId, options.criterion, options.status, options.source, options.proof, options.rationale ?? null, stableJson(options.evidence), timestamp, timestamp);
|
|
197
|
+
const criterionId = Number(result.lastInsertRowid);
|
|
198
|
+
emitTelemetry(database, {
|
|
199
|
+
attributes: {
|
|
200
|
+
criterion: options.criterion,
|
|
201
|
+
has_evidence: true,
|
|
202
|
+
has_proof: options.proof !== null,
|
|
203
|
+
status: options.status,
|
|
204
|
+
},
|
|
205
|
+
correlation: {
|
|
206
|
+
criterion_id: criterionId,
|
|
207
|
+
source: options.source,
|
|
208
|
+
},
|
|
209
|
+
eventType: "acceptance_criterion_added",
|
|
210
|
+
summary: "Added acceptance criterion.",
|
|
211
|
+
taskId: options.taskId,
|
|
212
|
+
timestamp,
|
|
213
|
+
});
|
|
214
|
+
return criterionId;
|
|
215
|
+
}
|
|
216
|
+
function updateAcceptanceCriterionSync(database, options) {
|
|
217
|
+
validateAcceptanceCriterionStatus(options.status);
|
|
218
|
+
const existing = database.prepare(`
|
|
219
|
+
select id, task_id, criterion, status, source, proof, rationale,
|
|
220
|
+
evidence_json, created_at, updated_at
|
|
221
|
+
from acceptance_criteria
|
|
222
|
+
where id = ?
|
|
223
|
+
`).get(options.criterionId);
|
|
224
|
+
if (!existing) {
|
|
225
|
+
throw new LoopEvidenceError(`Unknown acceptance criterion: ${options.criterionId}`);
|
|
226
|
+
}
|
|
227
|
+
const timestamp = options.now ?? new Date().toISOString();
|
|
228
|
+
database.prepare(`
|
|
229
|
+
update acceptance_criteria
|
|
230
|
+
set status = ?, evidence_json = ?, proof = ?, rationale = ?, updated_at = ?
|
|
231
|
+
where id = ?
|
|
232
|
+
`).run(options.status, stableJson(options.evidence), options.proof, options.rationale ?? existing.rationale, timestamp, options.criterionId);
|
|
233
|
+
const updated = database.prepare(`
|
|
234
|
+
select id, task_id, criterion, status, source, proof, rationale,
|
|
235
|
+
evidence_json, created_at, updated_at
|
|
236
|
+
from acceptance_criteria
|
|
237
|
+
where id = ?
|
|
238
|
+
`).get(options.criterionId);
|
|
239
|
+
if (!updated) {
|
|
240
|
+
throw new LoopEvidenceError(`Unknown acceptance criterion: ${options.criterionId}`);
|
|
241
|
+
}
|
|
242
|
+
const record = acceptanceCriterionRecord(updated);
|
|
243
|
+
emitTelemetry(database, {
|
|
244
|
+
attributes: {
|
|
245
|
+
criterion: record.criterion,
|
|
246
|
+
has_evidence: true,
|
|
247
|
+
has_proof: record.proof !== null,
|
|
248
|
+
previous_status: existing.status,
|
|
249
|
+
status: record.status,
|
|
250
|
+
},
|
|
251
|
+
correlation: {
|
|
252
|
+
criterion_id: record.id,
|
|
253
|
+
source: record.source,
|
|
254
|
+
},
|
|
255
|
+
eventType: "acceptance_criterion_updated",
|
|
256
|
+
summary: "Updated acceptance criterion.",
|
|
257
|
+
taskId: record.task_id,
|
|
258
|
+
timestamp,
|
|
259
|
+
});
|
|
260
|
+
return record;
|
|
261
|
+
}
|
|
262
|
+
function loopEvidenceCriterionStatus(status) {
|
|
263
|
+
const normalized = status.trim().toLowerCase();
|
|
264
|
+
if (new Set(["green", "ok", "pass", "passed", "satisfied", "success", "succeeded"]).has(normalized)) {
|
|
265
|
+
return "satisfied";
|
|
266
|
+
}
|
|
267
|
+
return "rejected";
|
|
268
|
+
}
|
|
269
|
+
function formatNumber(value) {
|
|
270
|
+
return Number.isInteger(value) ? String(value) : `${value.toPrecision(6)}`.replace(/\.?0+$/, "");
|
|
271
|
+
}
|
|
272
|
+
function adversarialCheckMetadata(metadata) {
|
|
273
|
+
const values = { ...metadata };
|
|
274
|
+
for (const [key, flag] of [
|
|
275
|
+
["failure_mode", "--failure-mode"],
|
|
276
|
+
["check", "--check"],
|
|
277
|
+
["result", "--result"],
|
|
278
|
+
]) {
|
|
279
|
+
const value = typeof values[key] === "string" ? values[key].trim() : "";
|
|
280
|
+
if (!value) {
|
|
281
|
+
throw new LoopEvidenceError(`${flag} must be non-empty`);
|
|
282
|
+
}
|
|
283
|
+
values[key] = value;
|
|
284
|
+
}
|
|
285
|
+
return values;
|
|
286
|
+
}
|
|
287
|
+
function taskRowSync(database, task) {
|
|
288
|
+
const row = database.prepare(`
|
|
289
|
+
select id, name
|
|
290
|
+
from tasks
|
|
291
|
+
where id = ? or name = ?
|
|
292
|
+
limit 1
|
|
293
|
+
`).get(task, task);
|
|
294
|
+
if (!row) {
|
|
295
|
+
throw new LoopEvidenceError(`Unknown task: ${task}`);
|
|
296
|
+
}
|
|
297
|
+
return row;
|
|
298
|
+
}
|
|
299
|
+
function ralphLoopRunForTaskSync(database, options) {
|
|
300
|
+
const run = ralphLoopRunSync(database, options.loopRunId);
|
|
301
|
+
if (run.task_id !== options.task.id) {
|
|
302
|
+
throw new LoopEvidenceError(`loop run ${JSON.stringify(options.loopRunId)} does not belong to task ${JSON.stringify(options.task.name)}`);
|
|
303
|
+
}
|
|
304
|
+
return run;
|
|
305
|
+
}
|
|
306
|
+
function ralphLoopRunSync(database, runId) {
|
|
307
|
+
const exact = database.prepare(`
|
|
308
|
+
select id, task_id, name, purpose, metadata_json
|
|
309
|
+
from runs
|
|
310
|
+
where id = ?
|
|
311
|
+
limit 1
|
|
312
|
+
`).get(runId);
|
|
313
|
+
const row = exact ?? database.prepare(`
|
|
314
|
+
select id, task_id, name, purpose, metadata_json
|
|
315
|
+
from runs
|
|
316
|
+
where name = ?
|
|
317
|
+
order by started_at desc, id desc
|
|
318
|
+
limit 1
|
|
319
|
+
`).get(runId);
|
|
320
|
+
if (!row) {
|
|
321
|
+
throw new LoopEvidenceError(`Unknown run: ${runId}`);
|
|
322
|
+
}
|
|
323
|
+
const metadata = parseJsonObject(row.metadata_json);
|
|
324
|
+
if (metadata.kind !== "ralph_loop" && row.purpose !== "ralph_loop") {
|
|
325
|
+
throw new LoopEvidenceError(`Run ${JSON.stringify(runId)} is not a Ralph loop run`);
|
|
326
|
+
}
|
|
327
|
+
const currentIteration = integerMetadata(metadata.current_iteration);
|
|
328
|
+
const maxIterations = integerMetadata(metadata.max_iterations);
|
|
329
|
+
if (currentIteration === null || maxIterations === null) {
|
|
330
|
+
throw new LoopEvidenceError(`Ralph loop run ${JSON.stringify(runId)} is missing iteration policy`);
|
|
331
|
+
}
|
|
332
|
+
return {
|
|
333
|
+
cleanup_policy: typeof metadata.cleanup_policy === "string" ? metadata.cleanup_policy : null,
|
|
334
|
+
current_iteration: currentIteration,
|
|
335
|
+
id: row.id,
|
|
336
|
+
max_iterations: maxIterations,
|
|
337
|
+
metadata,
|
|
338
|
+
name: row.name,
|
|
339
|
+
preset: typeof metadata.preset === "string" ? metadata.preset : null,
|
|
340
|
+
required_before_continue: stringList(metadata.required_before_continue),
|
|
341
|
+
seed_prompt_sha256: typeof metadata.seed_prompt_sha256 === "string" ? metadata.seed_prompt_sha256 : null,
|
|
342
|
+
stop_conditions: stringList(metadata.stop_conditions),
|
|
343
|
+
task_id: row.task_id,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
function insertAcceptanceCriterionEventSync(database, options) {
|
|
347
|
+
const payload = {
|
|
348
|
+
criterion: options.criterion.criterion,
|
|
349
|
+
criterion_id: options.criterion.id,
|
|
350
|
+
evidence: options.criterion.evidence,
|
|
351
|
+
proof: options.criterion.proof,
|
|
352
|
+
rationale: options.criterion.rationale,
|
|
353
|
+
source: options.criterion.source,
|
|
354
|
+
status: options.criterion.status,
|
|
355
|
+
task_id: options.taskId,
|
|
356
|
+
};
|
|
357
|
+
if (options.created !== undefined) {
|
|
358
|
+
payload.created = options.created;
|
|
359
|
+
}
|
|
360
|
+
if (options.previous) {
|
|
361
|
+
payload.previous_evidence = options.previous.evidence;
|
|
362
|
+
payload.previous_proof = options.previous.proof;
|
|
363
|
+
payload.previous_rationale = options.previous.rationale;
|
|
364
|
+
payload.previous_status = options.previous.status;
|
|
365
|
+
}
|
|
366
|
+
database.prepare(`
|
|
367
|
+
insert into events(created_at, actor, command_id, correlation_id, task_id, worker_id, manager_id, type, payload_json)
|
|
368
|
+
values (?, 'workerctl', null, null, ?, null, null, ?, ?)
|
|
369
|
+
`).run(options.now ?? new Date().toISOString(), options.taskId, options.eventType, stableJson(payload));
|
|
370
|
+
}
|
|
371
|
+
function emitTelemetry(database, options) {
|
|
372
|
+
const eventId = `telemetry-${randomUUID()}`;
|
|
373
|
+
const attributesJson = stableJson(options.attributes);
|
|
374
|
+
database.prepare(`
|
|
375
|
+
insert into telemetry_events(
|
|
376
|
+
id, run_id, task_id, timestamp, actor, event_type, severity,
|
|
377
|
+
summary, correlation_json, attributes_json
|
|
378
|
+
)
|
|
379
|
+
values (?, null, ?, ?, 'workerctl', ?, 'info', ?, ?, ?)
|
|
380
|
+
`).run(eventId, options.taskId, options.timestamp, options.eventType, options.summary, stableJson(options.correlation), attributesJson);
|
|
381
|
+
database.prepare(`
|
|
382
|
+
insert into telemetry_events_fts(
|
|
383
|
+
event_id, task_id, run_id, actor, event_type, summary, attributes
|
|
384
|
+
)
|
|
385
|
+
values (?, ?, null, 'workerctl', ?, ?, ?)
|
|
386
|
+
`).run(eventId, options.taskId, options.eventType, options.summary, attributesJson);
|
|
387
|
+
}
|
|
388
|
+
function validateAcceptanceCriterionStatus(status) {
|
|
389
|
+
if (!new Set(["accepted", "deferred", "proposed", "rejected", "satisfied"]).has(status)) {
|
|
390
|
+
throw new LoopEvidenceError(`Invalid acceptance criterion status: ${status}`);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
function validateAcceptanceCriterionSource(source) {
|
|
394
|
+
if (!new Set(["final_audit", "manager_inferred", "user_requested", "worker_proposed"]).has(source)) {
|
|
395
|
+
throw new LoopEvidenceError(`Invalid acceptance criterion source: ${source}`);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
function acceptanceCriterionRecord(row) {
|
|
399
|
+
return {
|
|
400
|
+
created_at: row.created_at,
|
|
401
|
+
criterion: row.criterion,
|
|
402
|
+
evidence: parseJsonObject(row.evidence_json),
|
|
403
|
+
id: row.id,
|
|
404
|
+
proof: row.proof,
|
|
405
|
+
rationale: row.rationale,
|
|
406
|
+
source: row.source,
|
|
407
|
+
status: row.status,
|
|
408
|
+
task_id: row.task_id,
|
|
409
|
+
updated_at: row.updated_at,
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
function parseJsonObject(json) {
|
|
413
|
+
const value = JSON.parse(json);
|
|
414
|
+
return isRecord(value) ? value : {};
|
|
415
|
+
}
|
|
416
|
+
function integerMetadata(value) {
|
|
417
|
+
if (typeof value === "number" && Number.isInteger(value)) {
|
|
418
|
+
return value;
|
|
419
|
+
}
|
|
420
|
+
if (typeof value === "string" && /^-?\d+$/.test(value)) {
|
|
421
|
+
return Number(value);
|
|
422
|
+
}
|
|
423
|
+
return null;
|
|
424
|
+
}
|
|
425
|
+
function stringList(value) {
|
|
426
|
+
if (!Array.isArray(value)) {
|
|
427
|
+
return [];
|
|
428
|
+
}
|
|
429
|
+
return value.filter((item) => typeof item === "string" && item.trim().length > 0).map((item) => item.trim());
|
|
430
|
+
}
|
|
431
|
+
function isRecord(value) {
|
|
432
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
433
|
+
}
|
|
434
|
+
function stableJson(value) {
|
|
435
|
+
return JSON.stringify(sortJson(value));
|
|
436
|
+
}
|
|
437
|
+
function sortJson(value) {
|
|
438
|
+
if (Array.isArray(value)) {
|
|
439
|
+
return value.map(sortJson);
|
|
440
|
+
}
|
|
441
|
+
if (value !== null && typeof value === "object") {
|
|
442
|
+
return Object.fromEntries(Object.entries(value)
|
|
443
|
+
.sort(([left], [right]) => left.localeCompare(right))
|
|
444
|
+
.map(([key, child]) => [key, sortJson(child)]));
|
|
445
|
+
}
|
|
446
|
+
return value;
|
|
447
|
+
}
|
|
448
|
+
//# sourceMappingURL=loop-evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-evidence.js","sourceRoot":"","sources":["../../src/runtime/loop-evidence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { DatabaseSync } from "node:sqlite";
|
|
2
|
+
import type { ManagerPermissions } from "./manager-permissions.js";
|
|
3
|
+
export interface ManagerConfigRecord {
|
|
4
|
+
acceptance_criteria: string[];
|
|
5
|
+
created_at: string;
|
|
6
|
+
epilogues: string[];
|
|
7
|
+
guidelines: string[];
|
|
8
|
+
nudge_on_completion: string;
|
|
9
|
+
objective: string | null;
|
|
10
|
+
permissions: ManagerPermissions;
|
|
11
|
+
reference_paths: string[];
|
|
12
|
+
require_acks: boolean;
|
|
13
|
+
revision: number;
|
|
14
|
+
supervision_mode: string;
|
|
15
|
+
task_id: string;
|
|
16
|
+
tools: string[];
|
|
17
|
+
updated_at: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function managerConfigSync(database: DatabaseSync, taskId: string): ManagerConfigRecord | null;
|
|
20
|
+
export declare function managerConfigPermissionAllowed(config: ManagerConfigRecord | null, action: string): boolean;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { managerPermissionAllowed, normalizeManagerPermissions } from "./manager-permissions.js";
|
|
2
|
+
export function managerConfigSync(database, taskId) {
|
|
3
|
+
const row = database.prepare(`
|
|
4
|
+
select task_id, supervision_mode, objective, guidelines_json,
|
|
5
|
+
acceptance_criteria_json, reference_paths_json, permissions_json,
|
|
6
|
+
tools_json, epilogues_json, nudge_on_completion, require_acks,
|
|
7
|
+
revision, created_at, updated_at
|
|
8
|
+
from manager_configs
|
|
9
|
+
where task_id = ?
|
|
10
|
+
`).get(taskId);
|
|
11
|
+
if (!row) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
acceptance_criteria: JSON.parse(row.acceptance_criteria_json),
|
|
16
|
+
created_at: row.created_at,
|
|
17
|
+
epilogues: JSON.parse(row.epilogues_json),
|
|
18
|
+
guidelines: JSON.parse(row.guidelines_json),
|
|
19
|
+
nudge_on_completion: row.nudge_on_completion,
|
|
20
|
+
objective: row.objective,
|
|
21
|
+
permissions: normalizeManagerPermissions(JSON.parse(row.permissions_json)),
|
|
22
|
+
reference_paths: JSON.parse(row.reference_paths_json),
|
|
23
|
+
require_acks: Boolean(row.require_acks),
|
|
24
|
+
revision: row.revision,
|
|
25
|
+
supervision_mode: row.supervision_mode,
|
|
26
|
+
task_id: row.task_id,
|
|
27
|
+
tools: JSON.parse(row.tools_json),
|
|
28
|
+
updated_at: row.updated_at,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export function managerConfigPermissionAllowed(config, action) {
|
|
32
|
+
return config !== null && managerPermissionAllowed(config.permissions, action);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=manager-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager-config.js","sourceRoot":"","sources":["../../src/runtime/manager-config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAoBjG,MAAM,UAAU,iBAAiB,CAAC,QAAsB,EAAE,MAAc;IACtE,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC;;;;;;;GAO5B,CAAC,CAAC,GAAG,CAAC,MAAM,CAAiC,CAAC;IAC/C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,mBAAmB,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC;QAC7D,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC;QACzC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC;QAC3C,mBAAmB,EAAE,GAAG,CAAC,mBAAmB;QAC5C,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,WAAW,EAAE,2BAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC1E,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC;QACrD,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QACvC,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;QACtC,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC;QACjC,UAAU,EAAE,GAAG,CAAC,UAAU;KAC3B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,MAAkC,EAAE,MAAc;IAC/F,OAAO,MAAM,KAAK,IAAI,IAAI,wBAAwB,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AACjF,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type ManagerPermissionCategory = "communication" | "context" | "repo" | "verification" | "worker_session";
|
|
2
|
+
export type ManagerPermissions = Record<ManagerPermissionCategory, string[]>;
|
|
3
|
+
export declare function canonicalManagerPermissionNames(name: string): string[];
|
|
4
|
+
export declare function normalizeManagerPermissions(permissions: Record<string, unknown> | null | undefined): ManagerPermissions;
|
|
5
|
+
export declare function flattenManagerPermissions(permissions: Record<string, unknown> | null | undefined): string[];
|
|
6
|
+
export declare function managerPermissionAllowed(permissions: Record<string, unknown> | null | undefined, action: string): boolean;
|
|
7
|
+
export declare function validateRequiredPermission(requiredPermission: string | null): string | null;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
const MANAGER_PERMISSION_TAXONOMY = {
|
|
2
|
+
communication: new Set(["comment_on_pr", "notify_operator"]),
|
|
3
|
+
context: new Set(["spawn_reviewer", "fetch_prs", "fetch_issues"]),
|
|
4
|
+
repo: new Set(["open_pr", "push_branch", "merge_green_pr"]),
|
|
5
|
+
verification: new Set(["run_playwright", "run_xcodebuild", "run_pytest", "run_cargo"]),
|
|
6
|
+
worker_session: new Set(["compact", "clear", "interrupt", "stop"]),
|
|
7
|
+
};
|
|
8
|
+
const MANAGER_PERMISSION_ALIASES = new Map([
|
|
9
|
+
["allow_pr", "repo.open_pr"],
|
|
10
|
+
["create_pr", "repo.open_pr"],
|
|
11
|
+
["allow_merge_green", "repo.merge_green_pr"],
|
|
12
|
+
["merge_green_pr", "repo.merge_green_pr"],
|
|
13
|
+
["allow_worker_compact_clear", ["worker_session.compact", "worker_session.clear"]],
|
|
14
|
+
["worker_compact_clear", ["worker_session.compact", "worker_session.clear"]],
|
|
15
|
+
]);
|
|
16
|
+
const MANAGER_PERMISSION_ACTIONS = new Set(Object.entries(MANAGER_PERMISSION_TAXONOMY).flatMap(([category, actions]) => (Array.from(actions).map((action) => `${category}.${action}`))));
|
|
17
|
+
function emptyManagerPermissions() {
|
|
18
|
+
return {
|
|
19
|
+
communication: [],
|
|
20
|
+
context: [],
|
|
21
|
+
repo: [],
|
|
22
|
+
verification: [],
|
|
23
|
+
worker_session: [],
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export function canonicalManagerPermissionNames(name) {
|
|
27
|
+
const alias = MANAGER_PERMISSION_ALIASES.get(name) ?? name;
|
|
28
|
+
return Array.isArray(alias) ? alias : [alias];
|
|
29
|
+
}
|
|
30
|
+
export function normalizeManagerPermissions(permissions) {
|
|
31
|
+
const normalized = emptyManagerPermissions();
|
|
32
|
+
for (const [key, value] of Object.entries(permissions ?? {})) {
|
|
33
|
+
if (isManagerPermissionCategory(key) && Array.isArray(value)) {
|
|
34
|
+
for (const action of value) {
|
|
35
|
+
if (typeof action === "string" && MANAGER_PERMISSION_TAXONOMY[key].has(action)) {
|
|
36
|
+
grantManagerPermission(normalized, `${key}.${action}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (value) {
|
|
42
|
+
grantManagerPermission(normalized, key);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return normalized;
|
|
46
|
+
}
|
|
47
|
+
export function flattenManagerPermissions(permissions) {
|
|
48
|
+
const normalized = normalizeManagerPermissions(permissions);
|
|
49
|
+
return Object.entries(normalized).flatMap(([category, actions]) => actions.map((action) => `${category}.${action}`));
|
|
50
|
+
}
|
|
51
|
+
export function managerPermissionAllowed(permissions, action) {
|
|
52
|
+
const flattened = new Set(flattenManagerPermissions(permissions));
|
|
53
|
+
return canonicalManagerPermissionNames(action).every((permission) => flattened.has(permission));
|
|
54
|
+
}
|
|
55
|
+
export function validateRequiredPermission(requiredPermission) {
|
|
56
|
+
if (requiredPermission === null) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
const permission = requiredPermission.trim();
|
|
60
|
+
if (!permission) {
|
|
61
|
+
throw new Error("required_permission must be non-empty when provided");
|
|
62
|
+
}
|
|
63
|
+
const unknown = canonicalManagerPermissionNames(permission).filter((item) => !MANAGER_PERMISSION_ACTIONS.has(item));
|
|
64
|
+
if (unknown.length > 0) {
|
|
65
|
+
throw new Error(`unknown required_permission: ${requiredPermission}`);
|
|
66
|
+
}
|
|
67
|
+
return permission;
|
|
68
|
+
}
|
|
69
|
+
function isManagerPermissionCategory(value) {
|
|
70
|
+
return Object.prototype.hasOwnProperty.call(MANAGER_PERMISSION_TAXONOMY, value);
|
|
71
|
+
}
|
|
72
|
+
function grantManagerPermission(normalized, name) {
|
|
73
|
+
for (const canonical of canonicalManagerPermissionNames(name)) {
|
|
74
|
+
const [category, action] = canonical.split(".", 2);
|
|
75
|
+
if (!isManagerPermissionCategory(category) || !action || !MANAGER_PERMISSION_TAXONOMY[category].has(action)) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
const bucket = normalized[category];
|
|
79
|
+
if (!bucket.includes(action)) {
|
|
80
|
+
bucket.push(action);
|
|
81
|
+
bucket.sort();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=manager-permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager-permissions.js","sourceRoot":"","sources":["../../src/runtime/manager-permissions.ts"],"names":[],"mappings":"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"}
|