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.
Files changed (68) hide show
  1. package/dist/adapters/engine.js +3 -3
  2. package/dist/adapters/node-spawner.d.ts +14 -0
  3. package/dist/adapters/node-spawner.d.ts.map +1 -0
  4. package/dist/adapters/node-spawner.js +87 -0
  5. package/dist/adapters/node-spawner.js.map +1 -0
  6. package/dist/assessment/assessor.d.ts +2 -10
  7. package/dist/assessment/assessor.d.ts.map +1 -1
  8. package/dist/assessment/assessor.js +28 -181
  9. package/dist/assessment/assessor.js.map +1 -1
  10. package/dist/assessment/schemas.d.ts +2 -99
  11. package/dist/assessment/schemas.d.ts.map +1 -1
  12. package/dist/assessment/schemas.js +2 -109
  13. package/dist/assessment/schemas.js.map +1 -1
  14. package/dist/assessment/scoring.d.ts +2 -23
  15. package/dist/assessment/scoring.d.ts.map +1 -1
  16. package/dist/assessment/scoring.js +2 -126
  17. package/dist/assessment/scoring.js.map +1 -1
  18. package/dist/core/assessment-orchestrator.d.ts +12 -72
  19. package/dist/core/assessment-orchestrator.d.ts.map +1 -1
  20. package/dist/core/assessment-orchestrator.js +50 -710
  21. package/dist/core/assessment-orchestrator.js.map +1 -1
  22. package/dist/core/assessment-prompts.d.ts +3 -42
  23. package/dist/core/assessment-prompts.d.ts.map +1 -1
  24. package/dist/core/assessment-prompts.js +3 -202
  25. package/dist/core/assessment-prompts.js.map +1 -1
  26. package/dist/core/mission-executor.d.ts +2 -249
  27. package/dist/core/mission-executor.d.ts.map +1 -1
  28. package/dist/core/mission-executor.js +2 -1016
  29. package/dist/core/mission-executor.js.map +1 -1
  30. package/dist/core/orchestrator.d.ts +9 -2
  31. package/dist/core/orchestrator.d.ts.map +1 -1
  32. package/dist/core/orchestrator.js +131 -301
  33. package/dist/core/orchestrator.js.map +1 -1
  34. package/dist/core/question-detector.d.ts +10 -8
  35. package/dist/core/question-detector.d.ts.map +1 -1
  36. package/dist/core/question-detector.js +12 -49
  37. package/dist/core/question-detector.js.map +1 -1
  38. package/dist/core/runner.js +10 -7
  39. package/dist/core/runner.js.map +1 -1
  40. package/dist/core/spawner.d.ts +5 -0
  41. package/dist/core/spawner.d.ts.map +1 -0
  42. package/dist/core/spawner.js +2 -0
  43. package/dist/core/spawner.js.map +1 -0
  44. package/dist/core/task-runner.d.ts +1 -42
  45. package/dist/core/task-runner.d.ts.map +1 -1
  46. package/dist/core/task-runner.js +2 -525
  47. package/dist/core/task-runner.js.map +1 -1
  48. package/dist/index.d.ts +2 -2
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +1 -1
  51. package/dist/index.js.map +1 -1
  52. package/dist/llm/retry.d.ts +2 -19
  53. package/dist/llm/retry.d.ts.map +1 -1
  54. package/dist/llm/retry.js +2 -44
  55. package/dist/llm/retry.js.map +1 -1
  56. package/dist/server/app.d.ts.map +1 -1
  57. package/dist/server/app.js +73 -21
  58. package/dist/server/app.js.map +1 -1
  59. package/dist/server/index.d.ts +2 -16
  60. package/dist/server/index.d.ts.map +1 -1
  61. package/dist/server/index.js +5 -17
  62. package/dist/server/index.js.map +1 -1
  63. package/dist/server/schemas.d.ts +4 -4
  64. package/dist/tools/system-tools.d.ts +99 -0
  65. package/dist/tools/system-tools.d.ts.map +1 -0
  66. package/dist/tools/system-tools.js +431 -0
  67. package/dist/tools/system-tools.js.map +1 -0
  68. package/package.json +24 -40
@@ -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 { createCodingTools, createAllTools } from "../tools/coding-tools.js";
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 = createCodingTools(cwd, agentConfig.allowedTools, effectiveAllowedPaths, outputDir, undefined);
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 = createCodingTools(cwd, agentConfig.allowedTools, effectiveAllowedPaths, outputDir, vault);
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":"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"}
@@ -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 interface CheckProgressEvent {
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":"AAOA,OAAO,KAAK,EACV,IAAI,EACJ,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,cAAc,EACf,MAAM,kBAAkB,CAAC;AAM1B,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,CA4GtB;AAED,wBAAsB,SAAS,CAC7B,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,YAAY,CAAC,CA0BvB;AAcD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,GAAG,UAAU,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;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,kBAAkB,KAAK,IAAI,GACpD,OAAO,CAAC,gBAAgB,CAAC,CAiC3B"}
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 { promisify } from "node:util";
7
- import { nanoid } from "nanoid";
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
- const execAsync = promisify(exec);
10
- const SCRIPT_MAX_BUFFER = 5 * 1024 * 1024; // 5 MB
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
- switch (expectation.type) {
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
- try {
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
- const total = task.expectations.length;
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":"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"}
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
- * Zod schemas for validating LLM review structured output.
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
- import { z } from "zod";
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;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,oBAAoB;;;;iBAI/B,CAAC;AAIH,eAAO,MAAM,iBAAiB;;;;;;;;;iBAK5B,CAAC;AAIH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;iBAG9B,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAIzE;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,sBAAsB,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAyCvI;AAID;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2B9B,CAAC"}
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
- * Zod schemas for validating LLM review structured output.
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
- import { z } from "zod";
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":"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"}
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"}