@oisincoveney/pipeline 1.27.11 → 1.27.12
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/config.d.ts
CHANGED
|
@@ -452,6 +452,7 @@ declare const configSchema: z.ZodObject<{
|
|
|
452
452
|
skills: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
453
453
|
timeout_ms: z.ZodOptional<z.ZodNumber>;
|
|
454
454
|
tools: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
455
|
+
task: "task";
|
|
455
456
|
read: "read";
|
|
456
457
|
list: "list";
|
|
457
458
|
grep: "grep";
|
|
@@ -459,7 +460,6 @@ declare const configSchema: z.ZodObject<{
|
|
|
459
460
|
bash: "bash";
|
|
460
461
|
edit: "edit";
|
|
461
462
|
write: "write";
|
|
462
|
-
task: "task";
|
|
463
463
|
}>>>;
|
|
464
464
|
}, z.core.$strict>>>;
|
|
465
465
|
runner_command: z.ZodDefault<z.ZodObject<{
|
|
@@ -511,6 +511,7 @@ declare const configSchema: z.ZodObject<{
|
|
|
511
511
|
rules: z.ZodOptional<z.ZodBoolean>;
|
|
512
512
|
skills: z.ZodOptional<z.ZodBoolean>;
|
|
513
513
|
tools: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
514
|
+
task: "task";
|
|
514
515
|
read: "read";
|
|
515
516
|
list: "list";
|
|
516
517
|
grep: "grep";
|
|
@@ -518,7 +519,6 @@ declare const configSchema: z.ZodObject<{
|
|
|
518
519
|
bash: "bash";
|
|
519
520
|
edit: "edit";
|
|
520
521
|
write: "write";
|
|
521
|
-
task: "task";
|
|
522
522
|
}>>>;
|
|
523
523
|
}, z.core.$strict>;
|
|
524
524
|
command: z.ZodOptional<z.ZodString>;
|
package/dist/hooks.d.ts
CHANGED
|
@@ -13,8 +13,8 @@ declare const hookResultSchema: z.ZodObject<{
|
|
|
13
13
|
taskContext: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
14
14
|
}, z.core.$strict>>;
|
|
15
15
|
status: z.ZodEnum<{
|
|
16
|
-
pass: "pass";
|
|
17
16
|
fail: "fail";
|
|
17
|
+
pass: "pass";
|
|
18
18
|
skip: "skip";
|
|
19
19
|
}>;
|
|
20
20
|
summary: z.ZodOptional<z.ZodString>;
|
|
@@ -4,7 +4,7 @@ import { normalizeRunnerOutput, runnerTextCandidates } from "../../runner-output
|
|
|
4
4
|
import { gatewayServerForProfile } from "../../mcp/gateway.js";
|
|
5
5
|
import { selectNodeModel } from "../../model-resolver.js";
|
|
6
6
|
import { resolvePackageAssetPath } from "../../package-assets.js";
|
|
7
|
-
import { readJsonSchemaSource, validateJsonSchemaSource } from "../json-validation/json-validation.js";
|
|
7
|
+
import { normalizeJsonSource, readJsonSchemaSource, validateJsonSchemaSource } from "../json-validation/json-validation.js";
|
|
8
8
|
import "../json-validation/index.js";
|
|
9
9
|
import { emit, emitAgentFinish, emitAgentStart } from "../events/events.js";
|
|
10
10
|
import "../events/index.js";
|
|
@@ -54,22 +54,33 @@ async function executeAgentNode(node, context, attempt) {
|
|
|
54
54
|
}
|
|
55
55
|
async function finalizeAgentOutput(inputs) {
|
|
56
56
|
const { attempt, context, node, normalized, plan, result } = inputs;
|
|
57
|
-
const validStructuredOutput = selectValidStructuredOutput(context, node, plan, result.stdout);
|
|
57
|
+
const validStructuredOutput = selectValidStructuredOutput(context, node, normalized, plan, result.stdout);
|
|
58
58
|
if (validStructuredOutput) return validStructuredOutput;
|
|
59
59
|
const repairContext = outputRepairContext(context, node, normalized, result);
|
|
60
60
|
if (!repairContext) return normalized;
|
|
61
61
|
return await runOutputRepair(context, node, normalized, repairContext, attempt);
|
|
62
62
|
}
|
|
63
|
-
function selectValidStructuredOutput(context, node, plan, stdout) {
|
|
63
|
+
function selectValidStructuredOutput(context, node, normalized, plan, stdout) {
|
|
64
64
|
const output = (node.profile ? context.config.profiles[node.profile] : void 0)?.output;
|
|
65
65
|
if (output?.format !== "json_schema" || !output.schema_path) return null;
|
|
66
|
-
const candidates =
|
|
67
|
-
for (const candidate of
|
|
68
|
-
|
|
69
|
-
output
|
|
70
|
-
|
|
66
|
+
const candidates = structuredOutputCandidates(plan, stdout, normalized);
|
|
67
|
+
for (const candidate of candidates) {
|
|
68
|
+
const candidateOutput = normalizeJsonSource(candidate.output);
|
|
69
|
+
if (validateJsonSchemaSource(candidateOutput, output.schema_path, context.worktreePath).passed) return {
|
|
70
|
+
evidence: [candidate.evidence, `selected valid structured output for ${node.id}`],
|
|
71
|
+
output: candidateOutput
|
|
72
|
+
};
|
|
73
|
+
}
|
|
71
74
|
return null;
|
|
72
75
|
}
|
|
76
|
+
function structuredOutputCandidates(plan, stdout, normalized) {
|
|
77
|
+
const candidates = runnerTextCandidates(plan, stdout);
|
|
78
|
+
if (candidates.length > 0) return [...candidates].reverse();
|
|
79
|
+
return [{
|
|
80
|
+
evidence: normalized.evidence.join("; ") || "selected runner stdout",
|
|
81
|
+
output: normalized.output
|
|
82
|
+
}];
|
|
83
|
+
}
|
|
73
84
|
function outputRepairContext(context, node, normalized, result) {
|
|
74
85
|
if (result.exitCode !== 0 || result.timedOut) return null;
|
|
75
86
|
const profile = node.profile ? context.config.profiles[node.profile] : void 0;
|
|
@@ -110,14 +121,15 @@ async function runOutputRepair(context, node, normalized, repairContext, nodeAtt
|
|
|
110
121
|
const repairResult = await context.executor(repairPlan, { signal: context.signal });
|
|
111
122
|
emitAgentFinish(context, repairPlan, nodeAttempt, repairResult);
|
|
112
123
|
const repaired = normalizeAgentOutput(repairPlan, repairResult.stdout);
|
|
113
|
-
const
|
|
124
|
+
const repairedOutput = normalizeJsonSource(repaired.output);
|
|
125
|
+
const repairedValidation = validateJsonSchemaSource(repairedOutput, repairContext.schemaPath, context.worktreePath);
|
|
114
126
|
latest = {
|
|
115
127
|
evidence: [
|
|
116
128
|
...repaired.evidence,
|
|
117
129
|
...repairResult.stderr ? [`repair stderr: ${repairResult.stderr}`] : [],
|
|
118
130
|
...repairResult.timedOut ? ["output repair timed out"] : []
|
|
119
131
|
],
|
|
120
|
-
output:
|
|
132
|
+
output: repairedOutput
|
|
121
133
|
};
|
|
122
134
|
latestValidation = repairedValidation;
|
|
123
135
|
const passed = repairResult.exitCode === 0 && repairedValidation.passed;
|
|
@@ -131,7 +143,7 @@ async function runOutputRepair(context, node, normalized, repairContext, nodeAtt
|
|
|
131
143
|
});
|
|
132
144
|
if (passed) return {
|
|
133
145
|
evidence,
|
|
134
|
-
output:
|
|
146
|
+
output: repairedOutput
|
|
135
147
|
};
|
|
136
148
|
}
|
|
137
149
|
return {
|
|
@@ -6,6 +6,7 @@ import Ajv from "ajv";
|
|
|
6
6
|
import addFormats from "ajv-formats";
|
|
7
7
|
//#region src/runtime/json-validation/json-validation.ts
|
|
8
8
|
const LINE_RE = /\r?\n/;
|
|
9
|
+
const MARKDOWN_JSON_FENCE_RE = /^\s*```(?:json)?\s*\r?\n([\s\S]*?)\r?\n```\s*$/i;
|
|
9
10
|
const jsonSchemaValidator = addFormats(new Ajv({
|
|
10
11
|
allErrors: true,
|
|
11
12
|
strict: false
|
|
@@ -15,7 +16,7 @@ function parseRuntimeOutput(format, output) {
|
|
|
15
16
|
if (!(format === "json" || format === "json_schema" || format === "jsonl")) return { output };
|
|
16
17
|
try {
|
|
17
18
|
if (format === "jsonl") return { output: output.split(LINE_RE).filter((line) => line.trim().length > 0).map((line) => parseJson(line, "runtime JSONL line")) };
|
|
18
|
-
return { output: parseJson(output, "runtime JSON output") };
|
|
19
|
+
return { output: parseJson(normalizeJsonSource(output), "runtime JSON output") };
|
|
19
20
|
} catch (err) {
|
|
20
21
|
return {
|
|
21
22
|
error: err instanceof Error ? err.message : "failed to parse output",
|
|
@@ -26,7 +27,7 @@ function parseRuntimeOutput(format, output) {
|
|
|
26
27
|
function validateJsonSchemaSource(source, schemaPath, worktreePath) {
|
|
27
28
|
try {
|
|
28
29
|
const schemaSource = readJsonSchemaSource(schemaPath, worktreePath);
|
|
29
|
-
const value = parseJson(source, "JSON schema gate value");
|
|
30
|
+
const value = parseJson(normalizeJsonSource(source), "JSON schema gate value");
|
|
30
31
|
const validate = compiledJsonSchemaValidator(schemaPath, schemaSource);
|
|
31
32
|
const errors = validate(value) ? [] : formatJsonSchemaErrors(validate.errors ?? []);
|
|
32
33
|
return {
|
|
@@ -42,6 +43,10 @@ function validateJsonSchemaSource(source, schemaPath, worktreePath) {
|
|
|
42
43
|
};
|
|
43
44
|
}
|
|
44
45
|
}
|
|
46
|
+
function normalizeJsonSource(source) {
|
|
47
|
+
const trimmed = source.trim();
|
|
48
|
+
return MARKDOWN_JSON_FENCE_RE.exec(trimmed)?.[1].trim() ?? trimmed;
|
|
49
|
+
}
|
|
45
50
|
function readJsonSchemaSource(schemaPath, worktreePath) {
|
|
46
51
|
const standardName = standardOutputSchemaNameFromPath(schemaPath);
|
|
47
52
|
if (standardName) return standardOutputSchemaJson(standardName);
|
|
@@ -82,4 +87,4 @@ function parseJsonObject(value) {
|
|
|
82
87
|
}
|
|
83
88
|
}
|
|
84
89
|
//#endregion
|
|
85
|
-
export { parseJsonObject, parseRuntimeOutput, readJsonSchemaSource, readOptionalFile, validateJsonSchemaSource };
|
|
90
|
+
export { normalizeJsonSource, parseJsonObject, parseRuntimeOutput, readJsonSchemaSource, readOptionalFile, validateJsonSchemaSource };
|
package/package.json
CHANGED
|
@@ -120,7 +120,7 @@
|
|
|
120
120
|
"prepack": "bun run build:cli"
|
|
121
121
|
},
|
|
122
122
|
"type": "module",
|
|
123
|
-
"version": "1.27.
|
|
123
|
+
"version": "1.27.12",
|
|
124
124
|
"description": "Config-driven multi-agent pipeline runner for repository work",
|
|
125
125
|
"main": "./dist/index.js",
|
|
126
126
|
"types": "./dist/index.d.ts",
|