pi-harness-runtime 1.1.317 → 1.1.319
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/package.json +4 -2
- package/packages/a2a-adapter/package.json +1 -1
- package/packages/agent-policy/package.json +1 -1
- package/packages/architecture-generator/package.json +1 -1
- package/packages/auth/package.json +1 -1
- package/packages/autonomous-refactor/package.json +1 -1
- package/packages/autonomous-runtime/package.json +1 -1
- package/packages/cache-strategy/package.json +1 -1
- package/packages/capability-registry/package.json +1 -1
- package/packages/checkpoint/package.json +1 -1
- package/packages/cli-plugin-sdk/package.json +1 -1
- package/packages/clipboard/package.json +1 -1
- package/packages/clipboard-plugin/package.json +1 -1
- package/packages/code-generation/package.json +1 -1
- package/packages/code-review/package.json +1 -1
- package/packages/codex-adapter/package.json +1 -1
- package/packages/codex-watcher/package.json +1 -1
- package/packages/config-capture/package.json +1 -1
- package/packages/context-compiler/package.json +1 -1
- package/packages/context-discovery/package.json +1 -1
- package/packages/context-manager/package.json +1 -1
- package/packages/cookie-sanitizer/package.json +1 -1
- package/packages/cost-optimizer/package.json +1 -1
- package/packages/dependency-analyzer/package.json +1 -1
- package/packages/django-plugin/package.json +1 -1
- package/packages/doc-generator/package.json +1 -1
- package/packages/durable-review/dist/client.d.ts +46 -0
- package/packages/durable-review/dist/client.d.ts.map +1 -0
- package/packages/durable-review/dist/client.js +88 -0
- package/packages/durable-review/dist/client.js.map +1 -0
- package/packages/durable-review/dist/documents.d.ts +82 -0
- package/packages/durable-review/dist/documents.d.ts.map +1 -0
- package/packages/durable-review/dist/documents.js +65 -0
- package/packages/durable-review/dist/documents.js.map +1 -0
- package/packages/durable-review/dist/extension.d.ts +31 -0
- package/packages/durable-review/dist/extension.d.ts.map +1 -0
- package/packages/durable-review/dist/extension.js +123 -0
- package/packages/durable-review/dist/extension.js.map +1 -0
- package/packages/durable-review/dist/index.d.ts +12 -0
- package/packages/durable-review/dist/index.d.ts.map +1 -0
- package/packages/durable-review/dist/index.js +18 -0
- package/packages/durable-review/dist/index.js.map +1 -0
- package/packages/durable-review/dist/reviewer.d.ts +67 -0
- package/packages/durable-review/dist/reviewer.d.ts.map +1 -0
- package/packages/durable-review/dist/reviewer.js +119 -0
- package/packages/durable-review/dist/reviewer.js.map +1 -0
- package/packages/durable-review/dist/service.d.ts +52 -0
- package/packages/durable-review/dist/service.d.ts.map +1 -0
- package/packages/durable-review/dist/service.js +119 -0
- package/packages/durable-review/dist/service.js.map +1 -0
- package/packages/durable-review/dist/types.d.ts +139 -0
- package/packages/durable-review/dist/types.d.ts.map +1 -0
- package/packages/durable-review/dist/types.js +58 -0
- package/packages/durable-review/dist/types.js.map +1 -0
- package/packages/durable-review/dist/worker.d.ts +56 -0
- package/packages/durable-review/dist/worker.d.ts.map +1 -0
- package/packages/durable-review/dist/worker.js +163 -0
- package/packages/durable-review/dist/worker.js.map +1 -0
- package/packages/durable-review/package.json +33 -0
- package/packages/durable-review/src/client.ts +117 -0
- package/packages/durable-review/src/documents.ts +134 -0
- package/packages/durable-review/src/extension.ts +150 -0
- package/packages/durable-review/src/index.ts +23 -0
- package/packages/durable-review/src/reviewer.ts +166 -0
- package/packages/durable-review/src/service.ts +144 -0
- package/packages/durable-review/src/types.ts +183 -0
- package/packages/durable-review/src/worker.ts +232 -0
- package/packages/durable-review/test/smoke.test.ts +69 -0
- package/packages/e2e-tester/package.json +1 -1
- package/packages/evaluation-engine/package.json +1 -1
- package/packages/evaluation-runner/package.json +1 -1
- package/packages/event-bus/package.json +1 -1
- package/packages/event-store/package.json +1 -1
- package/packages/experience-replay/package.json +1 -1
- package/packages/feedback-collector/package.json +1 -1
- package/packages/file-copy-helper/package.json +1 -1
- package/packages/framework-detector/package.json +1 -1
- package/packages/framework-plugin-sdk/package.json +1 -1
- package/packages/frappe-plugin/package.json +1 -1
- package/packages/generic-web-plugin/package.json +1 -1
- package/packages/health-monitor/package.json +1 -1
- package/packages/intent-analyzer/package.json +1 -1
- package/packages/jev-judge/package.json +1 -1
- package/packages/knowledge-graph/package.json +1 -1
- package/packages/knowledge-retrieval/package.json +1 -1
- package/packages/laravel-plugin/package.json +1 -1
- package/packages/learning-engine/package.json +1 -1
- package/packages/mcp-adapter/package.json +1 -1
- package/packages/memory-engine/package.json +1 -1
- package/packages/milestone-manager/package.json +1 -1
- package/packages/model-registry/package.json +1 -1
- package/packages/nextjs-plugin/package.json +1 -1
- package/packages/notification/package.json +1 -1
- package/packages/observability/package.json +1 -1
- package/packages/okf-indexer/package.json +1 -1
- package/packages/paperclip-integration/package.json +1 -1
- package/packages/performance-optimizer/package.json +1 -1
- package/packages/privilege-broker/package.json +1 -1
- package/packages/project-analyzer/package.json +1 -1
- package/packages/project-bootstrap/package.json +1 -1
- package/packages/projection-engine/package.json +1 -1
- package/packages/prompt-compiler/package.json +1 -1
- package/packages/prompt-versioning/package.json +1 -1
- package/packages/provider-adapter-sdk/package.json +1 -1
- package/packages/provider-router/package.json +1 -1
- package/packages/provider-selector/package.json +1 -1
- package/packages/providers/package.json +1 -1
- package/packages/qdrant-skills/package.json +1 -1
- package/packages/quota-manager/package.json +1 -1
- package/packages/rate-limiter/package.json +1 -1
- package/packages/react-vite-plugin/package.json +1 -1
- package/packages/release-manager/package.json +1 -1
- package/packages/requirement-compiler/package.json +1 -1
- package/packages/runtime/package.json +1 -1
- package/packages/scheduler/package.json +1 -1
- package/packages/scheduler-adapter/package.json +1 -1
- package/packages/session/package.json +1 -1
- package/packages/session-api/package.json +1 -1
- package/packages/session-export/package.json +1 -1
- package/packages/shared-context/package.json +1 -1
- package/packages/skill-mcp-client/package.json +1 -1
- package/packages/skill-registry/package.json +1 -1
- package/packages/skills/package.json +1 -1
- package/packages/sprint-planner/package.json +1 -1
- package/packages/subscription-engine/package.json +1 -1
- package/packages/task-compiler/package.json +1 -1
- package/packages/telegram/package.json +1 -1
- package/packages/tencentdb-memory/package.json +1 -1
- package/packages/tencentdb-sync/package.json +1 -1
- package/packages/test-data-generator/package.json +1 -1
- package/packages/test-generator/package.json +1 -1
- package/packages/todo-bd-sync/package.json +1 -1
- package/packages/token-estimation/package.json +1 -1
- package/packages/token-optimizer/package.json +1 -1
- package/packages/trajectory/package.json +1 -1
- package/packages/tui/package.json +1 -1
- package/packages/types/package.json +1 -1
- package/packages/webmcp-tester/package.json +1 -1
- package/packages/workflow-events/package.json +1 -1
- package/packages/workspace-scanner/package.json +1 -1
- package/packages/worktree/package.json +1 -1
- package/packages/write-review/package.json +1 -1
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable Review Extension
|
|
3
|
+
*
|
|
4
|
+
* Small Pi command adapter for /harness-review, /harness-review-status, /harness-review-cancel.
|
|
5
|
+
*/
|
|
6
|
+
import { validateReviewRequest } from "./types.js";
|
|
7
|
+
import { submitReviewRequest, getReviewStatus, cancelReview, checkWorkerReady, } from "./client.js";
|
|
8
|
+
/**
|
|
9
|
+
* Feature flag
|
|
10
|
+
*/
|
|
11
|
+
const DURABLE_REVIEW_ENABLED = process.env.HARNESS_DURABLE_REVIEW === "1";
|
|
12
|
+
/**
|
|
13
|
+
* Help text when feature is disabled
|
|
14
|
+
*/
|
|
15
|
+
const DISABLED_HELP = `
|
|
16
|
+
Durable Review is not enabled. To enable:
|
|
17
|
+
|
|
18
|
+
1. Set environment variable: HARNESS_DURABLE_REVIEW=1
|
|
19
|
+
2. Restart Pi
|
|
20
|
+
3. Start a worker: node packages/durable-review/dist/worker.js
|
|
21
|
+
|
|
22
|
+
This feature provides SQLite-backed review with crash recovery.
|
|
23
|
+
`.trim();
|
|
24
|
+
/**
|
|
25
|
+
* Handle /harness-review command
|
|
26
|
+
*/
|
|
27
|
+
export async function handleHarnessReview(args) {
|
|
28
|
+
if (!DURABLE_REVIEW_ENABLED) {
|
|
29
|
+
return DISABLED_HELP;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
// Parse request
|
|
33
|
+
let request;
|
|
34
|
+
try {
|
|
35
|
+
request = JSON.parse(args.request);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return "Error: Request must be valid JSON. Usage: /harness-review <json-request>";
|
|
39
|
+
}
|
|
40
|
+
// Validate
|
|
41
|
+
const validation = validateReviewRequest(request);
|
|
42
|
+
if (!validation.valid) {
|
|
43
|
+
return `Error: ${validation.error}`;
|
|
44
|
+
}
|
|
45
|
+
// Check worker readiness
|
|
46
|
+
const ready = await checkWorkerReady(validation.request.input.workspacePath);
|
|
47
|
+
if (!ready.ready) {
|
|
48
|
+
return `Error: Worker not ready - ${ready.error || "unknown error"}`;
|
|
49
|
+
}
|
|
50
|
+
// Submit request
|
|
51
|
+
const result = await submitReviewRequest(validation.request);
|
|
52
|
+
return `Review started: ${result.jobId}\nStatus: ${result.status.status}`;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
return `Error: ${error instanceof Error ? error.message : String(error)}`;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Handle /harness-review-status command
|
|
60
|
+
*/
|
|
61
|
+
export async function handleHarnessReviewStatus(args) {
|
|
62
|
+
if (!DURABLE_REVIEW_ENABLED) {
|
|
63
|
+
return DISABLED_HELP;
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
const workspacePath = args.workspacePath || process.cwd();
|
|
67
|
+
const status = await getReviewStatus(args.jobId, workspacePath);
|
|
68
|
+
if (!status) {
|
|
69
|
+
return `Job not found: ${args.jobId}`;
|
|
70
|
+
}
|
|
71
|
+
const lines = [
|
|
72
|
+
`Job: ${status.jobId}`,
|
|
73
|
+
`Status: ${status.status}`,
|
|
74
|
+
];
|
|
75
|
+
if (status.verdict) {
|
|
76
|
+
lines.push(`Verdict: ${status.verdict}`);
|
|
77
|
+
}
|
|
78
|
+
if (status.summary) {
|
|
79
|
+
lines.push(`Summary: ${status.summary}`);
|
|
80
|
+
}
|
|
81
|
+
if (status.error) {
|
|
82
|
+
lines.push(`Error: ${status.error}`);
|
|
83
|
+
}
|
|
84
|
+
if (status.findings && status.findings.length > 0) {
|
|
85
|
+
lines.push(`Findings: ${status.findings.length}`);
|
|
86
|
+
}
|
|
87
|
+
lines.push(`Created: ${status.createdAt}`);
|
|
88
|
+
lines.push(`Updated: ${status.updatedAt}`);
|
|
89
|
+
return lines.join("\n");
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
return `Error: ${error instanceof Error ? error.message : String(error)}`;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Handle /harness-review-cancel command
|
|
97
|
+
*/
|
|
98
|
+
export async function handleHarnessReviewCancel(args) {
|
|
99
|
+
if (!DURABLE_REVIEW_ENABLED) {
|
|
100
|
+
return DISABLED_HELP;
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
const workspacePath = args.workspacePath || process.cwd();
|
|
104
|
+
const cancelled = await cancelReview(args.jobId, workspacePath);
|
|
105
|
+
if (cancelled) {
|
|
106
|
+
return `Job cancelled: ${args.jobId}`;
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
return `Failed to cancel job: ${args.jobId}. It may not exist or already be complete.`;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
return `Error: ${error instanceof Error ? error.message : String(error)}`;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Check for command collisions before registration
|
|
118
|
+
*/
|
|
119
|
+
export function checkCommandCollisions(commands) {
|
|
120
|
+
const reserved = ["/harness-review", "/harness-review-status", "/harness-review-cancel"];
|
|
121
|
+
return reserved.filter((cmd) => commands.includes(cmd));
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=extension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable Review Package
|
|
3
|
+
*
|
|
4
|
+
* SQLite-backed durable reviewer using @earendil-works/pi-durable.
|
|
5
|
+
*/
|
|
6
|
+
export * from "./types.js";
|
|
7
|
+
export * from "./documents.js";
|
|
8
|
+
export * from "./service.js";
|
|
9
|
+
export * from "./client.js";
|
|
10
|
+
export * from "./extension.js";
|
|
11
|
+
export { defineExtension, defineTool } from "@earendil-works/pi-durable";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,YAAY,CAAC;AAG3B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,cAAc,CAAC;AAG7B,cAAc,aAAa,CAAC;AAG5B,cAAc,gBAAgB,CAAC;AAG/B,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable Review Package
|
|
3
|
+
*
|
|
4
|
+
* SQLite-backed durable reviewer using @earendil-works/pi-durable.
|
|
5
|
+
*/
|
|
6
|
+
// Types
|
|
7
|
+
export * from "./types.js";
|
|
8
|
+
// Documents
|
|
9
|
+
export * from "./documents.js";
|
|
10
|
+
// Service
|
|
11
|
+
export * from "./service.js";
|
|
12
|
+
// Client
|
|
13
|
+
export * from "./client.js";
|
|
14
|
+
// Extension helpers
|
|
15
|
+
export * from "./extension.js";
|
|
16
|
+
// Re-exports from pi-durable for convenience
|
|
17
|
+
export { defineExtension, defineTool } from "@earendil-works/pi-durable";
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,QAAQ;AACR,cAAc,YAAY,CAAC;AAE3B,YAAY;AACZ,cAAc,gBAAgB,CAAC;AAE/B,UAAU;AACV,cAAc,cAAc,CAAC;AAE7B,SAAS;AACT,cAAc,aAAa,CAAC;AAE5B,oBAAoB;AACpB,cAAc,gBAAgB,CAAC;AAE/B,6CAA6C;AAC7C,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable Reviewer
|
|
3
|
+
*
|
|
4
|
+
* Reviewer extension with constrained tools and structured result validation.
|
|
5
|
+
*/
|
|
6
|
+
import type { JsonValue } from "@earendil-works/chord";
|
|
7
|
+
import { Type } from "typebox";
|
|
8
|
+
/**
|
|
9
|
+
* Finding from the reviewer
|
|
10
|
+
*/
|
|
11
|
+
export interface Finding {
|
|
12
|
+
rule: string;
|
|
13
|
+
severity: "error" | "warning" | "info";
|
|
14
|
+
message: string;
|
|
15
|
+
file?: string;
|
|
16
|
+
line?: number;
|
|
17
|
+
endLine?: number;
|
|
18
|
+
[key: string]: string | number | undefined;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Review result
|
|
22
|
+
*/
|
|
23
|
+
export interface ReviewResult {
|
|
24
|
+
verdict: "approved" | "changes_requested" | "blocked";
|
|
25
|
+
findings: Finding[];
|
|
26
|
+
summary: string;
|
|
27
|
+
reportId: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Tool parameters for reading a file
|
|
31
|
+
*/
|
|
32
|
+
export declare const ReadFileTool: import("@earendil-works/pi-durable").ToolRegistration<Type.TObject<{
|
|
33
|
+
path: Type.TString;
|
|
34
|
+
startLine: Type.TOptional<Type.TNumber>;
|
|
35
|
+
endLine: Type.TOptional<Type.TNumber>;
|
|
36
|
+
}>, JsonValue>;
|
|
37
|
+
/**
|
|
38
|
+
* Tool parameters for listing files
|
|
39
|
+
*/
|
|
40
|
+
export declare const ListFilesTool: import("@earendil-works/pi-durable").ToolRegistration<Type.TObject<{
|
|
41
|
+
path: Type.TOptional<Type.TString>;
|
|
42
|
+
pattern: Type.TOptional<Type.TString>;
|
|
43
|
+
}>, JsonValue>;
|
|
44
|
+
/**
|
|
45
|
+
* Tool parameters for getting diff
|
|
46
|
+
*/
|
|
47
|
+
export declare const GetDiffTool: import("@earendil-works/pi-durable").ToolRegistration<Type.TObject<{}>, JsonValue>;
|
|
48
|
+
/**
|
|
49
|
+
* Tool parameters for submitting review result
|
|
50
|
+
*/
|
|
51
|
+
export declare const SubmitReviewTool: import("@earendil-works/pi-durable").ToolRegistration<Type.TObject<{
|
|
52
|
+
verdict: Type.TUnion<[Type.TLiteral<"approved">, Type.TLiteral<"changes_requested">, Type.TLiteral<"blocked">]>;
|
|
53
|
+
findings: Type.TArray<Type.TObject<{
|
|
54
|
+
rule: Type.TString;
|
|
55
|
+
severity: Type.TUnion<[Type.TLiteral<"error">, Type.TLiteral<"warning">, Type.TLiteral<"info">]>;
|
|
56
|
+
message: Type.TString;
|
|
57
|
+
file: Type.TOptional<Type.TString>;
|
|
58
|
+
line: Type.TOptional<Type.TNumber>;
|
|
59
|
+
endLine: Type.TOptional<Type.TNumber>;
|
|
60
|
+
}>>;
|
|
61
|
+
summary: Type.TString;
|
|
62
|
+
}>, JsonValue>;
|
|
63
|
+
/**
|
|
64
|
+
* Reviewer extension
|
|
65
|
+
*/
|
|
66
|
+
export declare const ReviewerExtension: import("@earendil-works/pi-durable").Extension<import("@earendil-works/pi-durable").ToolRegistration<Type.TObject<{}>, JsonValue>>;
|
|
67
|
+
//# sourceMappingURL=reviewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewer.d.ts","sourceRoot":"","sources":["../src/reviewer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,UAAU,GAAG,mBAAmB,GAAG,SAAS,CAAC;IACtD,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,YAAY;;;;cAoBvB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,aAAa;;;cAkBxB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,WAAW,oFAWtB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;cAwD3B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,iBAAiB,oIAG5B,CAAC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable Reviewer
|
|
3
|
+
*
|
|
4
|
+
* Reviewer extension with constrained tools and structured result validation.
|
|
5
|
+
*/
|
|
6
|
+
import { defineExtension, defineTool } from "@earendil-works/pi-durable";
|
|
7
|
+
import { Type } from "typebox";
|
|
8
|
+
/**
|
|
9
|
+
* Tool parameters for reading a file
|
|
10
|
+
*/
|
|
11
|
+
export const ReadFileTool = defineTool({
|
|
12
|
+
name: "read_file",
|
|
13
|
+
description: "Read contents of a file in the review snapshot",
|
|
14
|
+
parameters: Type.Object({
|
|
15
|
+
path: Type.String(),
|
|
16
|
+
startLine: Type.Optional(Type.Number()),
|
|
17
|
+
endLine: Type.Optional(Type.Number()),
|
|
18
|
+
}),
|
|
19
|
+
replay: "safe",
|
|
20
|
+
execute: async (args, _api, _context) => {
|
|
21
|
+
// In a real implementation, this would read from the snapshot directory
|
|
22
|
+
return {
|
|
23
|
+
isError: true,
|
|
24
|
+
structuredOutput: { error: "Snapshot reading not yet implemented", path: args.path },
|
|
25
|
+
};
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
/**
|
|
29
|
+
* Tool parameters for listing files
|
|
30
|
+
*/
|
|
31
|
+
export const ListFilesTool = defineTool({
|
|
32
|
+
name: "list_files",
|
|
33
|
+
description: "List files in a directory of the review snapshot",
|
|
34
|
+
parameters: Type.Object({
|
|
35
|
+
path: Type.Optional(Type.String()),
|
|
36
|
+
pattern: Type.Optional(Type.String()),
|
|
37
|
+
}),
|
|
38
|
+
replay: "safe",
|
|
39
|
+
execute: async (_args, _api, _context) => {
|
|
40
|
+
// In a real implementation, this would list from the snapshot directory
|
|
41
|
+
return {
|
|
42
|
+
structuredOutput: { files: [], error: "Snapshot listing not yet implemented" },
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
/**
|
|
47
|
+
* Tool parameters for getting diff
|
|
48
|
+
*/
|
|
49
|
+
export const GetDiffTool = defineTool({
|
|
50
|
+
name: "get_diff",
|
|
51
|
+
description: "Get the diff for review",
|
|
52
|
+
parameters: Type.Object({}),
|
|
53
|
+
replay: "safe",
|
|
54
|
+
execute: async (_args, _api, _context) => {
|
|
55
|
+
// In a real implementation, this would return the stored diff
|
|
56
|
+
return {
|
|
57
|
+
structuredOutput: { diff: "", error: "Diff reading not yet implemented" },
|
|
58
|
+
};
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
/**
|
|
62
|
+
* Tool parameters for submitting review result
|
|
63
|
+
*/
|
|
64
|
+
export const SubmitReviewTool = defineTool({
|
|
65
|
+
name: "submit_review",
|
|
66
|
+
description: "Submit the final review result",
|
|
67
|
+
parameters: Type.Object({
|
|
68
|
+
verdict: Type.Union([
|
|
69
|
+
Type.Literal("approved"),
|
|
70
|
+
Type.Literal("changes_requested"),
|
|
71
|
+
Type.Literal("blocked"),
|
|
72
|
+
]),
|
|
73
|
+
findings: Type.Array(Type.Object({
|
|
74
|
+
rule: Type.String(),
|
|
75
|
+
severity: Type.Union([
|
|
76
|
+
Type.Literal("error"),
|
|
77
|
+
Type.Literal("warning"),
|
|
78
|
+
Type.Literal("info"),
|
|
79
|
+
]),
|
|
80
|
+
message: Type.String(),
|
|
81
|
+
file: Type.Optional(Type.String()),
|
|
82
|
+
line: Type.Optional(Type.Number()),
|
|
83
|
+
endLine: Type.Optional(Type.Number()),
|
|
84
|
+
})),
|
|
85
|
+
summary: Type.String(),
|
|
86
|
+
}),
|
|
87
|
+
replay: "safe",
|
|
88
|
+
execute: async (args, _api, _context) => {
|
|
89
|
+
const reportId = `report-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
|
|
90
|
+
// Cast findings to JsonValue via JSON roundtrip
|
|
91
|
+
let structuredOutput;
|
|
92
|
+
try {
|
|
93
|
+
structuredOutput = JSON.parse(JSON.stringify({
|
|
94
|
+
verdict: args.verdict,
|
|
95
|
+
findings: args.findings,
|
|
96
|
+
summary: args.summary,
|
|
97
|
+
reportId,
|
|
98
|
+
}));
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
structuredOutput = {
|
|
102
|
+
verdict: args.verdict,
|
|
103
|
+
summary: args.summary,
|
|
104
|
+
reportId,
|
|
105
|
+
findings: [],
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
// SAFETY: structuredOutput is JSON-serializable and matches the schema
|
|
109
|
+
return { structuredOutput: structuredOutput };
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
/**
|
|
113
|
+
* Reviewer extension
|
|
114
|
+
*/
|
|
115
|
+
export const ReviewerExtension = defineExtension({
|
|
116
|
+
name: "reviewer",
|
|
117
|
+
tools: [ReadFileTool, ListFilesTool, GetDiffTool, SubmitReviewTool],
|
|
118
|
+
});
|
|
119
|
+
//# sourceMappingURL=reviewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reviewer.js","sourceRoot":"","sources":["../src/reviewer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable Review Service
|
|
3
|
+
*
|
|
4
|
+
* Harness lifecycle, admission, status, cancellation and recovery.
|
|
5
|
+
*/
|
|
6
|
+
import type { ReviewRequest, ReviewStatusResponse } from "./types.js";
|
|
7
|
+
import type { ReviewJobRecord } from "./documents.js";
|
|
8
|
+
/**
|
|
9
|
+
* Get workspace-specific directory
|
|
10
|
+
*/
|
|
11
|
+
export declare function getWorkspaceDir(workspaceKey: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Get SQLite database path for workspace
|
|
14
|
+
*/
|
|
15
|
+
export declare function getDatabasePath(workspaceKey: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Hash workspace path to get stable key
|
|
18
|
+
*/
|
|
19
|
+
export declare function hashWorkspaceKey(workspacePath: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* Get canonical workspace path (realpath)
|
|
22
|
+
*/
|
|
23
|
+
export declare function getCanonicalPath(workspacePath: string): Promise<string>;
|
|
24
|
+
/**
|
|
25
|
+
* Validate review request and compute deduplication key
|
|
26
|
+
*/
|
|
27
|
+
export declare function validateAndHashRequest(request: ReviewRequest): {
|
|
28
|
+
valid: boolean;
|
|
29
|
+
error?: string;
|
|
30
|
+
inputHash?: string;
|
|
31
|
+
workspaceKey?: string;
|
|
32
|
+
canonicalWorkspace?: string;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Convert internal job record to API response
|
|
36
|
+
*/
|
|
37
|
+
export declare function toStatusResponse(job: ReviewJobRecord): ReviewStatusResponse;
|
|
38
|
+
/**
|
|
39
|
+
* Create new job record from request
|
|
40
|
+
*/
|
|
41
|
+
export declare function createJobRecord(jobId: string, request: ReviewRequest, validation: ReturnType<typeof validateAndHashRequest>): ReviewJobRecord;
|
|
42
|
+
/**
|
|
43
|
+
* Job status constants
|
|
44
|
+
*/
|
|
45
|
+
export declare const JOB_STATUS: {
|
|
46
|
+
readonly QUEUED: "queued";
|
|
47
|
+
readonly RUNNING: "running";
|
|
48
|
+
readonly COMPLETED: "completed";
|
|
49
|
+
readonly FAILED: "failed";
|
|
50
|
+
readonly CANCELLED: "cancelled";
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,KAAK,EAAE,aAAa,EAAa,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAUtD;;GAEG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAM5D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO7E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,aAAa,GAAG;IAC9D,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAoBA;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,eAAe,GAAG,oBAAoB,CAY3E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,aAAa,EACtB,UAAU,EAAE,UAAU,CAAC,OAAO,sBAAsB,CAAC,GACpD,eAAe,CAiBjB;AAED;;GAEG;AACH,eAAO,MAAM,UAAU;aACrB,MAAM,EAAE,QAAQ;aAChB,OAAO,EAAE,SAAS;aAClB,SAAS,EAAE,WAAW;aACtB,MAAM,EAAE,QAAQ;aAChB,SAAS,EAAE,WAAW;CACd,CAAC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable Review Service
|
|
3
|
+
*
|
|
4
|
+
* Harness lifecycle, admission, status, cancellation and recovery.
|
|
5
|
+
*/
|
|
6
|
+
import { createHash } from "node:crypto";
|
|
7
|
+
import { existsSync, mkdirSync } from "node:fs";
|
|
8
|
+
import { homedir } from "node:os";
|
|
9
|
+
import { join } from "node:path";
|
|
10
|
+
/**
|
|
11
|
+
* Workspace storage path
|
|
12
|
+
*/
|
|
13
|
+
function getDurableDir() {
|
|
14
|
+
return join(homedir(), ".pi-harness-runtime", "durable");
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Get workspace-specific directory
|
|
18
|
+
*/
|
|
19
|
+
export function getWorkspaceDir(workspaceKey) {
|
|
20
|
+
const dir = join(getDurableDir(), workspaceKey);
|
|
21
|
+
if (!existsSync(dir)) {
|
|
22
|
+
mkdirSync(dir, { recursive: true });
|
|
23
|
+
}
|
|
24
|
+
return dir;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get SQLite database path for workspace
|
|
28
|
+
*/
|
|
29
|
+
export function getDatabasePath(workspaceKey) {
|
|
30
|
+
return join(getWorkspaceDir(workspaceKey), "review.sqlite");
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Hash workspace path to get stable key
|
|
34
|
+
*/
|
|
35
|
+
export function hashWorkspaceKey(workspacePath) {
|
|
36
|
+
return createHash("sha256").update(workspacePath).digest("hex").slice(0, 16);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get canonical workspace path (realpath)
|
|
40
|
+
*/
|
|
41
|
+
export async function getCanonicalPath(workspacePath) {
|
|
42
|
+
try {
|
|
43
|
+
const { realpathSync } = await import("node:fs");
|
|
44
|
+
return realpathSync(workspacePath);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return workspacePath;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Validate review request and compute deduplication key
|
|
52
|
+
*/
|
|
53
|
+
export function validateAndHashRequest(request) {
|
|
54
|
+
if (!request.requestId) {
|
|
55
|
+
return { valid: false, error: "requestId is required" };
|
|
56
|
+
}
|
|
57
|
+
if (!request.input?.workspacePath) {
|
|
58
|
+
return { valid: false, error: "workspacePath is required" };
|
|
59
|
+
}
|
|
60
|
+
const workspaceKey = hashWorkspaceKey(request.input.workspacePath);
|
|
61
|
+
const inputHash = createHash("sha256")
|
|
62
|
+
.update(JSON.stringify(request.input))
|
|
63
|
+
.digest("hex")
|
|
64
|
+
.slice(0, 32);
|
|
65
|
+
return {
|
|
66
|
+
valid: true,
|
|
67
|
+
inputHash,
|
|
68
|
+
workspaceKey,
|
|
69
|
+
canonicalWorkspace: request.input.workspacePath,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Convert internal job record to API response
|
|
74
|
+
*/
|
|
75
|
+
export function toStatusResponse(job) {
|
|
76
|
+
return {
|
|
77
|
+
jobId: job.jobId,
|
|
78
|
+
status: job.status,
|
|
79
|
+
verdict: job.verdict,
|
|
80
|
+
findings: job.findings,
|
|
81
|
+
summary: job.summary,
|
|
82
|
+
error: job.error,
|
|
83
|
+
createdAt: job.createdAt,
|
|
84
|
+
updatedAt: job.updatedAt,
|
|
85
|
+
completedAt: job.completedAt,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Create new job record from request
|
|
90
|
+
*/
|
|
91
|
+
export function createJobRecord(jobId, request, validation) {
|
|
92
|
+
const now = new Date().toISOString();
|
|
93
|
+
return {
|
|
94
|
+
jobId,
|
|
95
|
+
requestId: request.requestId,
|
|
96
|
+
workspacePath: request.input.workspacePath,
|
|
97
|
+
canonicalWorkspace: validation.canonicalWorkspace,
|
|
98
|
+
workspaceKey: validation.workspaceKey,
|
|
99
|
+
inputHash: validation.inputHash,
|
|
100
|
+
provider: request.provider,
|
|
101
|
+
model: request.model,
|
|
102
|
+
maxPasses: request.maxPasses ?? 5,
|
|
103
|
+
maxToolCalls: request.maxToolCalls ?? 100,
|
|
104
|
+
status: "queued",
|
|
105
|
+
createdAt: now,
|
|
106
|
+
updatedAt: now,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Job status constants
|
|
111
|
+
*/
|
|
112
|
+
export const JOB_STATUS = {
|
|
113
|
+
QUEUED: "queued",
|
|
114
|
+
RUNNING: "running",
|
|
115
|
+
COMPLETED: "completed",
|
|
116
|
+
FAILED: "failed",
|
|
117
|
+
CANCELLED: "cancelled",
|
|
118
|
+
};
|
|
119
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|