@mingyuxu/check 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 +7 -0
- package/dist/critic/critique.d.ts +31 -0
- package/dist/critic/critique.d.ts.map +1 -0
- package/dist/critic/critique.js +68 -0
- package/dist/critic/critique.js.map +1 -0
- package/dist/critic/observe.d.ts +48 -0
- package/dist/critic/observe.d.ts.map +1 -0
- package/dist/critic/observe.js +62 -0
- package/dist/critic/observe.js.map +1 -0
- package/dist/domain/actions.d.ts +67 -0
- package/dist/domain/actions.d.ts.map +1 -0
- package/dist/domain/actions.js +123 -0
- package/dist/domain/actions.js.map +1 -0
- package/dist/domain/invalidation.d.ts +18 -0
- package/dist/domain/invalidation.d.ts.map +1 -0
- package/dist/domain/invalidation.js +44 -0
- package/dist/domain/invalidation.js.map +1 -0
- package/dist/domain/registers.d.ts +45 -0
- package/dist/domain/registers.d.ts.map +1 -0
- package/dist/domain/registers.js +121 -0
- package/dist/domain/registers.js.map +1 -0
- package/dist/domain/view.d.ts +48 -0
- package/dist/domain/view.d.ts.map +1 -0
- package/dist/domain/view.js +70 -0
- package/dist/domain/view.js.map +1 -0
- package/dist/forge/attribution.d.ts +18 -0
- package/dist/forge/attribution.d.ts.map +1 -0
- package/dist/forge/attribution.js +83 -0
- package/dist/forge/attribution.js.map +1 -0
- package/dist/forge/bakeoff.d.ts +35 -0
- package/dist/forge/bakeoff.d.ts.map +1 -0
- package/dist/forge/bakeoff.js +48 -0
- package/dist/forge/bakeoff.js.map +1 -0
- package/dist/forge/contracts.d.ts +67 -0
- package/dist/forge/contracts.d.ts.map +1 -0
- package/dist/forge/contracts.js +70 -0
- package/dist/forge/contracts.js.map +1 -0
- package/dist/forge/evaluate-scenario.d.ts +17 -0
- package/dist/forge/evaluate-scenario.d.ts.map +1 -0
- package/dist/forge/evaluate-scenario.js +93 -0
- package/dist/forge/evaluate-scenario.js.map +1 -0
- package/dist/forge/evaluate.d.ts +25 -0
- package/dist/forge/evaluate.d.ts.map +1 -0
- package/dist/forge/evaluate.js +81 -0
- package/dist/forge/evaluate.js.map +1 -0
- package/dist/forge/feedback.d.ts +21 -0
- package/dist/forge/feedback.d.ts.map +1 -0
- package/dist/forge/feedback.js +41 -0
- package/dist/forge/feedback.js.map +1 -0
- package/dist/forge/reflect.d.ts +35 -0
- package/dist/forge/reflect.d.ts.map +1 -0
- package/dist/forge/reflect.js +72 -0
- package/dist/forge/reflect.js.map +1 -0
- package/dist/forge/scorer.d.ts +67 -0
- package/dist/forge/scorer.d.ts.map +1 -0
- package/dist/forge/scorer.js +99 -0
- package/dist/forge/scorer.js.map +1 -0
- package/dist/forge/trace.d.ts +25 -0
- package/dist/forge/trace.d.ts.map +1 -0
- package/dist/forge/trace.js +51 -0
- package/dist/forge/trace.js.map +1 -0
- package/dist/index.d.ts +78 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/loader.d.ts +19 -0
- package/dist/knowledge/loader.d.ts.map +1 -0
- package/dist/knowledge/loader.js +76 -0
- package/dist/knowledge/loader.js.map +1 -0
- package/dist/knowledge/retrieval.d.ts +23 -0
- package/dist/knowledge/retrieval.d.ts.map +1 -0
- package/dist/knowledge/retrieval.js +100 -0
- package/dist/knowledge/retrieval.js.map +1 -0
- package/dist/knowledge/skill.d.ts +22 -0
- package/dist/knowledge/skill.d.ts.map +1 -0
- package/dist/knowledge/skill.js +112 -0
- package/dist/knowledge/skill.js.map +1 -0
- package/dist/knowledge/write.d.ts +35 -0
- package/dist/knowledge/write.d.ts.map +1 -0
- package/dist/knowledge/write.js +84 -0
- package/dist/knowledge/write.js.map +1 -0
- package/dist/manage.d.ts +7 -0
- package/dist/manage.d.ts.map +1 -0
- package/dist/manage.js +36 -0
- package/dist/manage.js.map +1 -0
- package/dist/methods/loader.d.ts +18 -0
- package/dist/methods/loader.d.ts.map +1 -0
- package/dist/methods/loader.js +65 -0
- package/dist/methods/loader.js.map +1 -0
- package/dist/nodes/aggregate.d.ts +2 -0
- package/dist/nodes/aggregate.d.ts.map +1 -0
- package/dist/nodes/aggregate.js +101 -0
- package/dist/nodes/aggregate.js.map +1 -0
- package/dist/nodes/base.d.ts +31 -0
- package/dist/nodes/base.d.ts.map +1 -0
- package/dist/nodes/base.js +44 -0
- package/dist/nodes/base.js.map +1 -0
- package/dist/nodes/cognition.d.ts +2 -0
- package/dist/nodes/cognition.d.ts.map +1 -0
- package/dist/nodes/cognition.js +263 -0
- package/dist/nodes/cognition.js.map +1 -0
- package/dist/nodes/confidence.d.ts +9 -0
- package/dist/nodes/confidence.d.ts.map +1 -0
- package/dist/nodes/confidence.js +19 -0
- package/dist/nodes/confidence.js.map +1 -0
- package/dist/nodes/deliver.d.ts +2 -0
- package/dist/nodes/deliver.d.ts.map +1 -0
- package/dist/nodes/deliver.js +37 -0
- package/dist/nodes/deliver.js.map +1 -0
- package/dist/nodes/evidence.d.ts +2 -0
- package/dist/nodes/evidence.d.ts.map +1 -0
- package/dist/nodes/evidence.js +118 -0
- package/dist/nodes/evidence.js.map +1 -0
- package/dist/nodes/ground.d.ts +2 -0
- package/dist/nodes/ground.d.ts.map +1 -0
- package/dist/nodes/ground.js +22 -0
- package/dist/nodes/ground.js.map +1 -0
- package/dist/nodes/parse.d.ts +2 -0
- package/dist/nodes/parse.d.ts.map +1 -0
- package/dist/nodes/parse.js +72 -0
- package/dist/nodes/parse.js.map +1 -0
- package/dist/nodes/scope.d.ts +4 -0
- package/dist/nodes/scope.d.ts.map +1 -0
- package/dist/nodes/scope.js +63 -0
- package/dist/nodes/scope.js.map +1 -0
- package/dist/nodes/shape.d.ts +2 -0
- package/dist/nodes/shape.d.ts.map +1 -0
- package/dist/nodes/shape.js +111 -0
- package/dist/nodes/shape.js.map +1 -0
- package/dist/ontology/checkskill.d.ts +26 -0
- package/dist/ontology/checkskill.d.ts.map +1 -0
- package/dist/ontology/checkskill.js +89 -0
- package/dist/ontology/checkskill.js.map +1 -0
- package/dist/ontology/functions.d.ts +29 -0
- package/dist/ontology/functions.d.ts.map +1 -0
- package/dist/ontology/functions.js +143 -0
- package/dist/ontology/functions.js.map +1 -0
- package/dist/ontology/loader.d.ts +44 -0
- package/dist/ontology/loader.d.ts.map +1 -0
- package/dist/ontology/loader.js +254 -0
- package/dist/ontology/loader.js.map +1 -0
- package/dist/ontology/runtime-graph.d.ts +22 -0
- package/dist/ontology/runtime-graph.d.ts.map +1 -0
- package/dist/ontology/runtime-graph.js +111 -0
- package/dist/ontology/runtime-graph.js.map +1 -0
- package/dist/ontology/store.d.ts +65 -0
- package/dist/ontology/store.d.ts.map +1 -0
- package/dist/ontology/store.js +179 -0
- package/dist/ontology/store.js.map +1 -0
- package/dist/parsers/exec.d.ts +9 -0
- package/dist/parsers/exec.d.ts.map +1 -0
- package/dist/parsers/exec.js +41 -0
- package/dist/parsers/exec.js.map +1 -0
- package/dist/parsers/runner.d.ts +2 -0
- package/dist/parsers/runner.d.ts.map +1 -0
- package/dist/parsers/runner.js +26 -0
- package/dist/parsers/runner.js.map +1 -0
- package/dist/parsers/store.d.ts +32 -0
- package/dist/parsers/store.d.ts.map +1 -0
- package/dist/parsers/store.js +64 -0
- package/dist/parsers/store.js.map +1 -0
- package/dist/parsers/synthesize.d.ts +26 -0
- package/dist/parsers/synthesize.d.ts.map +1 -0
- package/dist/parsers/synthesize.js +63 -0
- package/dist/parsers/synthesize.js.map +1 -0
- package/dist/planner.d.ts +89 -0
- package/dist/planner.d.ts.map +1 -0
- package/dist/planner.js +785 -0
- package/dist/planner.js.map +1 -0
- package/dist/project.d.ts +4 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +42 -0
- package/dist/project.js.map +1 -0
- package/dist/scenario-builder.d.ts +56 -0
- package/dist/scenario-builder.d.ts.map +1 -0
- package/dist/scenario-builder.js +366 -0
- package/dist/scenario-builder.js.map +1 -0
- package/dist/schemas/index.d.ts +12 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +8 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/judgment.d.ts +38 -0
- package/dist/schemas/judgment.d.ts.map +1 -0
- package/dist/schemas/judgment.js +45 -0
- package/dist/schemas/judgment.js.map +1 -0
- package/dist/schemas/payloads.d.ts +53 -0
- package/dist/schemas/payloads.d.ts.map +1 -0
- package/dist/schemas/payloads.js +54 -0
- package/dist/schemas/payloads.js.map +1 -0
- package/dist/schemas/result.d.ts +36 -0
- package/dist/schemas/result.d.ts.map +1 -0
- package/dist/schemas/result.js +26 -0
- package/dist/schemas/result.js.map +1 -0
- package/dist/schemas/spec.d.ts +40 -0
- package/dist/schemas/spec.d.ts.map +1 -0
- package/dist/schemas/spec.js +82 -0
- package/dist/schemas/spec.js.map +1 -0
- package/dist/schemas/target.d.ts +28 -0
- package/dist/schemas/target.d.ts.map +1 -0
- package/dist/schemas/target.js +36 -0
- package/dist/schemas/target.js.map +1 -0
- package/dist/schemas/workflow.d.ts +21 -0
- package/dist/schemas/workflow.d.ts.map +1 -0
- package/dist/schemas/workflow.js +100 -0
- package/dist/schemas/workflow.js.map +1 -0
- package/dist/skills/judge-runner.d.ts +2 -0
- package/dist/skills/judge-runner.d.ts.map +1 -0
- package/dist/skills/judge-runner.js +29 -0
- package/dist/skills/judge-runner.js.map +1 -0
- package/dist/skills/judge-synth.d.ts +31 -0
- package/dist/skills/judge-synth.d.ts.map +1 -0
- package/dist/skills/judge-synth.js +87 -0
- package/dist/skills/judge-synth.js.map +1 -0
- package/dist/subagents/worker.d.ts +5 -0
- package/dist/subagents/worker.d.ts.map +1 -0
- package/dist/subagents/worker.js +58 -0
- package/dist/subagents/worker.js.map +1 -0
- package/dist/workflows/context.d.ts +26 -0
- package/dist/workflows/context.d.ts.map +1 -0
- package/dist/workflows/context.js +23 -0
- package/dist/workflows/context.js.map +1 -0
- package/dist/workflows/executor.d.ts +44 -0
- package/dist/workflows/executor.d.ts.map +1 -0
- package/dist/workflows/executor.js +146 -0
- package/dist/workflows/executor.js.map +1 -0
- package/dist/workflows/merge.d.ts +4 -0
- package/dist/workflows/merge.d.ts.map +1 -0
- package/dist/workflows/merge.js +21 -0
- package/dist/workflows/merge.js.map +1 -0
- package/dist/workflows/run.d.ts +20 -0
- package/dist/workflows/run.d.ts.map +1 -0
- package/dist/workflows/run.js +66 -0
- package/dist/workflows/run.js.map +1 -0
- package/knowledge/methods/prose-rule.method.md +21 -0
- package/knowledge/methods/ratio-limit.method.md +31 -0
- package/knowledge/ontology/verification.yaml +268 -0
- package/package.json +36 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/** WorkflowSpec:六范式编排的声明式数据形状。workflow 是数据不是代码,可 diff/冻结/校验。 */
|
|
2
|
+
export const PATTERNS = new Set([
|
|
3
|
+
"classify_and_act", "fanout_and_synthesize", "adversarial_verify",
|
|
4
|
+
"generate_and_filter", "tournament", "loop_until",
|
|
5
|
+
]);
|
|
6
|
+
const REQUIRED = {
|
|
7
|
+
classify_and_act: ["classifier", "routes"],
|
|
8
|
+
fanout_and_synthesize: ["over", "each", "synthesize"],
|
|
9
|
+
adversarial_verify: ["verifiers"],
|
|
10
|
+
generate_and_filter: ["generators", "rubric"],
|
|
11
|
+
tournament: ["attempts", "judge"],
|
|
12
|
+
loop_until: ["body"],
|
|
13
|
+
};
|
|
14
|
+
export class WorkflowError extends Error {
|
|
15
|
+
constructor(message) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.name = "WorkflowError";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export class StepSpec {
|
|
21
|
+
pattern;
|
|
22
|
+
params;
|
|
23
|
+
id;
|
|
24
|
+
when;
|
|
25
|
+
constructor(pattern, params = {}, id = null, when = null) {
|
|
26
|
+
this.pattern = pattern;
|
|
27
|
+
this.params = params;
|
|
28
|
+
this.id = id;
|
|
29
|
+
this.when = when;
|
|
30
|
+
}
|
|
31
|
+
static fromDict(d) {
|
|
32
|
+
const rest = { ...d };
|
|
33
|
+
const pattern = rest.pattern;
|
|
34
|
+
delete rest.pattern;
|
|
35
|
+
if (!pattern)
|
|
36
|
+
throw new WorkflowError(`step 缺 pattern`);
|
|
37
|
+
const sid = rest.id ?? null;
|
|
38
|
+
delete rest.id;
|
|
39
|
+
const when = rest.when ?? null;
|
|
40
|
+
delete rest.when;
|
|
41
|
+
return new StepSpec(pattern, rest, sid, when);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export class WorkflowSpec {
|
|
45
|
+
name;
|
|
46
|
+
steps;
|
|
47
|
+
constructor(name, steps = []) {
|
|
48
|
+
this.name = name;
|
|
49
|
+
this.steps = steps;
|
|
50
|
+
}
|
|
51
|
+
static fromDict(d) {
|
|
52
|
+
return new WorkflowSpec(d.workflow || d.name || "", (d.steps ?? []).map((s) => StepSpec.fromDict(s)));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export function validateWorkflow(spec, knownSteps) {
|
|
56
|
+
const errors = [];
|
|
57
|
+
if (!spec.name.trim())
|
|
58
|
+
errors.push("workflow.name 为空");
|
|
59
|
+
const seenIds = new Set();
|
|
60
|
+
spec.steps.forEach((step, i) => {
|
|
61
|
+
const tag = `step[${i}](${step.pattern})`;
|
|
62
|
+
if (!PATTERNS.has(step.pattern)) {
|
|
63
|
+
errors.push(`${tag}: 未知范式,可用 ${[...PATTERNS].sort().join(", ")}`);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
for (const req of REQUIRED[step.pattern]) {
|
|
67
|
+
if (!(req in step.params))
|
|
68
|
+
errors.push(`${tag}: 缺必填参数 '${req}'`);
|
|
69
|
+
}
|
|
70
|
+
if (knownSteps) {
|
|
71
|
+
for (const name of referencedStepNames(step)) {
|
|
72
|
+
if (name === "skip" || name == null)
|
|
73
|
+
continue;
|
|
74
|
+
if (!knownSteps.has(name) && !seenIds.has(name)) {
|
|
75
|
+
errors.push(`${tag}: 引用了未注册的 step '${name}'`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
if (step.id)
|
|
80
|
+
seenIds.add(step.id);
|
|
81
|
+
});
|
|
82
|
+
return errors;
|
|
83
|
+
}
|
|
84
|
+
function referencedStepNames(step) {
|
|
85
|
+
const p = step.params;
|
|
86
|
+
const names = [];
|
|
87
|
+
for (const key of ["classifier", "synthesize", "worker", "rubric", "judge", "until"]) {
|
|
88
|
+
if (typeof p[key] === "string")
|
|
89
|
+
names.push(p[key]);
|
|
90
|
+
}
|
|
91
|
+
for (const key of ["each", "body", "verifiers", "generators"]) {
|
|
92
|
+
if (Array.isArray(p[key]))
|
|
93
|
+
names.push(...p[key].filter((x) => typeof x === "string"));
|
|
94
|
+
}
|
|
95
|
+
if (p.routes && typeof p.routes === "object") {
|
|
96
|
+
names.push(...Object.values(p.routes).filter((x) => typeof x === "string"));
|
|
97
|
+
}
|
|
98
|
+
return names;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/schemas/workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"judge-runner.d.ts","sourceRoot":"","sources":["../../src/skills/judge-runner.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 判定函数 judge.mjs 的探针 runner —— 独立子进程里跑「agent 生成的」判定代码(放开红线的隔离层)。
|
|
3
|
+
* argv: [node, judge-runner.js, judgePath, probesJsonPath, outJsonPath]
|
|
4
|
+
* 动态 import judge → 对每个探针 judge(evidence, ctx) → 收集 verdict/grounded_in 写 outPath。
|
|
5
|
+
* 进程隔离 + 超时 kill 由父进程(judge-synth)负责,限制生成代码的爆炸半径。
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
8
|
+
import { pathToFileURL } from "node:url";
|
|
9
|
+
async function main() {
|
|
10
|
+
const [, , judgePath, probesPath, outPath] = process.argv;
|
|
11
|
+
try {
|
|
12
|
+
const mod = await import(pathToFileURL(judgePath).href);
|
|
13
|
+
if (typeof mod.judge !== "function")
|
|
14
|
+
throw new Error("adapter 未导出 async function judge(evidence, ctx)");
|
|
15
|
+
const probes = JSON.parse(readFileSync(probesPath, "utf-8"));
|
|
16
|
+
const results = [];
|
|
17
|
+
for (const p of probes) {
|
|
18
|
+
const r = await mod.judge(p.evidence, p.ctx ?? {});
|
|
19
|
+
results.push({ verdict: r?.verdict ?? null, grounded_in: r?.grounded_in ?? [] });
|
|
20
|
+
}
|
|
21
|
+
writeFileSync(outPath, JSON.stringify(results), "utf-8");
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
writeFileSync(outPath + ".err", e.stack ?? String(e), "utf-8");
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
main();
|
|
29
|
+
//# sourceMappingURL=judge-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"judge-runner.js","sourceRoot":"","sources":["../../src/skills/judge-runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,KAAK,UAAU,IAAI;IACjB,MAAM,CAAC,EAAE,AAAD,EAAG,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACxG,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAgD,CAAC;QAC5G,MAAM,OAAO,GAAsD,EAAE,CAAC;QACtE,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,IAAI,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,IAAI,EAAE,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,aAAa,CAAC,OAAO,GAAG,MAAM,EAAG,CAAW,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AACD,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export declare const DEFAULT_JUDGE_RUNNER: string;
|
|
2
|
+
export interface JudgeProbe {
|
|
3
|
+
evidence: unknown;
|
|
4
|
+
ctx?: unknown;
|
|
5
|
+
expected: string;
|
|
6
|
+
}
|
|
7
|
+
export interface LLMLike {
|
|
8
|
+
completeJson(system: string, user: string, mockFn?: () => Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
9
|
+
}
|
|
10
|
+
export interface JudgeSynthOpts {
|
|
11
|
+
name: string;
|
|
12
|
+
rubric: string;
|
|
13
|
+
constraint?: unknown;
|
|
14
|
+
probes: JudgeProbe[];
|
|
15
|
+
llm: LLMLike;
|
|
16
|
+
outDir: string;
|
|
17
|
+
workDir: string;
|
|
18
|
+
runnerScript?: string;
|
|
19
|
+
timeoutSeconds?: number;
|
|
20
|
+
maxTries?: number;
|
|
21
|
+
passBar?: number;
|
|
22
|
+
mock?: () => Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
export interface JudgeSynthResult {
|
|
25
|
+
ok: boolean;
|
|
26
|
+
tries: number;
|
|
27
|
+
passRate: number;
|
|
28
|
+
judgePath: string;
|
|
29
|
+
}
|
|
30
|
+
export declare function synthesizeJudge(o: JudgeSynthOpts): Promise<JudgeSynthResult>;
|
|
31
|
+
//# sourceMappingURL=judge-synth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"judge-synth.d.ts","sourceRoot":"","sources":["../../src/skills/judge-synth.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,oBAAoB,QAA+D,CAAC;AAEjG,MAAM,WAAW,UAAU;IAAG,QAAQ,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;CAAE;AAEnF,MAAM,WAAW,OAAO;IACtB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACtH;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,gBAAgB;IAAG,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;CAAE;AA6CtG,wBAAsB,eAAe,CAAC,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA0BlF"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 判定函数合成(P5 · 放开红线让 agent 写代码)—— 读判据→写 judge.mjs→拿探针过门→冻结。
|
|
3
|
+
* 与解析器 adapter 同一纪律:生成代码必须在沙箱里把探针判对到门槛才冻结,否则带错反思重试(有界)。
|
|
4
|
+
* 冻结产物 judge.mjs 是可人工审阅的数据资产;run 期回放,绝不现场生成。安全靠:沙箱执行 + 探针门 + HITL 审阅。
|
|
5
|
+
*/
|
|
6
|
+
import { existsSync, mkdirSync, writeFileSync, copyFileSync, rmSync, readFileSync } from "node:fs";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
import { spawn } from "node:child_process";
|
|
9
|
+
import { fileURLToPath } from "node:url";
|
|
10
|
+
import { Sandbox } from "@mingyuxu/core";
|
|
11
|
+
export const DEFAULT_JUDGE_RUNNER = fileURLToPath(new URL("./judge-runner.js", import.meta.url));
|
|
12
|
+
const SYSTEM = "你在为金融文档核查系统合成「判定函数」。读判据(rubric)与约束(constraint),写一个 ESM 模块," +
|
|
13
|
+
"导出 `export async function judge(evidence, ctx)`。evidence 是取到的证据(字符串,或 {quote, extracted_value})。" +
|
|
14
|
+
"返回 { verdict: 'pass'|'fail'|'needs_review', grounded_in: [引用到的证据] }。" +
|
|
15
|
+
"抽不到关键数值/信息时返回 needs_review,不要猜。用纯 Node(可 import 内置模块),不要外部依赖。" +
|
|
16
|
+
"只返回 JSON:{\"code\": \"<完整模块源码>\", \"notes\": \"<一句话>\"}。";
|
|
17
|
+
function userPrompt(o, lastErr) {
|
|
18
|
+
let u = `判据(rubric):\n${o.rubric}\n`;
|
|
19
|
+
if (o.constraint)
|
|
20
|
+
u += `约束(constraint):${JSON.stringify(o.constraint)}\n`;
|
|
21
|
+
u += `探针样例(会用来验证你的代码,evidence→期望 verdict):\n${JSON.stringify(o.probes.map((p) => ({ evidence: p.evidence, expected: p.expected })), null, 2)}\n`;
|
|
22
|
+
if (lastErr)
|
|
23
|
+
u += `\n上一版未过门,请修正后重写完整模块:\n${lastErr.slice(0, 600)}`;
|
|
24
|
+
return u;
|
|
25
|
+
}
|
|
26
|
+
/** 在独立进程里对全部探针跑一遍 judge,返回每探针的 verdict。超时 kill。 */
|
|
27
|
+
async function runProbes(judgePath, probes, opts) {
|
|
28
|
+
const runner = opts.runnerScript ?? DEFAULT_JUDGE_RUNNER;
|
|
29
|
+
const sandbox = new Sandbox(opts.workDir);
|
|
30
|
+
mkdirSync(opts.workDir, { recursive: true });
|
|
31
|
+
const probesPath = sandbox.checkWrite(join(opts.workDir, "probes.json"));
|
|
32
|
+
const outPath = sandbox.checkWrite(join(opts.workDir, "verdicts.json"));
|
|
33
|
+
for (const p of [outPath, outPath + ".err"])
|
|
34
|
+
if (existsSync(p))
|
|
35
|
+
rmSync(p);
|
|
36
|
+
writeFileSync(probesPath, JSON.stringify(probes.map((p) => ({ evidence: p.evidence, ctx: p.ctx }))), "utf-8");
|
|
37
|
+
const timeout = (opts.timeoutSeconds ?? 20) * 1000;
|
|
38
|
+
await new Promise((resolve, reject) => {
|
|
39
|
+
const proc = spawn("node", [runner, judgePath, probesPath, outPath], { stdio: ["ignore", "ignore", "pipe"] });
|
|
40
|
+
let stderr = "";
|
|
41
|
+
proc.stderr?.on("data", (d) => { stderr += String(d); });
|
|
42
|
+
const timer = setTimeout(() => { proc.kill("SIGKILL"); reject(new Error(`judge 执行超时(>${opts.timeoutSeconds ?? 20}s)`)); }, timeout);
|
|
43
|
+
proc.on("error", (e) => { clearTimeout(timer); reject(e); });
|
|
44
|
+
proc.on("exit", (code) => {
|
|
45
|
+
clearTimeout(timer);
|
|
46
|
+
if (code === 0)
|
|
47
|
+
return resolve();
|
|
48
|
+
const detail = existsSync(outPath + ".err") ? readFileSync(outPath + ".err", "utf-8") : stderr || `退出码 ${code}`;
|
|
49
|
+
reject(new Error(detail.slice(0, 800)));
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
const results = JSON.parse(readFileSync(outPath, "utf-8"));
|
|
53
|
+
return results.map((r) => String(r.verdict));
|
|
54
|
+
}
|
|
55
|
+
export async function synthesizeJudge(o) {
|
|
56
|
+
const maxTries = o.maxTries ?? 3;
|
|
57
|
+
const passBar = o.passBar ?? 0.9;
|
|
58
|
+
mkdirSync(o.workDir, { recursive: true });
|
|
59
|
+
const draftPath = join(o.workDir, "judge.mjs");
|
|
60
|
+
let lastErr;
|
|
61
|
+
for (let attempt = 1; attempt <= maxTries; attempt++) {
|
|
62
|
+
const res = o.mock ? o.mock() : await o.llm.completeJson(SYSTEM, userPrompt(o, lastErr));
|
|
63
|
+
const code = String(res.code ?? "").trim();
|
|
64
|
+
if (!code) {
|
|
65
|
+
lastErr = "模型未返回 code";
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
writeFileSync(draftPath, code, "utf-8");
|
|
69
|
+
try {
|
|
70
|
+
const verdicts = await runProbes(draftPath, o.probes, { runnerScript: o.runnerScript, workDir: join(o.workDir, "probe"), timeoutSeconds: o.timeoutSeconds });
|
|
71
|
+
const hits = verdicts.filter((v, i) => v === o.probes[i].expected).length;
|
|
72
|
+
const passRate = o.probes.length ? hits / o.probes.length : 0;
|
|
73
|
+
if (passRate >= passBar) { // 过门 → 冻结
|
|
74
|
+
mkdirSync(o.outDir, { recursive: true });
|
|
75
|
+
copyFileSync(draftPath, join(o.outDir, "judge.mjs"));
|
|
76
|
+
writeFileSync(join(o.outDir, "judge.meta.json"), JSON.stringify({ name: o.name, verified: true, pass_rate: passRate, probes: o.probes.length, tries: attempt, created_by: "synthesized" }, null, 2), "utf-8");
|
|
77
|
+
return { ok: true, tries: attempt, passRate, judgePath: join(o.outDir, "judge.mjs") };
|
|
78
|
+
}
|
|
79
|
+
lastErr = `探针通过率 ${(passRate * 100).toFixed(0)}% < 门槛 ${(passBar * 100).toFixed(0)}%(判错 ${o.probes.length - hits}/${o.probes.length})`;
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
lastErr = e.message;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
throw new Error(`判定函数 ${o.name} 合成失败(试 ${maxTries} 次):${lastErr}`);
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=judge-synth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"judge-synth.js","sourceRoot":"","sources":["../../src/skills/judge-synth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/subagents/worker.ts"],"names":[],"mappings":";AAiBA,iBAAe,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAgBnF;AAID,iBAAe,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAcnD;AAOD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* 核查领域 subagent worker(独立进程)—— 从 Python check/subagents/worker.py 移植(bakeoff 任务)。
|
|
4
|
+
* `node worker.js <工作目录>`:读 task.json 执行任务,结果写 result.json,状态 status.json。
|
|
5
|
+
* bake-off 判卷在此独立进程跑(I6 判卷≠做题的物理隔离),自带 LLM client,与主 agent 只共享文件。
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { LLMClient, Ledger } from "@mingyuxu/ai";
|
|
10
|
+
import { loadPack } from "../knowledge/loader.js";
|
|
11
|
+
import { runBakeoff } from "../forge/bakeoff.js";
|
|
12
|
+
import { loadBuiltinComponents } from "../nodes/base.js";
|
|
13
|
+
function writeStatus(workDir, status, error = "") {
|
|
14
|
+
writeFileSync(join(workDir, "status.json"), JSON.stringify(error ? { status, error } : { status }), "utf-8");
|
|
15
|
+
}
|
|
16
|
+
async function bakeoff(workDir, args) {
|
|
17
|
+
await loadBuiltinComponents();
|
|
18
|
+
const ledger = new Ledger();
|
|
19
|
+
const key = process.env.KC_LLM_API_KEY ?? "";
|
|
20
|
+
const model = process.env.KC_LLM_WORKER_MODEL || process.env.KC_LLM_MODEL || "";
|
|
21
|
+
const llm = key
|
|
22
|
+
? new LLMClient({ mode: "real", baseUrl: process.env.KC_LLM_BASE_URL ?? "", apiKey: key, model, ledger })
|
|
23
|
+
: new LLMClient({ mode: "mock", ledger });
|
|
24
|
+
const pack = loadPack(args.pack_dir);
|
|
25
|
+
const oracle = JSON.parse(readFileSync(args.oracle_path, "utf-8"));
|
|
26
|
+
const rep = await runBakeoff({ profile: pack.profile, refdata: pack.refdata, targets: pack.targets }, pack.frozen, oracle, {
|
|
27
|
+
llm: llm, historyPath: args.history_path || undefined,
|
|
28
|
+
accuracyBar: args.accuracy_bar != null ? Number(args.accuracy_bar) : undefined,
|
|
29
|
+
winnerMetric: args.winner_metric,
|
|
30
|
+
});
|
|
31
|
+
return { winner: rep.winner, ranking: rep.ranking, winner_report: rep.winner_report, ledger: ledger.summary() };
|
|
32
|
+
}
|
|
33
|
+
const TASKS = { bakeoff };
|
|
34
|
+
async function main(argv) {
|
|
35
|
+
const workDir = argv[0];
|
|
36
|
+
const spec = JSON.parse(readFileSync(join(workDir, "task.json"), "utf-8"));
|
|
37
|
+
const fn = TASKS[spec.task];
|
|
38
|
+
if (!fn) {
|
|
39
|
+
writeStatus(workDir, "error", `未知任务: ${spec.task}`);
|
|
40
|
+
return 1;
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
const result = await fn(workDir, spec.args ?? {});
|
|
44
|
+
writeFileSync(join(workDir, "result.json"), JSON.stringify(result, null, 2), "utf-8");
|
|
45
|
+
writeStatus(workDir, "done");
|
|
46
|
+
return 0;
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
writeStatus(workDir, "error", `${e.name}: ${e.message}`);
|
|
50
|
+
return 1;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// 作为脚本直接运行时执行(被 spawnSubagent 起)
|
|
54
|
+
if (existsSync(process.argv[2] ?? "")) {
|
|
55
|
+
main([process.argv[2]]).then((c) => process.exit(c)).catch(() => process.exit(1));
|
|
56
|
+
}
|
|
57
|
+
export { main, bakeoff };
|
|
58
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/subagents/worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** RunContext —— 承载状态穿过八段(一个文档/目标一份)。从 Python context.py 移植。 */
|
|
2
|
+
import type { DocumentIR, Profile, EvidenceBundle, CheckResult } from "../schemas/payloads.js";
|
|
3
|
+
import type { ResultEnvelope } from "../schemas/result.js";
|
|
4
|
+
import type { Target } from "../schemas/target.js";
|
|
5
|
+
export interface LedgerLike {
|
|
6
|
+
record(model: string, promptTokens?: number, completionTokens?: number): void;
|
|
7
|
+
}
|
|
8
|
+
export interface LLMLike {
|
|
9
|
+
mode: string;
|
|
10
|
+
completeJson(system: string, user: string, mockFn?: () => Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
11
|
+
}
|
|
12
|
+
export declare class RunContext {
|
|
13
|
+
document: DocumentIR;
|
|
14
|
+
profile: Profile | null;
|
|
15
|
+
target: Target | null;
|
|
16
|
+
evidence: EvidenceBundle | null;
|
|
17
|
+
checks: CheckResult[];
|
|
18
|
+
result: ResultEnvelope | null;
|
|
19
|
+
results: ResultEnvelope[];
|
|
20
|
+
docResult: Record<string, unknown> | null;
|
|
21
|
+
scratch: Record<string, any>;
|
|
22
|
+
ledger: LedgerLike | null;
|
|
23
|
+
constructor(document: DocumentIR, opts?: Partial<RunContext>);
|
|
24
|
+
forkTarget(target: Target): RunContext;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/workflows/context.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/E;AACD,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACtH;AAED,qBAAa,UAAU;IACrB,QAAQ,EAAE,UAAU,CAAC;IACrB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAQ;IAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC7B,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAQ;IACvC,MAAM,EAAE,WAAW,EAAE,CAAM;IAC3B,MAAM,EAAE,cAAc,GAAG,IAAI,CAAQ;IACrC,OAAO,EAAE,cAAc,EAAE,CAAM;IAC/B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAQ;IACjD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAM;IAClC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAQ;gBAErB,QAAQ,EAAE,UAAU,EAAE,IAAI,GAAE,OAAO,CAAC,UAAU,CAAM;IAKhE,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU;CAMvC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export class RunContext {
|
|
2
|
+
document;
|
|
3
|
+
profile = null;
|
|
4
|
+
target = null;
|
|
5
|
+
evidence = null;
|
|
6
|
+
checks = [];
|
|
7
|
+
result = null;
|
|
8
|
+
results = [];
|
|
9
|
+
docResult = null;
|
|
10
|
+
scratch = {};
|
|
11
|
+
ledger = null;
|
|
12
|
+
constructor(document, opts = {}) {
|
|
13
|
+
this.document = document;
|
|
14
|
+
Object.assign(this, opts);
|
|
15
|
+
}
|
|
16
|
+
forkTarget(target) {
|
|
17
|
+
const c = new RunContext(this.document, {
|
|
18
|
+
profile: this.profile, target, scratch: this.scratch, ledger: this.ledger,
|
|
19
|
+
});
|
|
20
|
+
return c;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/workflows/context.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,UAAU;IACrB,QAAQ,CAAa;IACrB,OAAO,GAAmB,IAAI,CAAC;IAC/B,MAAM,GAAkB,IAAI,CAAC;IAC7B,QAAQ,GAA0B,IAAI,CAAC;IACvC,MAAM,GAAkB,EAAE,CAAC;IAC3B,MAAM,GAA0B,IAAI,CAAC;IACrC,OAAO,GAAqB,EAAE,CAAC;IAC/B,SAAS,GAAmC,IAAI,CAAC;IACjD,OAAO,GAAwB,EAAE,CAAC;IAClC,MAAM,GAAsB,IAAI,CAAC;IAEjC,YAAY,QAAoB,EAAE,OAA4B,EAAE;QAC9D,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,UAAU,CAAC,MAAc;QACvB,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE;YACtC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM;SAC1E,CAAC,CAAC;QACH,OAAO,CAAC,CAAC;IACX,CAAC;CACF"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 八段骨架执行器(不是通用图调度器)—— 跑固定段序;每段可空、可多路。
|
|
3
|
+
* 从 Python executor.py 忠实移植。节点 fn 可能异步(调 LLM),故 runStage/runDocument 异步。
|
|
4
|
+
*/
|
|
5
|
+
import { PipelineSpec } from "../schemas/spec.js";
|
|
6
|
+
import { DocumentIR } from "../schemas/payloads.js";
|
|
7
|
+
import { type ResultEnvelope } from "../schemas/result.js";
|
|
8
|
+
import type { Target } from "../schemas/target.js";
|
|
9
|
+
import { RunContext, type LLMLike, type LedgerLike } from "./context.js";
|
|
10
|
+
export interface ExecutorOptions {
|
|
11
|
+
profileVocab?: Record<string, unknown>;
|
|
12
|
+
refdata?: Record<string, unknown>;
|
|
13
|
+
llm?: LLMLike | null;
|
|
14
|
+
validate?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare class Executor {
|
|
17
|
+
spec: PipelineSpec;
|
|
18
|
+
profileVocab: Record<string, unknown>;
|
|
19
|
+
refdata: Record<string, unknown>;
|
|
20
|
+
llm: LLMLike | null;
|
|
21
|
+
constructor(spec: PipelineSpec, opts?: ExecutorOptions);
|
|
22
|
+
runDocument(doc: DocumentIR, targets: Target[], opts?: {
|
|
23
|
+
rawText?: string;
|
|
24
|
+
ledger?: LedgerLike;
|
|
25
|
+
}): Promise<Record<string, unknown>>;
|
|
26
|
+
prepare(doc: DocumentIR, opts?: {
|
|
27
|
+
rawText?: string;
|
|
28
|
+
ledger?: LedgerLike;
|
|
29
|
+
}): Promise<RunContext>;
|
|
30
|
+
reviewTarget(ctx: RunContext, target: Target): Promise<ResultEnvelope>;
|
|
31
|
+
deliver(ctx: RunContext): Promise<Record<string, unknown>>;
|
|
32
|
+
runCase(targets: Target[], rawDocs: Array<{
|
|
33
|
+
document_id: string;
|
|
34
|
+
text: string;
|
|
35
|
+
received_at?: string;
|
|
36
|
+
doc_type?: string;
|
|
37
|
+
}>, opts?: {
|
|
38
|
+
caseId?: string;
|
|
39
|
+
ledger?: LedgerLike;
|
|
40
|
+
}): Promise<Record<string, unknown>>;
|
|
41
|
+
private runStage;
|
|
42
|
+
private applicable;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/workflows/executor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAgB,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAA2C,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACpG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGnD,OAAO,EAAE,UAAU,EAAE,KAAK,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAOzE,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,QAAQ;IACnB,IAAI,EAAE,YAAY,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC;gBAER,IAAI,EAAE,YAAY,EAAE,IAAI,GAAE,eAAoB;IAQpD,WAAW,CACf,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,UAAU,CAAA;KAAO,GACnD,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAO7B,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,UAAU,CAAA;KAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IAkBnG,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IActE,OAAO,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAK1D,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,UAAU,CAAA;KAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAoCzM,QAAQ;IAQtB,OAAO,CAAC,UAAU;CAInB"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 八段骨架执行器(不是通用图调度器)—— 跑固定段序;每段可空、可多路。
|
|
3
|
+
* 从 Python executor.py 忠实移植。节点 fn 可能异步(调 LLM),故 runStage/runDocument 异步。
|
|
4
|
+
*/
|
|
5
|
+
import { validateSpec } from "../schemas/spec.js";
|
|
6
|
+
import { DocumentIR } from "../schemas/payloads.js";
|
|
7
|
+
import { makeOutcome, makeConfidence, makeResult } from "../schemas/result.js";
|
|
8
|
+
import { getComponent, registry, STAGE_OF_TYPE } from "../nodes/base.js";
|
|
9
|
+
import { facetMatch } from "../nodes/scope.js";
|
|
10
|
+
import { RunContext } from "./context.js";
|
|
11
|
+
import { mergeDocuments } from "./merge.js";
|
|
12
|
+
const DOC_STAGES = ["parse", "scope"];
|
|
13
|
+
const TARGET_STAGES = ["evidence", "cognition", "ground", "shape", "aggregate"];
|
|
14
|
+
const DELIVER_STAGE = "deliver";
|
|
15
|
+
export class Executor {
|
|
16
|
+
spec;
|
|
17
|
+
profileVocab;
|
|
18
|
+
refdata;
|
|
19
|
+
llm;
|
|
20
|
+
constructor(spec, opts = {}) {
|
|
21
|
+
this.spec = spec;
|
|
22
|
+
this.profileVocab = opts.profileVocab ?? {};
|
|
23
|
+
this.refdata = opts.refdata ?? {};
|
|
24
|
+
this.llm = opts.llm ?? null;
|
|
25
|
+
if (opts.validate ?? true)
|
|
26
|
+
validateSpec(spec, registry(), STAGE_OF_TYPE);
|
|
27
|
+
}
|
|
28
|
+
async runDocument(doc, targets, opts = {}) {
|
|
29
|
+
const ctx = await this.prepare(doc, opts);
|
|
30
|
+
for (const target of targets)
|
|
31
|
+
ctx.results.push(await this.reviewTarget(ctx, target));
|
|
32
|
+
await this.deliver(ctx);
|
|
33
|
+
return ctx.docResult;
|
|
34
|
+
}
|
|
35
|
+
async prepare(doc, opts = {}) {
|
|
36
|
+
const ctx = new RunContext(doc);
|
|
37
|
+
ctx.ledger = opts.ledger ?? null;
|
|
38
|
+
ctx.scratch.workflow_id = this.spec.scenario_key;
|
|
39
|
+
ctx.scratch.facet_vocab = this.profileVocab;
|
|
40
|
+
ctx.scratch.refdata = this.refdata;
|
|
41
|
+
ctx.scratch.case_id = doc.document_id;
|
|
42
|
+
ctx.scratch.llm = this.llm;
|
|
43
|
+
if (opts.rawText !== undefined) {
|
|
44
|
+
ctx.scratch.raw_text = opts.rawText;
|
|
45
|
+
ctx.scratch.document_id ??= doc ? doc.document_id : "doc";
|
|
46
|
+
}
|
|
47
|
+
const unit = this.spec.unit();
|
|
48
|
+
if (unit !== "per_doc_rule")
|
|
49
|
+
throw new Error(`runDocument only supports per_doc_rule; use runCase for '${unit}'`);
|
|
50
|
+
for (const stage of DOC_STAGES)
|
|
51
|
+
await this.runStage(stage, ctx);
|
|
52
|
+
return ctx;
|
|
53
|
+
}
|
|
54
|
+
async reviewTarget(ctx, target) {
|
|
55
|
+
const tctx = ctx.forkTarget(target);
|
|
56
|
+
if (!this.applicable(target, ctx)) {
|
|
57
|
+
tctx.result = notApplicable(target, ctx.document);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
try {
|
|
61
|
+
for (const stage of TARGET_STAGES)
|
|
62
|
+
await this.runStage(stage, tctx);
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
tctx.result = errored(target, ctx.document, String(e));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return tctx.result;
|
|
69
|
+
}
|
|
70
|
+
async deliver(ctx) {
|
|
71
|
+
await this.runStage(DELIVER_STAGE, ctx);
|
|
72
|
+
return ctx.docResult;
|
|
73
|
+
}
|
|
74
|
+
async runCase(targets, rawDocs, opts = {}) {
|
|
75
|
+
const unit = this.spec.unit();
|
|
76
|
+
if (!["per_rule_group", "per_case"].includes(unit))
|
|
77
|
+
throw new Error(`runCase is for per_rule_group/per_case, not '${unit}'`);
|
|
78
|
+
const parsed = [];
|
|
79
|
+
for (const rd of rawDocs) {
|
|
80
|
+
const pc = new RunContext(new DocumentIR(rd.document_id));
|
|
81
|
+
pc.ledger = opts.ledger ?? null;
|
|
82
|
+
pc.scratch.raw_text = rd.text;
|
|
83
|
+
pc.scratch.document_id = rd.document_id;
|
|
84
|
+
await this.runStage("parse", pc);
|
|
85
|
+
pc.document.metadata.received_at = rd.received_at ?? "";
|
|
86
|
+
pc.document.metadata.doc_type = rd.doc_type ?? "";
|
|
87
|
+
parsed.push(pc.document);
|
|
88
|
+
}
|
|
89
|
+
const merged = mergeDocuments(parsed);
|
|
90
|
+
const ctx = new RunContext(merged);
|
|
91
|
+
ctx.ledger = opts.ledger ?? null;
|
|
92
|
+
ctx.scratch.workflow_id = this.spec.scenario_key;
|
|
93
|
+
ctx.scratch.facet_vocab = this.profileVocab;
|
|
94
|
+
ctx.scratch.refdata = this.refdata;
|
|
95
|
+
ctx.scratch.case_id = opts.caseId ?? merged.document_id;
|
|
96
|
+
ctx.scratch.llm = this.llm;
|
|
97
|
+
await this.runStage("scope", ctx);
|
|
98
|
+
for (const target of targets) {
|
|
99
|
+
const tctx = ctx.forkTarget(target);
|
|
100
|
+
if (!this.applicable(target, ctx))
|
|
101
|
+
tctx.result = notApplicable(target, merged);
|
|
102
|
+
else {
|
|
103
|
+
try {
|
|
104
|
+
for (const stage of TARGET_STAGES)
|
|
105
|
+
await this.runStage(stage, tctx);
|
|
106
|
+
}
|
|
107
|
+
catch (e) {
|
|
108
|
+
tctx.result = errored(target, merged, String(e));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
ctx.results.push(tctx.result);
|
|
112
|
+
}
|
|
113
|
+
await this.runStage(DELIVER_STAGE, ctx);
|
|
114
|
+
return ctx.docResult;
|
|
115
|
+
}
|
|
116
|
+
async runStage(stage, ctx) {
|
|
117
|
+
for (const step of this.spec.steps(stage)) {
|
|
118
|
+
if (!("type" in step))
|
|
119
|
+
continue; // bare join marker
|
|
120
|
+
const comp = getComponent(step.type, step.method);
|
|
121
|
+
await comp.fn(ctx, step.params ?? {});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
applicable(target, ctx) {
|
|
125
|
+
const pol = this.spec.fanout.unknown_policy ?? "include";
|
|
126
|
+
return facetMatch(target.applicability, ctx.profile, pol);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function notApplicable(target, doc) {
|
|
130
|
+
return makeResult(target.target_id, {
|
|
131
|
+
unit: { doc: doc.document_id },
|
|
132
|
+
outcome: makeOutcome({ kind: "verdict", verdict: "not_applicable" }),
|
|
133
|
+
status: "not_applicable",
|
|
134
|
+
confidence: makeConfidence({ score: 1.0, band: "high" }),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
function errored(target, doc, msg) {
|
|
138
|
+
return makeResult(target.target_id, {
|
|
139
|
+
unit: { doc: doc.document_id },
|
|
140
|
+
outcome: makeOutcome({ kind: "verdict", verdict: null }),
|
|
141
|
+
status: "error",
|
|
142
|
+
provenance: { error: msg },
|
|
143
|
+
confidence: makeConfidence({ score: 0.0, band: "low" }),
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/workflows/executor.ts"],"names":[],"mappings":"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"}
|