polpo-ai 0.2.5 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/engine.js +3 -3
- package/dist/adapters/node-spawner.d.ts +14 -0
- package/dist/adapters/node-spawner.d.ts.map +1 -0
- package/dist/adapters/node-spawner.js +87 -0
- package/dist/adapters/node-spawner.js.map +1 -0
- package/dist/assessment/assessor.d.ts +2 -10
- package/dist/assessment/assessor.d.ts.map +1 -1
- package/dist/assessment/assessor.js +28 -181
- package/dist/assessment/assessor.js.map +1 -1
- package/dist/assessment/schemas.d.ts +2 -99
- package/dist/assessment/schemas.d.ts.map +1 -1
- package/dist/assessment/schemas.js +2 -109
- package/dist/assessment/schemas.js.map +1 -1
- package/dist/assessment/scoring.d.ts +2 -23
- package/dist/assessment/scoring.d.ts.map +1 -1
- package/dist/assessment/scoring.js +2 -126
- package/dist/assessment/scoring.js.map +1 -1
- package/dist/core/assessment-orchestrator.d.ts +12 -72
- package/dist/core/assessment-orchestrator.d.ts.map +1 -1
- package/dist/core/assessment-orchestrator.js +50 -710
- package/dist/core/assessment-orchestrator.js.map +1 -1
- package/dist/core/assessment-prompts.d.ts +3 -42
- package/dist/core/assessment-prompts.d.ts.map +1 -1
- package/dist/core/assessment-prompts.js +3 -202
- package/dist/core/assessment-prompts.js.map +1 -1
- package/dist/core/mission-executor.d.ts +2 -249
- package/dist/core/mission-executor.d.ts.map +1 -1
- package/dist/core/mission-executor.js +2 -1016
- package/dist/core/mission-executor.js.map +1 -1
- package/dist/core/orchestrator.d.ts +9 -2
- package/dist/core/orchestrator.d.ts.map +1 -1
- package/dist/core/orchestrator.js +131 -301
- package/dist/core/orchestrator.js.map +1 -1
- package/dist/core/question-detector.d.ts +10 -8
- package/dist/core/question-detector.d.ts.map +1 -1
- package/dist/core/question-detector.js +12 -49
- package/dist/core/question-detector.js.map +1 -1
- package/dist/core/runner.js +10 -7
- package/dist/core/runner.js.map +1 -1
- package/dist/core/spawner.d.ts +5 -0
- package/dist/core/spawner.d.ts.map +1 -0
- package/dist/core/spawner.js +2 -0
- package/dist/core/spawner.js.map +1 -0
- package/dist/core/task-runner.d.ts +1 -42
- package/dist/core/task-runner.d.ts.map +1 -1
- package/dist/core/task-runner.js +2 -525
- package/dist/core/task-runner.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/llm/retry.d.ts +2 -19
- package/dist/llm/retry.d.ts.map +1 -1
- package/dist/llm/retry.js +2 -44
- package/dist/llm/retry.js.map +1 -1
- package/dist/server/app.d.ts.map +1 -1
- package/dist/server/app.js +73 -21
- package/dist/server/app.js.map +1 -1
- package/dist/server/index.d.ts +2 -16
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +5 -17
- package/dist/server/index.js.map +1 -1
- package/dist/server/schemas.d.ts +4 -4
- package/dist/tools/system-tools.d.ts +99 -0
- package/dist/tools/system-tools.d.ts.map +1 -0
- package/dist/tools/system-tools.js +431 -0
- package/dist/tools/system-tools.js.map +1 -0
- package/package.json +24 -40
package/dist/adapters/engine.js
CHANGED
|
@@ -19,7 +19,7 @@ export function createActivity() {
|
|
|
19
19
|
import { Agent } from "@mariozechner/pi-agent-core";
|
|
20
20
|
import { join, sep } from "node:path";
|
|
21
21
|
import { resolveModel, resolveApiKeyAsync, enforceModelAllowlist } from "../llm/pi-client.js";
|
|
22
|
-
import {
|
|
22
|
+
import { createSystemTools, createAllTools } from "../tools/system-tools.js";
|
|
23
23
|
import { createInkTools as createInkToolsFn } from "../tools/ink-tools.js";
|
|
24
24
|
import { loadAgentSkills, buildSkillPrompt } from "../llm/skills.js";
|
|
25
25
|
import { nanoid } from "nanoid";
|
|
@@ -265,7 +265,7 @@ export function spawnEngine(agentConfig, task, cwd, ctx) {
|
|
|
265
265
|
}
|
|
266
266
|
// Vault resolution is async — will be resolved in handle.done before tools are used.
|
|
267
267
|
// Start with core coding tools WITHOUT vault; vault tools are added in the async phase.
|
|
268
|
-
const codingTools =
|
|
268
|
+
const codingTools = createSystemTools(cwd, agentConfig.allowedTools, effectiveAllowedPaths, outputDir, undefined);
|
|
269
269
|
// Ink tools (always available — search, browse, install from Ink Hub)
|
|
270
270
|
if (ctx?.polpoDir) {
|
|
271
271
|
codingTools.push(...createInkToolsFn(ctx.polpoDir, agentConfig.allowedTools));
|
|
@@ -385,7 +385,7 @@ export function spawnEngine(agentConfig, task, cwd, ctx) {
|
|
|
385
385
|
const vaultEntries = await ctx?.vaultStore?.getAllForAgent(agentConfig.name);
|
|
386
386
|
const vault = resolveAgentVault(vaultEntries);
|
|
387
387
|
// Rebuild tools with vault resolved
|
|
388
|
-
let allTools =
|
|
388
|
+
let allTools = createSystemTools(cwd, agentConfig.allowedTools, effectiveAllowedPaths, outputDir, vault);
|
|
389
389
|
if (ctx?.polpoDir) {
|
|
390
390
|
allTools.push(...createInkToolsFn(ctx.polpoDir, agentConfig.allowedTools));
|
|
391
391
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Spawner, SpawnResult } from "../core/spawner.js";
|
|
2
|
+
import type { RunnerConfig } from "../core/types.js";
|
|
3
|
+
export declare class NodeSpawner implements Spawner {
|
|
4
|
+
private polpoDir;
|
|
5
|
+
private cwd;
|
|
6
|
+
constructor(opts: {
|
|
7
|
+
polpoDir: string;
|
|
8
|
+
cwd: string;
|
|
9
|
+
});
|
|
10
|
+
spawn(config: RunnerConfig): Promise<SpawnResult>;
|
|
11
|
+
isAlive(pid: number): boolean;
|
|
12
|
+
kill(pid: number): void;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=node-spawner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-spawner.d.ts","sourceRoot":"","sources":["../../src/adapters/node-spawner.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,qBAAa,WAAY,YAAW,OAAO;IACzC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,GAAG,CAAS;gBAER,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE;IAK7C,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IA+CvD,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAU7B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CASxB"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node.js Spawner implementation — wraps child_process.spawn.
|
|
3
|
+
*
|
|
4
|
+
* Default implementation for self-hosted mode. Spawns runner as a detached
|
|
5
|
+
* subprocess with config written to a temporary JSON file.
|
|
6
|
+
*
|
|
7
|
+
* Drop-in replacement pattern: swap with SandboxSpawner for cloud.
|
|
8
|
+
*/
|
|
9
|
+
import { join, dirname } from "node:path";
|
|
10
|
+
import { mkdirSync, existsSync, writeFileSync } from "node:fs";
|
|
11
|
+
import { spawn as cpSpawn } from "node:child_process";
|
|
12
|
+
import { fileURLToPath } from "node:url";
|
|
13
|
+
export class NodeSpawner {
|
|
14
|
+
polpoDir;
|
|
15
|
+
cwd;
|
|
16
|
+
constructor(opts) {
|
|
17
|
+
this.polpoDir = opts.polpoDir;
|
|
18
|
+
this.cwd = opts.cwd;
|
|
19
|
+
}
|
|
20
|
+
async spawn(config) {
|
|
21
|
+
// Ensure output and tmp directories exist
|
|
22
|
+
const outputDir = config.outputDir;
|
|
23
|
+
if (!existsSync(outputDir)) {
|
|
24
|
+
mkdirSync(outputDir, { recursive: true });
|
|
25
|
+
}
|
|
26
|
+
const tmpDir = join(this.polpoDir, "tmp");
|
|
27
|
+
if (!existsSync(tmpDir)) {
|
|
28
|
+
mkdirSync(tmpDir, { recursive: true });
|
|
29
|
+
}
|
|
30
|
+
// Write config to temp file
|
|
31
|
+
const configPath = join(tmpDir, `run-${config.runId}.json`);
|
|
32
|
+
writeFileSync(configPath, JSON.stringify(config, null, 2), { mode: 0o600 });
|
|
33
|
+
// Resolve runner path: prefer compiled .js, fall back to .ts via tsx (dev mode)
|
|
34
|
+
const baseDir = dirname(fileURLToPath(import.meta.url));
|
|
35
|
+
const coreDir = join(baseDir, "../core");
|
|
36
|
+
const runnerJs = join(coreDir, "runner.js");
|
|
37
|
+
const runnerTs = join(coreDir, "runner.ts");
|
|
38
|
+
const useTs = !existsSync(runnerJs) && existsSync(runnerTs);
|
|
39
|
+
const runnerPath = useTs ? runnerTs : runnerJs;
|
|
40
|
+
let spawnArgs;
|
|
41
|
+
if (useTs) {
|
|
42
|
+
const tsxCli = join(baseDir, "../../node_modules/tsx/dist/cli.mjs");
|
|
43
|
+
spawnArgs = existsSync(tsxCli)
|
|
44
|
+
? [process.execPath, tsxCli, runnerPath, "--config", configPath]
|
|
45
|
+
: [process.execPath, runnerPath, "--config", configPath];
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
spawnArgs = [process.execPath, runnerPath, "--config", configPath];
|
|
49
|
+
}
|
|
50
|
+
const child = cpSpawn(spawnArgs[0], spawnArgs.slice(1), {
|
|
51
|
+
detached: true,
|
|
52
|
+
stdio: "ignore",
|
|
53
|
+
cwd: this.cwd,
|
|
54
|
+
});
|
|
55
|
+
child.unref();
|
|
56
|
+
return {
|
|
57
|
+
pid: child.pid ?? 0,
|
|
58
|
+
configPath,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
isAlive(pid) {
|
|
62
|
+
if (pid <= 0)
|
|
63
|
+
return false;
|
|
64
|
+
try {
|
|
65
|
+
process.kill(pid, 0);
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
kill(pid) {
|
|
73
|
+
if (pid <= 0)
|
|
74
|
+
return;
|
|
75
|
+
try {
|
|
76
|
+
process.kill(pid, "SIGTERM");
|
|
77
|
+
setTimeout(() => {
|
|
78
|
+
try {
|
|
79
|
+
process.kill(pid, "SIGKILL");
|
|
80
|
+
}
|
|
81
|
+
catch { /* already dead */ }
|
|
82
|
+
}, 3000);
|
|
83
|
+
}
|
|
84
|
+
catch { /* process already dead */ }
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=node-spawner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-spawner.js","sourceRoot":"","sources":["../../src/adapters/node-spawner.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,MAAM,OAAO,WAAW;IACd,QAAQ,CAAS;IACjB,GAAG,CAAS;IAEpB,YAAY,IAAuC;QACjD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,MAAoB;QAC9B,0CAA0C;QAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,4BAA4B;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,MAAM,CAAC,KAAK,OAAO,CAAC,CAAC;QAC5D,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAE5E,gFAAgF;QAChF,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QAE/C,IAAI,SAAmB,CAAC;QACxB,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,qCAAqC,CAAC,CAAC;YACpE,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC;gBAC5B,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC;gBAChE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YACtD,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,QAAQ;YACf,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,EAAE,CAAC;QAEd,OAAO;YACL,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC;YACnB,UAAU;SACX,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAW;QACjB,IAAI,GAAG,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3B,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAW;QACd,IAAI,GAAG,IAAI,CAAC;YAAE,OAAO;QACrB,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAC7B,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;YACpE,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC;QAAC,MAAM,CAAC,CAAC,0BAA0B,CAAC,CAAC;IACxC,CAAC;CACF"}
|
|
@@ -1,14 +1,6 @@
|
|
|
1
1
|
import type { Task, TaskExpectation, TaskMetric, AssessmentResult, CheckResult, MetricResult, ReviewContext, ReasoningLevel } from "../core/types.js";
|
|
2
|
+
export type { CheckProgressEvent } from "@polpo-ai/core/assessor";
|
|
2
3
|
export declare function runCheck(expectation: TaskExpectation, cwd: string, onProgress?: (msg: string) => void, context?: ReviewContext, reasoning?: ReasoningLevel): Promise<CheckResult>;
|
|
3
4
|
export declare function runMetric(metric: TaskMetric, cwd: string): Promise<MetricResult>;
|
|
4
|
-
export
|
|
5
|
-
index: number;
|
|
6
|
-
total: number;
|
|
7
|
-
type: string;
|
|
8
|
-
label: string;
|
|
9
|
-
phase: "started" | "complete";
|
|
10
|
-
passed?: boolean;
|
|
11
|
-
message?: string;
|
|
12
|
-
}
|
|
13
|
-
export declare function assessTask(task: Task, cwd: string, onProgress?: (msg: string) => void, context?: ReviewContext, reasoning?: ReasoningLevel, onCheckProgress?: (event: CheckProgressEvent) => void): Promise<AssessmentResult>;
|
|
5
|
+
export declare function assessTask(task: Task, cwd: string, onProgress?: (msg: string) => void, context?: ReviewContext, reasoning?: ReasoningLevel, onCheckProgress?: (event: import("@polpo-ai/core/assessor").CheckProgressEvent) => void): Promise<AssessmentResult>;
|
|
14
6
|
//# sourceMappingURL=assessor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assessor.d.ts","sourceRoot":"","sources":["../../src/assessment/assessor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"assessor.d.ts","sourceRoot":"","sources":["../../src/assessment/assessor.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,IAAI,EACJ,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,cAAc,EACf,MAAM,kBAAkB,CAAC;AAI1B,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AA4BlE,wBAAsB,QAAQ,CAC5B,WAAW,EAAE,eAAe,EAC5B,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,EAClC,OAAO,CAAC,EAAE,aAAa,EACvB,SAAS,CAAC,EAAE,cAAc,GACzB,OAAO,CAAC,WAAW,CAAC,CAEtB;AAED,wBAAsB,SAAS,CAC7B,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,YAAY,CAAC,CAEvB;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,IAAI,EACV,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,EAClC,OAAO,CAAC,EAAE,aAAa,EACvB,SAAS,CAAC,EAAE,cAAc,EAC1B,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,yBAAyB,EAAE,kBAAkB,KAAK,IAAI,GACtF,OAAO,CAAC,gBAAgB,CAAC,CAE3B"}
|
|
@@ -1,190 +1,37 @@
|
|
|
1
|
-
import { exec } from "node:child_process";
|
|
2
|
-
import { access } from "node:fs/promises";
|
|
3
|
-
import { mkdir, writeFile, unlink } from "node:fs/promises";
|
|
4
|
-
import { join, resolve } from "node:path";
|
|
5
1
|
import { getPolpoDir } from "../core/constants.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
2
|
+
import { NodeFileSystem } from "../adapters/node-filesystem.js";
|
|
3
|
+
import { NodeShell } from "../adapters/node-shell.js";
|
|
4
|
+
import { assessTask as coreAssessTask, runCheck as coreRunCheck, runMetric as coreRunMetric, } from "@polpo-ai/core/assessor";
|
|
8
5
|
import { runLLMReview } from "./llm-review.js";
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
// ── Lazy-initialized shared adapters ────────────────────────────────────
|
|
7
|
+
let _fs;
|
|
8
|
+
let _shell;
|
|
9
|
+
function getFS() {
|
|
10
|
+
if (!_fs)
|
|
11
|
+
_fs = new NodeFileSystem();
|
|
12
|
+
return _fs;
|
|
13
|
+
}
|
|
14
|
+
function getShell() {
|
|
15
|
+
if (!_shell)
|
|
16
|
+
_shell = new NodeShell();
|
|
17
|
+
return _shell;
|
|
18
|
+
}
|
|
19
|
+
function makeDeps(cwd) {
|
|
20
|
+
return {
|
|
21
|
+
fs: getFS(),
|
|
22
|
+
shell: getShell(),
|
|
23
|
+
polpoDir: getPolpoDir(cwd),
|
|
24
|
+
runLLMReview,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
// ── Backward-compatible signatures (same as before) ─────────────────────
|
|
11
28
|
export async function runCheck(expectation, cwd, onProgress, context, reasoning) {
|
|
12
|
-
|
|
13
|
-
case "test": {
|
|
14
|
-
const cmd = expectation.command ?? "npm test";
|
|
15
|
-
try {
|
|
16
|
-
await execAsync(cmd, { cwd });
|
|
17
|
-
return { type: "test", passed: true, message: `Test passed: ${cmd}` };
|
|
18
|
-
}
|
|
19
|
-
catch (err) {
|
|
20
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
21
|
-
return {
|
|
22
|
-
type: "test",
|
|
23
|
-
passed: false,
|
|
24
|
-
message: `Test failed: ${cmd}`,
|
|
25
|
-
details: msg,
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
case "file_exists": {
|
|
30
|
-
const paths = expectation.paths ?? [];
|
|
31
|
-
if (paths.length === 0) {
|
|
32
|
-
return { type: "file_exists", passed: false, message: "No paths specified" };
|
|
33
|
-
}
|
|
34
|
-
const missing = [];
|
|
35
|
-
for (const p of paths) {
|
|
36
|
-
const resolvedPath = resolve(cwd, p);
|
|
37
|
-
try {
|
|
38
|
-
await access(resolvedPath);
|
|
39
|
-
}
|
|
40
|
-
catch {
|
|
41
|
-
missing.push(p);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
if (missing.length === 0) {
|
|
45
|
-
return {
|
|
46
|
-
type: "file_exists",
|
|
47
|
-
passed: true,
|
|
48
|
-
message: `All ${paths.length} file(s) exist`,
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
return {
|
|
52
|
-
type: "file_exists",
|
|
53
|
-
passed: false,
|
|
54
|
-
message: `Missing ${missing.length}/${paths.length} file(s)`,
|
|
55
|
-
details: missing.join(", "),
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
case "script": {
|
|
59
|
-
const cmd = expectation.command;
|
|
60
|
-
if (!cmd) {
|
|
61
|
-
return {
|
|
62
|
-
type: "script",
|
|
63
|
-
passed: false,
|
|
64
|
-
message: "No script command provided",
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
const isMultiLine = cmd.includes("\n");
|
|
68
|
-
const label = isMultiLine
|
|
69
|
-
? `script (${cmd.split("\n").length} lines)`
|
|
70
|
-
: cmd;
|
|
71
|
-
if (!isMultiLine) {
|
|
72
|
-
// Single-line: execute directly
|
|
73
|
-
try {
|
|
74
|
-
await execAsync(cmd, { cwd, maxBuffer: SCRIPT_MAX_BUFFER });
|
|
75
|
-
return { type: "script", passed: true, message: `Script passed: ${label}` };
|
|
76
|
-
}
|
|
77
|
-
catch (err) {
|
|
78
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
79
|
-
return { type: "script", passed: false, message: `Script failed: ${label}`, details: msg };
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
// Multi-line: write to temp file, execute with bash, cleanup
|
|
83
|
-
const tmpDir = join(getPolpoDir(cwd), "tmp");
|
|
84
|
-
const scriptFile = join(tmpDir, `check-${nanoid(8)}.sh`);
|
|
85
|
-
try {
|
|
86
|
-
await mkdir(tmpDir, { recursive: true });
|
|
87
|
-
// set -euo pipefail: fail on first error, like CI/CD
|
|
88
|
-
const scriptContent = `#!/usr/bin/env bash\nset -euo pipefail\n\n${cmd}\n`;
|
|
89
|
-
await writeFile(scriptFile, scriptContent);
|
|
90
|
-
const { stdout, stderr } = await execAsync(`bash "${scriptFile}"`, {
|
|
91
|
-
cwd,
|
|
92
|
-
maxBuffer: SCRIPT_MAX_BUFFER,
|
|
93
|
-
});
|
|
94
|
-
return {
|
|
95
|
-
type: "script",
|
|
96
|
-
passed: true,
|
|
97
|
-
message: `Script passed: ${label}`,
|
|
98
|
-
details: stdout || stderr || undefined,
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
catch (err) {
|
|
102
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
103
|
-
return {
|
|
104
|
-
type: "script",
|
|
105
|
-
passed: false,
|
|
106
|
-
message: `Script failed: ${label}`,
|
|
107
|
-
details: msg,
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
finally {
|
|
111
|
-
try {
|
|
112
|
-
await unlink(scriptFile);
|
|
113
|
-
}
|
|
114
|
-
catch { /* file already removed */ }
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
case "llm_review": {
|
|
118
|
-
return await runLLMReview(expectation, cwd, onProgress, context, reasoning);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
29
|
+
return coreRunCheck(makeDeps(cwd), expectation, cwd, onProgress, context, reasoning);
|
|
121
30
|
}
|
|
122
31
|
export async function runMetric(metric, cwd) {
|
|
123
|
-
|
|
124
|
-
const { stdout } = await execAsync(metric.command, { cwd });
|
|
125
|
-
const value = parseFloat(stdout.trim());
|
|
126
|
-
if (isNaN(value)) {
|
|
127
|
-
return {
|
|
128
|
-
name: metric.name,
|
|
129
|
-
value: 0,
|
|
130
|
-
threshold: metric.threshold,
|
|
131
|
-
passed: false,
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
return {
|
|
135
|
-
name: metric.name,
|
|
136
|
-
value,
|
|
137
|
-
threshold: metric.threshold,
|
|
138
|
-
passed: value >= metric.threshold,
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
catch { /* metric command failed */
|
|
142
|
-
return {
|
|
143
|
-
name: metric.name,
|
|
144
|
-
value: 0,
|
|
145
|
-
threshold: metric.threshold,
|
|
146
|
-
passed: false,
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
/** Label for an expectation — used in progress events. */
|
|
151
|
-
function expectationLabel(exp) {
|
|
152
|
-
if (exp.type === "test")
|
|
153
|
-
return exp.command ?? "npm test";
|
|
154
|
-
if (exp.type === "file_exists")
|
|
155
|
-
return (exp.paths ?? []).join(", ") || "file_exists";
|
|
156
|
-
if (exp.type === "script") {
|
|
157
|
-
const cmd = exp.command ?? "";
|
|
158
|
-
return cmd.includes("\n") ? `script (${cmd.split("\n").length} lines)` : cmd;
|
|
159
|
-
}
|
|
160
|
-
if (exp.type === "llm_review")
|
|
161
|
-
return exp.criteria ? exp.criteria.slice(0, 60) : "LLM review";
|
|
162
|
-
return exp.type;
|
|
32
|
+
return coreRunMetric(makeDeps(cwd), metric, cwd);
|
|
163
33
|
}
|
|
164
34
|
export async function assessTask(task, cwd, onProgress, context, reasoning, onCheckProgress) {
|
|
165
|
-
|
|
166
|
-
const checks = await Promise.all(task.expectations.map(async (exp, i) => {
|
|
167
|
-
const label = expectationLabel(exp);
|
|
168
|
-
onCheckProgress?.({ index: i, total, type: exp.type, label, phase: "started" });
|
|
169
|
-
const result = await runCheck(exp, cwd, onProgress, context, reasoning);
|
|
170
|
-
onCheckProgress?.({ index: i, total, type: exp.type, label, phase: "complete", passed: result.passed, message: result.message });
|
|
171
|
-
return result;
|
|
172
|
-
}));
|
|
173
|
-
const metrics = await Promise.all(task.metrics.map((m) => runMetric(m, cwd)));
|
|
174
|
-
const passed = checks.every((c) => c.passed) && metrics.every((m) => m.passed);
|
|
175
|
-
// Extract LLM review details and scores
|
|
176
|
-
const llmCheck = checks.find(c => c.type === "llm_review");
|
|
177
|
-
const llmReview = llmCheck?.details;
|
|
178
|
-
const scores = llmCheck?.scores;
|
|
179
|
-
const globalScore = llmCheck?.globalScore;
|
|
180
|
-
return {
|
|
181
|
-
passed,
|
|
182
|
-
checks,
|
|
183
|
-
metrics,
|
|
184
|
-
llmReview,
|
|
185
|
-
scores,
|
|
186
|
-
globalScore,
|
|
187
|
-
timestamp: new Date().toISOString(),
|
|
188
|
-
};
|
|
35
|
+
return coreAssessTask(makeDeps(cwd), task, cwd, onProgress, context, reasoning, onCheckProgress);
|
|
189
36
|
}
|
|
190
37
|
//# sourceMappingURL=assessor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assessor.js","sourceRoot":"","sources":["../../src/assessment/assessor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"assessor.js","sourceRoot":"","sources":["../../src/assessment/assessor.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EACL,UAAU,IAAI,cAAc,EAC5B,QAAQ,IAAI,YAAY,EACxB,SAAS,IAAI,aAAa,GAE3B,MAAM,yBAAyB,CAAC;AAWjC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAK/C,2EAA2E;AAE3E,IAAI,GAA+B,CAAC;AACpC,IAAI,MAA6B,CAAC;AAElC,SAAS,KAAK;IACZ,IAAI,CAAC,GAAG;QAAE,GAAG,GAAG,IAAI,cAAc,EAAE,CAAC;IACrC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,QAAQ;IACf,IAAI,CAAC,MAAM;QAAE,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;IACtC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IAC3B,OAAO;QACL,EAAE,EAAE,KAAK,EAAE;QACX,KAAK,EAAE,QAAQ,EAAE;QACjB,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC;QAC1B,YAAY;KACb,CAAC;AACJ,CAAC;AAED,2EAA2E;AAE3E,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,WAA4B,EAC5B,GAAW,EACX,UAAkC,EAClC,OAAuB,EACvB,SAA0B;IAE1B,OAAO,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,MAAkB,EAClB,GAAW;IAEX,OAAO,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAU,EACV,GAAW,EACX,UAAkC,EAClC,OAAuB,EACvB,SAA0B,EAC1B,eAAuF;IAEvF,OAAO,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;AACnG,CAAC"}
|
|
@@ -1,102 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Single source of truth for the ReviewPayload shape — used by:
|
|
5
|
-
* - extractSubmitReview (tool call extraction)
|
|
6
|
-
* - tryParseReviewJSON (text-based JSON fallback)
|
|
7
|
-
* - OpenAI response_format json_schema (derived via zodToJsonSchema)
|
|
2
|
+
* Shell shim — re-exports from @polpo-ai/core.
|
|
8
3
|
*/
|
|
9
|
-
|
|
10
|
-
export declare const ReviewEvidenceSchema: z.ZodObject<{
|
|
11
|
-
file: z.ZodString;
|
|
12
|
-
line: z.ZodNumber;
|
|
13
|
-
note: z.ZodString;
|
|
14
|
-
}, z.core.$strip>;
|
|
15
|
-
export declare const ReviewScoreSchema: z.ZodObject<{
|
|
16
|
-
dimension: z.ZodString;
|
|
17
|
-
score: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
18
|
-
reasoning: z.ZodString;
|
|
19
|
-
evidence: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
20
|
-
file: z.ZodString;
|
|
21
|
-
line: z.ZodNumber;
|
|
22
|
-
note: z.ZodString;
|
|
23
|
-
}, z.core.$strip>>>;
|
|
24
|
-
}, z.core.$strip>;
|
|
25
|
-
export declare const ReviewPayloadSchema: z.ZodObject<{
|
|
26
|
-
scores: z.ZodArray<z.ZodObject<{
|
|
27
|
-
dimension: z.ZodString;
|
|
28
|
-
score: z.ZodPipe<z.ZodNumber, z.ZodTransform<number, number>>;
|
|
29
|
-
reasoning: z.ZodString;
|
|
30
|
-
evidence: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
31
|
-
file: z.ZodString;
|
|
32
|
-
line: z.ZodNumber;
|
|
33
|
-
note: z.ZodString;
|
|
34
|
-
}, z.core.$strip>>>;
|
|
35
|
-
}, z.core.$strip>>;
|
|
36
|
-
summary: z.ZodString;
|
|
37
|
-
}, z.core.$strip>;
|
|
38
|
-
export type ValidatedReviewPayload = z.infer<typeof ReviewPayloadSchema>;
|
|
39
|
-
/**
|
|
40
|
-
* Validate and normalize a raw object into a ReviewPayload.
|
|
41
|
-
* Returns `{ success: true, data }` or `{ success: false, error }`.
|
|
42
|
-
*
|
|
43
|
-
* This applies:
|
|
44
|
-
* - Type coercion (string scores → numbers)
|
|
45
|
-
* - Clamping (scores rounded to 1-5)
|
|
46
|
-
* - Default reasoning if missing but other fields present
|
|
47
|
-
*/
|
|
48
|
-
export declare function validateReviewPayload(raw: unknown): {
|
|
49
|
-
success: true;
|
|
50
|
-
data: ValidatedReviewPayload;
|
|
51
|
-
} | {
|
|
52
|
-
success: false;
|
|
53
|
-
error: string;
|
|
54
|
-
};
|
|
55
|
-
/**
|
|
56
|
-
* JSON Schema derived from ReviewPayloadSchema, for use with OpenAI's
|
|
57
|
-
* response_format: { type: "json_schema", json_schema: { ... } }.
|
|
58
|
-
*
|
|
59
|
-
* We maintain this manually to ensure `strict: true` and `additionalProperties: false`
|
|
60
|
-
* which OpenAI requires.
|
|
61
|
-
*/
|
|
62
|
-
export declare const REVIEW_JSON_SCHEMA: {
|
|
63
|
-
type: "json_schema";
|
|
64
|
-
json_schema: {
|
|
65
|
-
name: string;
|
|
66
|
-
strict: boolean;
|
|
67
|
-
schema: {
|
|
68
|
-
type: string;
|
|
69
|
-
properties: {
|
|
70
|
-
scores: {
|
|
71
|
-
type: string;
|
|
72
|
-
items: {
|
|
73
|
-
type: string;
|
|
74
|
-
properties: {
|
|
75
|
-
dimension: {
|
|
76
|
-
type: string;
|
|
77
|
-
description: string;
|
|
78
|
-
};
|
|
79
|
-
score: {
|
|
80
|
-
type: string;
|
|
81
|
-
description: string;
|
|
82
|
-
};
|
|
83
|
-
reasoning: {
|
|
84
|
-
type: string;
|
|
85
|
-
description: string;
|
|
86
|
-
};
|
|
87
|
-
};
|
|
88
|
-
required: string[];
|
|
89
|
-
additionalProperties: boolean;
|
|
90
|
-
};
|
|
91
|
-
};
|
|
92
|
-
summary: {
|
|
93
|
-
type: string;
|
|
94
|
-
description: string;
|
|
95
|
-
};
|
|
96
|
-
};
|
|
97
|
-
required: string[];
|
|
98
|
-
additionalProperties: boolean;
|
|
99
|
-
};
|
|
100
|
-
};
|
|
101
|
-
};
|
|
4
|
+
export { ReviewEvidenceSchema, ReviewScoreSchema, ReviewPayloadSchema, validateReviewPayload, REVIEW_JSON_SCHEMA, type ValidatedReviewPayload, } from "@polpo-ai/core/assessment-schemas";
|
|
102
5
|
//# sourceMappingURL=schemas.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/assessment/schemas.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/assessment/schemas.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,KAAK,sBAAsB,GAC5B,MAAM,mCAAmC,CAAC"}
|
|
@@ -1,112 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Single source of truth for the ReviewPayload shape — used by:
|
|
5
|
-
* - extractSubmitReview (tool call extraction)
|
|
6
|
-
* - tryParseReviewJSON (text-based JSON fallback)
|
|
7
|
-
* - OpenAI response_format json_schema (derived via zodToJsonSchema)
|
|
2
|
+
* Shell shim — re-exports from @polpo-ai/core.
|
|
8
3
|
*/
|
|
9
|
-
|
|
10
|
-
// ── Score Evidence (optional file:line references) ─────────────────────
|
|
11
|
-
export const ReviewEvidenceSchema = z.object({
|
|
12
|
-
file: z.string(),
|
|
13
|
-
line: z.number(),
|
|
14
|
-
note: z.string(),
|
|
15
|
-
});
|
|
16
|
-
// ── Individual Dimension Score ─────────────────────────────────────────
|
|
17
|
-
export const ReviewScoreSchema = z.object({
|
|
18
|
-
dimension: z.string().min(1),
|
|
19
|
-
score: z.number().min(1).max(5).transform(v => Math.round(v)),
|
|
20
|
-
reasoning: z.string().min(1),
|
|
21
|
-
evidence: z.array(ReviewEvidenceSchema).optional(),
|
|
22
|
-
});
|
|
23
|
-
// ── Full Review Payload ────────────────────────────────────────────────
|
|
24
|
-
export const ReviewPayloadSchema = z.object({
|
|
25
|
-
scores: z.array(ReviewScoreSchema).min(1),
|
|
26
|
-
summary: z.string().min(1),
|
|
27
|
-
});
|
|
28
|
-
// ── Validation Helper ──────────────────────────────────────────────────
|
|
29
|
-
/**
|
|
30
|
-
* Validate and normalize a raw object into a ReviewPayload.
|
|
31
|
-
* Returns `{ success: true, data }` or `{ success: false, error }`.
|
|
32
|
-
*
|
|
33
|
-
* This applies:
|
|
34
|
-
* - Type coercion (string scores → numbers)
|
|
35
|
-
* - Clamping (scores rounded to 1-5)
|
|
36
|
-
* - Default reasoning if missing but other fields present
|
|
37
|
-
*/
|
|
38
|
-
export function validateReviewPayload(raw) {
|
|
39
|
-
if (!raw || typeof raw !== "object") {
|
|
40
|
-
return { success: false, error: "Input is not an object" };
|
|
41
|
-
}
|
|
42
|
-
const obj = raw;
|
|
43
|
-
// Pre-process: coerce common LLM output quirks before Zod validation
|
|
44
|
-
if (obj.scores && Array.isArray(obj.scores)) {
|
|
45
|
-
for (const score of obj.scores) {
|
|
46
|
-
if (score && typeof score === "object") {
|
|
47
|
-
const s = score;
|
|
48
|
-
// Coerce string scores to numbers
|
|
49
|
-
if (typeof s.score === "string") {
|
|
50
|
-
s.score = parseFloat(s.score);
|
|
51
|
-
}
|
|
52
|
-
// Accept alternative reasoning field names
|
|
53
|
-
if (!s.reasoning && s.reason) {
|
|
54
|
-
s.reasoning = s.reason;
|
|
55
|
-
}
|
|
56
|
-
if (!s.reasoning && s.explanation) {
|
|
57
|
-
s.reasoning = s.explanation;
|
|
58
|
-
}
|
|
59
|
-
// Ensure reasoning exists
|
|
60
|
-
if (!s.reasoning || (typeof s.reasoning === "string" && s.reasoning.trim() === "")) {
|
|
61
|
-
s.reasoning = "(no reasoning provided)";
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
// Ensure summary exists
|
|
67
|
-
if (!obj.summary || (typeof obj.summary === "string" && obj.summary.trim() === "")) {
|
|
68
|
-
obj.summary = "(no summary)";
|
|
69
|
-
}
|
|
70
|
-
const result = ReviewPayloadSchema.safeParse(obj);
|
|
71
|
-
if (result.success) {
|
|
72
|
-
return { success: true, data: result.data };
|
|
73
|
-
}
|
|
74
|
-
return { success: false, error: result.error.issues.map(i => `${i.path.join(".")}: ${i.message}`).join("; ") };
|
|
75
|
-
}
|
|
76
|
-
// ── JSON Schema for OpenAI response_format ─────────────────────────────
|
|
77
|
-
/**
|
|
78
|
-
* JSON Schema derived from ReviewPayloadSchema, for use with OpenAI's
|
|
79
|
-
* response_format: { type: "json_schema", json_schema: { ... } }.
|
|
80
|
-
*
|
|
81
|
-
* We maintain this manually to ensure `strict: true` and `additionalProperties: false`
|
|
82
|
-
* which OpenAI requires.
|
|
83
|
-
*/
|
|
84
|
-
export const REVIEW_JSON_SCHEMA = {
|
|
85
|
-
type: "json_schema",
|
|
86
|
-
json_schema: {
|
|
87
|
-
name: "review_scores",
|
|
88
|
-
strict: true,
|
|
89
|
-
schema: {
|
|
90
|
-
type: "object",
|
|
91
|
-
properties: {
|
|
92
|
-
scores: {
|
|
93
|
-
type: "array",
|
|
94
|
-
items: {
|
|
95
|
-
type: "object",
|
|
96
|
-
properties: {
|
|
97
|
-
dimension: { type: "string", description: "Dimension name from the rubric" },
|
|
98
|
-
score: { type: "number", description: "Score 1-5" },
|
|
99
|
-
reasoning: { type: "string", description: "Brief reasoning with file:line evidence" },
|
|
100
|
-
},
|
|
101
|
-
required: ["dimension", "score", "reasoning"],
|
|
102
|
-
additionalProperties: false,
|
|
103
|
-
},
|
|
104
|
-
},
|
|
105
|
-
summary: { type: "string", description: "Overall review summary" },
|
|
106
|
-
},
|
|
107
|
-
required: ["scores", "summary"],
|
|
108
|
-
additionalProperties: false,
|
|
109
|
-
},
|
|
110
|
-
},
|
|
111
|
-
};
|
|
4
|
+
export { ReviewEvidenceSchema, ReviewScoreSchema, ReviewPayloadSchema, validateReviewPayload, REVIEW_JSON_SCHEMA, } from "@polpo-ai/core/assessment-schemas";
|
|
112
5
|
//# sourceMappingURL=schemas.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/assessment/schemas.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/assessment/schemas.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,GAEnB,MAAM,mCAAmC,CAAC"}
|