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.
Files changed (142) hide show
  1. package/package.json +4 -2
  2. package/packages/a2a-adapter/package.json +1 -1
  3. package/packages/agent-policy/package.json +1 -1
  4. package/packages/architecture-generator/package.json +1 -1
  5. package/packages/auth/package.json +1 -1
  6. package/packages/autonomous-refactor/package.json +1 -1
  7. package/packages/autonomous-runtime/package.json +1 -1
  8. package/packages/cache-strategy/package.json +1 -1
  9. package/packages/capability-registry/package.json +1 -1
  10. package/packages/checkpoint/package.json +1 -1
  11. package/packages/cli-plugin-sdk/package.json +1 -1
  12. package/packages/clipboard/package.json +1 -1
  13. package/packages/clipboard-plugin/package.json +1 -1
  14. package/packages/code-generation/package.json +1 -1
  15. package/packages/code-review/package.json +1 -1
  16. package/packages/codex-adapter/package.json +1 -1
  17. package/packages/codex-watcher/package.json +1 -1
  18. package/packages/config-capture/package.json +1 -1
  19. package/packages/context-compiler/package.json +1 -1
  20. package/packages/context-discovery/package.json +1 -1
  21. package/packages/context-manager/package.json +1 -1
  22. package/packages/cookie-sanitizer/package.json +1 -1
  23. package/packages/cost-optimizer/package.json +1 -1
  24. package/packages/dependency-analyzer/package.json +1 -1
  25. package/packages/django-plugin/package.json +1 -1
  26. package/packages/doc-generator/package.json +1 -1
  27. package/packages/durable-review/dist/client.d.ts +46 -0
  28. package/packages/durable-review/dist/client.d.ts.map +1 -0
  29. package/packages/durable-review/dist/client.js +88 -0
  30. package/packages/durable-review/dist/client.js.map +1 -0
  31. package/packages/durable-review/dist/documents.d.ts +82 -0
  32. package/packages/durable-review/dist/documents.d.ts.map +1 -0
  33. package/packages/durable-review/dist/documents.js +65 -0
  34. package/packages/durable-review/dist/documents.js.map +1 -0
  35. package/packages/durable-review/dist/extension.d.ts +31 -0
  36. package/packages/durable-review/dist/extension.d.ts.map +1 -0
  37. package/packages/durable-review/dist/extension.js +123 -0
  38. package/packages/durable-review/dist/extension.js.map +1 -0
  39. package/packages/durable-review/dist/index.d.ts +12 -0
  40. package/packages/durable-review/dist/index.d.ts.map +1 -0
  41. package/packages/durable-review/dist/index.js +18 -0
  42. package/packages/durable-review/dist/index.js.map +1 -0
  43. package/packages/durable-review/dist/reviewer.d.ts +67 -0
  44. package/packages/durable-review/dist/reviewer.d.ts.map +1 -0
  45. package/packages/durable-review/dist/reviewer.js +119 -0
  46. package/packages/durable-review/dist/reviewer.js.map +1 -0
  47. package/packages/durable-review/dist/service.d.ts +52 -0
  48. package/packages/durable-review/dist/service.d.ts.map +1 -0
  49. package/packages/durable-review/dist/service.js +119 -0
  50. package/packages/durable-review/dist/service.js.map +1 -0
  51. package/packages/durable-review/dist/types.d.ts +139 -0
  52. package/packages/durable-review/dist/types.d.ts.map +1 -0
  53. package/packages/durable-review/dist/types.js +58 -0
  54. package/packages/durable-review/dist/types.js.map +1 -0
  55. package/packages/durable-review/dist/worker.d.ts +56 -0
  56. package/packages/durable-review/dist/worker.d.ts.map +1 -0
  57. package/packages/durable-review/dist/worker.js +163 -0
  58. package/packages/durable-review/dist/worker.js.map +1 -0
  59. package/packages/durable-review/package.json +33 -0
  60. package/packages/durable-review/src/client.ts +117 -0
  61. package/packages/durable-review/src/documents.ts +134 -0
  62. package/packages/durable-review/src/extension.ts +150 -0
  63. package/packages/durable-review/src/index.ts +23 -0
  64. package/packages/durable-review/src/reviewer.ts +166 -0
  65. package/packages/durable-review/src/service.ts +144 -0
  66. package/packages/durable-review/src/types.ts +183 -0
  67. package/packages/durable-review/src/worker.ts +232 -0
  68. package/packages/durable-review/test/smoke.test.ts +69 -0
  69. package/packages/e2e-tester/package.json +1 -1
  70. package/packages/evaluation-engine/package.json +1 -1
  71. package/packages/evaluation-runner/package.json +1 -1
  72. package/packages/event-bus/package.json +1 -1
  73. package/packages/event-store/package.json +1 -1
  74. package/packages/experience-replay/package.json +1 -1
  75. package/packages/feedback-collector/package.json +1 -1
  76. package/packages/file-copy-helper/package.json +1 -1
  77. package/packages/framework-detector/package.json +1 -1
  78. package/packages/framework-plugin-sdk/package.json +1 -1
  79. package/packages/frappe-plugin/package.json +1 -1
  80. package/packages/generic-web-plugin/package.json +1 -1
  81. package/packages/health-monitor/package.json +1 -1
  82. package/packages/intent-analyzer/package.json +1 -1
  83. package/packages/jev-judge/package.json +1 -1
  84. package/packages/knowledge-graph/package.json +1 -1
  85. package/packages/knowledge-retrieval/package.json +1 -1
  86. package/packages/laravel-plugin/package.json +1 -1
  87. package/packages/learning-engine/package.json +1 -1
  88. package/packages/mcp-adapter/package.json +1 -1
  89. package/packages/memory-engine/package.json +1 -1
  90. package/packages/milestone-manager/package.json +1 -1
  91. package/packages/model-registry/package.json +1 -1
  92. package/packages/nextjs-plugin/package.json +1 -1
  93. package/packages/notification/package.json +1 -1
  94. package/packages/observability/package.json +1 -1
  95. package/packages/okf-indexer/package.json +1 -1
  96. package/packages/paperclip-integration/package.json +1 -1
  97. package/packages/performance-optimizer/package.json +1 -1
  98. package/packages/privilege-broker/package.json +1 -1
  99. package/packages/project-analyzer/package.json +1 -1
  100. package/packages/project-bootstrap/package.json +1 -1
  101. package/packages/projection-engine/package.json +1 -1
  102. package/packages/prompt-compiler/package.json +1 -1
  103. package/packages/prompt-versioning/package.json +1 -1
  104. package/packages/provider-adapter-sdk/package.json +1 -1
  105. package/packages/provider-router/package.json +1 -1
  106. package/packages/provider-selector/package.json +1 -1
  107. package/packages/providers/package.json +1 -1
  108. package/packages/qdrant-skills/package.json +1 -1
  109. package/packages/quota-manager/package.json +1 -1
  110. package/packages/rate-limiter/package.json +1 -1
  111. package/packages/react-vite-plugin/package.json +1 -1
  112. package/packages/release-manager/package.json +1 -1
  113. package/packages/requirement-compiler/package.json +1 -1
  114. package/packages/runtime/package.json +1 -1
  115. package/packages/scheduler/package.json +1 -1
  116. package/packages/scheduler-adapter/package.json +1 -1
  117. package/packages/session/package.json +1 -1
  118. package/packages/session-api/package.json +1 -1
  119. package/packages/session-export/package.json +1 -1
  120. package/packages/shared-context/package.json +1 -1
  121. package/packages/skill-mcp-client/package.json +1 -1
  122. package/packages/skill-registry/package.json +1 -1
  123. package/packages/skills/package.json +1 -1
  124. package/packages/sprint-planner/package.json +1 -1
  125. package/packages/subscription-engine/package.json +1 -1
  126. package/packages/task-compiler/package.json +1 -1
  127. package/packages/telegram/package.json +1 -1
  128. package/packages/tencentdb-memory/package.json +1 -1
  129. package/packages/tencentdb-sync/package.json +1 -1
  130. package/packages/test-data-generator/package.json +1 -1
  131. package/packages/test-generator/package.json +1 -1
  132. package/packages/todo-bd-sync/package.json +1 -1
  133. package/packages/token-estimation/package.json +1 -1
  134. package/packages/token-optimizer/package.json +1 -1
  135. package/packages/trajectory/package.json +1 -1
  136. package/packages/tui/package.json +1 -1
  137. package/packages/types/package.json +1 -1
  138. package/packages/webmcp-tester/package.json +1 -1
  139. package/packages/workflow-events/package.json +1 -1
  140. package/packages/workspace-scanner/package.json +1 -1
  141. package/packages/worktree/package.json +1 -1
  142. 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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"}