@req2rank/core 0.1.0-r7

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 (154) hide show
  1. package/LICENSE +21 -0
  2. package/dist/adaptive-calibration.d.ts +13 -0
  3. package/dist/adaptive-calibration.d.ts.map +1 -0
  4. package/dist/adaptive-calibration.js +39 -0
  5. package/dist/adaptive-calibration.js.map +1 -0
  6. package/dist/adaptive-calibration.test.d.ts +2 -0
  7. package/dist/adaptive-calibration.test.d.ts.map +1 -0
  8. package/dist/adaptive-calibration.test.js +20 -0
  9. package/dist/adaptive-calibration.test.js.map +1 -0
  10. package/dist/checkpoint-key.d.ts +3 -0
  11. package/dist/checkpoint-key.d.ts.map +1 -0
  12. package/dist/checkpoint-key.js +29 -0
  13. package/dist/checkpoint-key.js.map +1 -0
  14. package/dist/checkpoint-key.test.d.ts +2 -0
  15. package/dist/checkpoint-key.test.d.ts.map +1 -0
  16. package/dist/checkpoint-key.test.js +32 -0
  17. package/dist/checkpoint-key.test.js.map +1 -0
  18. package/dist/config.d.ts +205 -0
  19. package/dist/config.d.ts.map +1 -0
  20. package/dist/config.js +85 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/domain-taxonomy.d.ts +13 -0
  23. package/dist/domain-taxonomy.d.ts.map +1 -0
  24. package/dist/domain-taxonomy.js +12 -0
  25. package/dist/domain-taxonomy.js.map +1 -0
  26. package/dist/evaluation-panel.d.ts +27 -0
  27. package/dist/evaluation-panel.d.ts.map +1 -0
  28. package/dist/evaluation-panel.js +158 -0
  29. package/dist/evaluation-panel.js.map +1 -0
  30. package/dist/evaluation-panel.test.d.ts +2 -0
  31. package/dist/evaluation-panel.test.d.ts.map +1 -0
  32. package/dist/evaluation-panel.test.js +185 -0
  33. package/dist/evaluation-panel.test.js.map +1 -0
  34. package/dist/evidence-chain.d.ts +11 -0
  35. package/dist/evidence-chain.d.ts.map +1 -0
  36. package/dist/evidence-chain.js +33 -0
  37. package/dist/evidence-chain.js.map +1 -0
  38. package/dist/evidence-chain.test.d.ts +2 -0
  39. package/dist/evidence-chain.test.d.ts.map +1 -0
  40. package/dist/evidence-chain.test.js +16 -0
  41. package/dist/evidence-chain.test.js.map +1 -0
  42. package/dist/execution-engine.d.ts +29 -0
  43. package/dist/execution-engine.d.ts.map +1 -0
  44. package/dist/execution-engine.js +102 -0
  45. package/dist/execution-engine.js.map +1 -0
  46. package/dist/execution-engine.test.d.ts +2 -0
  47. package/dist/execution-engine.test.d.ts.map +1 -0
  48. package/dist/execution-engine.test.js +86 -0
  49. package/dist/execution-engine.test.js.map +1 -0
  50. package/dist/hub-client.d.ts +21 -0
  51. package/dist/hub-client.d.ts.map +1 -0
  52. package/dist/hub-client.js +99 -0
  53. package/dist/hub-client.js.map +1 -0
  54. package/dist/hub-client.test.d.ts +2 -0
  55. package/dist/hub-client.test.d.ts.map +1 -0
  56. package/dist/hub-client.test.js +129 -0
  57. package/dist/hub-client.test.js.map +1 -0
  58. package/dist/index.d.ts +19 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +19 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/leaderboard-query.d.ts +29 -0
  63. package/dist/leaderboard-query.d.ts.map +1 -0
  64. package/dist/leaderboard-query.js +59 -0
  65. package/dist/leaderboard-query.js.map +1 -0
  66. package/dist/leaderboard-query.test.d.ts +2 -0
  67. package/dist/leaderboard-query.test.d.ts.map +1 -0
  68. package/dist/leaderboard-query.test.js +34 -0
  69. package/dist/leaderboard-query.test.js.map +1 -0
  70. package/dist/local-store.d.ts +18 -0
  71. package/dist/local-store.d.ts.map +1 -0
  72. package/dist/local-store.js +181 -0
  73. package/dist/local-store.js.map +1 -0
  74. package/dist/local-store.test.d.ts +2 -0
  75. package/dist/local-store.test.d.ts.map +1 -0
  76. package/dist/local-store.test.js +153 -0
  77. package/dist/local-store.test.js.map +1 -0
  78. package/dist/pipeline-stage-handoff.test.d.ts +2 -0
  79. package/dist/pipeline-stage-handoff.test.d.ts.map +1 -0
  80. package/dist/pipeline-stage-handoff.test.js +290 -0
  81. package/dist/pipeline-stage-handoff.test.js.map +1 -0
  82. package/dist/pipeline.d.ts +67 -0
  83. package/dist/pipeline.d.ts.map +1 -0
  84. package/dist/pipeline.js +493 -0
  85. package/dist/pipeline.js.map +1 -0
  86. package/dist/providers/anthropic.d.ts +8 -0
  87. package/dist/providers/anthropic.d.ts.map +1 -0
  88. package/dist/providers/anthropic.js +45 -0
  89. package/dist/providers/anthropic.js.map +1 -0
  90. package/dist/providers/base.d.ts +36 -0
  91. package/dist/providers/base.d.ts.map +1 -0
  92. package/dist/providers/base.js +47 -0
  93. package/dist/providers/base.js.map +1 -0
  94. package/dist/providers/custom.d.ts +6 -0
  95. package/dist/providers/custom.d.ts.map +1 -0
  96. package/dist/providers/custom.js +6 -0
  97. package/dist/providers/custom.js.map +1 -0
  98. package/dist/providers/google.d.ts +8 -0
  99. package/dist/providers/google.d.ts.map +1 -0
  100. package/dist/providers/google.js +48 -0
  101. package/dist/providers/google.js.map +1 -0
  102. package/dist/providers/index.d.ts +31 -0
  103. package/dist/providers/index.d.ts.map +1 -0
  104. package/dist/providers/index.js +63 -0
  105. package/dist/providers/index.js.map +1 -0
  106. package/dist/providers/openai.d.ts +18 -0
  107. package/dist/providers/openai.d.ts.map +1 -0
  108. package/dist/providers/openai.js +111 -0
  109. package/dist/providers/openai.js.map +1 -0
  110. package/dist/providers/providers.test.d.ts +2 -0
  111. package/dist/providers/providers.test.d.ts.map +1 -0
  112. package/dist/providers/providers.test.js +71 -0
  113. package/dist/providers/providers.test.js.map +1 -0
  114. package/dist/requirement-generator.d.ts +29 -0
  115. package/dist/requirement-generator.d.ts.map +1 -0
  116. package/dist/requirement-generator.js +358 -0
  117. package/dist/requirement-generator.js.map +1 -0
  118. package/dist/requirement-generator.test.d.ts +2 -0
  119. package/dist/requirement-generator.test.d.ts.map +1 -0
  120. package/dist/requirement-generator.test.js +182 -0
  121. package/dist/requirement-generator.test.js.map +1 -0
  122. package/dist/sandbox.d.ts +32 -0
  123. package/dist/sandbox.d.ts.map +1 -0
  124. package/dist/sandbox.js +124 -0
  125. package/dist/sandbox.js.map +1 -0
  126. package/dist/sandbox.test.d.ts +2 -0
  127. package/dist/sandbox.test.d.ts.map +1 -0
  128. package/dist/sandbox.test.js +20 -0
  129. package/dist/sandbox.test.js.map +1 -0
  130. package/dist/scoring-engine.d.ts +15 -0
  131. package/dist/scoring-engine.d.ts.map +1 -0
  132. package/dist/scoring-engine.js +109 -0
  133. package/dist/scoring-engine.js.map +1 -0
  134. package/dist/scoring-engine.test.d.ts +2 -0
  135. package/dist/scoring-engine.test.d.ts.map +1 -0
  136. package/dist/scoring-engine.test.js +137 -0
  137. package/dist/scoring-engine.test.js.map +1 -0
  138. package/dist/submit-payload-builder.d.ts +9 -0
  139. package/dist/submit-payload-builder.d.ts.map +1 -0
  140. package/dist/submit-payload-builder.js +23 -0
  141. package/dist/submit-payload-builder.js.map +1 -0
  142. package/dist/submit-payload-builder.test.d.ts +2 -0
  143. package/dist/submit-payload-builder.test.d.ts.map +1 -0
  144. package/dist/submit-payload-builder.test.js +75 -0
  145. package/dist/submit-payload-builder.test.js.map +1 -0
  146. package/dist/submitter-types.d.ts +54 -0
  147. package/dist/submitter-types.d.ts.map +1 -0
  148. package/dist/submitter-types.js +2 -0
  149. package/dist/submitter-types.js.map +1 -0
  150. package/dist/types.d.ts +40 -0
  151. package/dist/types.d.ts.map +1 -0
  152. package/dist/types.js +2 -0
  153. package/dist/types.js.map +1 -0
  154. package/package.json +36 -0
@@ -0,0 +1,158 @@
1
+ function parseJsonObject(raw) {
2
+ try {
3
+ const parsed = JSON.parse(raw);
4
+ if (parsed && typeof parsed === "object") {
5
+ return parsed;
6
+ }
7
+ }
8
+ catch {
9
+ // continue
10
+ }
11
+ const fenced = raw.match(/```json\r?\n([\s\S]*?)```/i);
12
+ if (!fenced) {
13
+ return undefined;
14
+ }
15
+ try {
16
+ const parsed = JSON.parse(fenced[1]);
17
+ if (parsed && typeof parsed === "object") {
18
+ return parsed;
19
+ }
20
+ }
21
+ catch {
22
+ return undefined;
23
+ }
24
+ return undefined;
25
+ }
26
+ function toDimensionScoreMap(raw) {
27
+ const parsed = parseJsonObject(raw);
28
+ if (!parsed) {
29
+ return undefined;
30
+ }
31
+ const pick = (key) => {
32
+ const value = parsed?.[key];
33
+ return typeof value === "number" ? clampScore(value) : undefined;
34
+ };
35
+ const functionalCompleteness = pick("functionalCompleteness");
36
+ const codeQuality = pick("codeQuality");
37
+ const logicAccuracy = pick("logicAccuracy");
38
+ const security = pick("security");
39
+ const engineeringPractice = pick("engineeringPractice");
40
+ if (functionalCompleteness === undefined ||
41
+ codeQuality === undefined ||
42
+ logicAccuracy === undefined ||
43
+ security === undefined ||
44
+ engineeringPractice === undefined) {
45
+ return undefined;
46
+ }
47
+ return {
48
+ functionalCompleteness,
49
+ codeQuality,
50
+ logicAccuracy,
51
+ security,
52
+ engineeringPractice
53
+ };
54
+ }
55
+ function clampScore(score) {
56
+ return Math.max(0, Math.min(100, score));
57
+ }
58
+ function calculateStdDev(values) {
59
+ if (values.length <= 1) {
60
+ return 0;
61
+ }
62
+ const mean = values.reduce((sum, value) => sum + value, 0) / values.length;
63
+ const variance = values.reduce((sum, value) => sum + (value - mean) ** 2, 0) / values.length;
64
+ return Math.sqrt(variance);
65
+ }
66
+ export function calculateIja(results) {
67
+ if (results.length <= 1) {
68
+ return 1;
69
+ }
70
+ const overallScores = results.map((result) => {
71
+ const values = Object.values(result.dimensions);
72
+ return values.reduce((sum, value) => sum + value, 0) / values.length;
73
+ });
74
+ const stdDev = calculateStdDev(overallScores);
75
+ const normalized = 1 - Math.min(stdDev / 25, 1);
76
+ return Math.round(normalized * 1000) / 1000;
77
+ }
78
+ export class EvaluationPanel {
79
+ latestDroppedJudges = [];
80
+ async collectEvaluations(requirement, execution, judges, providerForJudge) {
81
+ const settled = await Promise.allSettled(judges.map(async (judge) => {
82
+ const provider = providerForJudge(judge);
83
+ const prompt = [
84
+ "You are an expert software code reviewer.",
85
+ "Score this code against the requirement on exactly five dimensions (0-100):",
86
+ "functionalCompleteness, codeQuality, logicAccuracy, security, engineeringPractice.",
87
+ "Return strict JSON only.",
88
+ "",
89
+ `Requirement title: ${requirement.title}`,
90
+ `Requirement description: ${requirement.description}`,
91
+ "Functional requirements:",
92
+ ...requirement.functionalRequirements.map((item) => `- ${item.id}: ${item.description}`),
93
+ "Constraints:",
94
+ ...requirement.constraints.map((item) => `- ${item}`),
95
+ "Code under review:",
96
+ "```",
97
+ execution.code,
98
+ "```"
99
+ ].join("\n");
100
+ const response = await provider.chat({
101
+ model: judge.model,
102
+ temperature: 0,
103
+ maxTokens: 1_024,
104
+ responseFormat: "json",
105
+ messages: [
106
+ {
107
+ role: "system",
108
+ content: "You are strict and objective. Output only valid JSON."
109
+ },
110
+ {
111
+ role: "user",
112
+ content: prompt
113
+ }
114
+ ]
115
+ });
116
+ const dimensions = toDimensionScoreMap(response.content);
117
+ if (!dimensions) {
118
+ throw new Error("invalid judge response");
119
+ }
120
+ return {
121
+ judgeId: `${judge.provider}/${judge.model}`,
122
+ dimensions
123
+ };
124
+ }));
125
+ const results = [];
126
+ const droppedJudges = [];
127
+ for (let index = 0; index < settled.length; index += 1) {
128
+ const result = settled[index];
129
+ const judge = judges[index];
130
+ const judgeId = `${judge.provider}/${judge.model}`;
131
+ if (result.status === "fulfilled") {
132
+ results.push(result.value);
133
+ }
134
+ else {
135
+ droppedJudges.push(judgeId);
136
+ }
137
+ }
138
+ return { results, droppedJudges };
139
+ }
140
+ async evaluate(requirement, execution, judges, providerForJudge) {
141
+ const { results, droppedJudges } = await this.collectEvaluations(requirement, execution, judges, providerForJudge);
142
+ this.latestDroppedJudges = droppedJudges;
143
+ if (results.length === 0) {
144
+ throw new Error(`all judges failed (${droppedJudges.join(", ")})`);
145
+ }
146
+ return results;
147
+ }
148
+ async evaluateWithIja(requirement, execution, judges, providerForJudge) {
149
+ this.latestDroppedJudges = [];
150
+ const results = await this.evaluate(requirement, execution, judges, providerForJudge);
151
+ return {
152
+ results,
153
+ ija: calculateIja(results),
154
+ droppedJudges: this.latestDroppedJudges
155
+ };
156
+ }
157
+ }
158
+ //# sourceMappingURL=evaluation-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluation-panel.js","sourceRoot":"","sources":["../src/evaluation-panel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=evaluation-panel.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluation-panel.test.d.ts","sourceRoot":"","sources":["../src/evaluation-panel.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,185 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { calculateIja, EvaluationPanel } from "./evaluation-panel.js";
3
+ class StubJudgeProvider {
4
+ id = "stub-judge";
5
+ name = "Stub Judge";
6
+ async chat() {
7
+ return {
8
+ content: JSON.stringify({
9
+ functionalCompleteness: 84,
10
+ codeQuality: 79,
11
+ logicAccuracy: 86,
12
+ security: 75,
13
+ engineeringPractice: 80
14
+ }),
15
+ usage: { promptTokens: 10, completionTokens: 12 },
16
+ latencyMs: 15
17
+ };
18
+ }
19
+ }
20
+ class StubFencedJudgeProvider {
21
+ id = "stub-judge-fenced";
22
+ name = "Stub Judge Fenced";
23
+ async chat() {
24
+ return {
25
+ content: "```json\r\n{\"functionalCompleteness\":84,\"codeQuality\":79,\"logicAccuracy\":86,\"security\":75,\"engineeringPractice\":80}\r\n```",
26
+ usage: { promptTokens: 10, completionTokens: 12 },
27
+ latencyMs: 15
28
+ };
29
+ }
30
+ }
31
+ class ThrowingJudgeProvider {
32
+ id = "throw-judge";
33
+ name = "Throw Judge";
34
+ async chat() {
35
+ throw new Error("judge unavailable");
36
+ }
37
+ }
38
+ function makeRequirement() {
39
+ return {
40
+ id: "req-1",
41
+ version: "1.0",
42
+ title: "Demo",
43
+ description: "Do demo",
44
+ functionalRequirements: [
45
+ {
46
+ id: "FR-1",
47
+ description: "Implement feature",
48
+ acceptanceCriteria: "Feature works",
49
+ priority: "must"
50
+ }
51
+ ],
52
+ constraints: [],
53
+ expectedDeliverables: ["source code"],
54
+ metadata: {
55
+ skills: ["api-design"],
56
+ complexity: "C2",
57
+ domain: "generic",
58
+ scenario: "demo",
59
+ techStack: ["typescript"],
60
+ mutationLog: []
61
+ },
62
+ evaluationGuidance: {
63
+ keyDifferentiators: ["clean structure"],
64
+ commonPitfalls: ["missing validation"],
65
+ edgeCases: ["empty input"]
66
+ },
67
+ generatedBy: "test",
68
+ generatedAt: new Date().toISOString(),
69
+ selfReviewPassed: true
70
+ };
71
+ }
72
+ describe("calculateIja", () => {
73
+ it("returns high agreement when judges are close", () => {
74
+ const ija = calculateIja([
75
+ {
76
+ judgeId: "j1",
77
+ dimensions: {
78
+ functionalCompleteness: 80,
79
+ codeQuality: 79,
80
+ logicAccuracy: 81,
81
+ security: 78,
82
+ engineeringPractice: 80
83
+ }
84
+ },
85
+ {
86
+ judgeId: "j2",
87
+ dimensions: {
88
+ functionalCompleteness: 81,
89
+ codeQuality: 80,
90
+ logicAccuracy: 82,
91
+ security: 79,
92
+ engineeringPractice: 81
93
+ }
94
+ }
95
+ ]);
96
+ expect(ija).toBeGreaterThan(0.9);
97
+ });
98
+ it("returns low agreement when judges diverge strongly", () => {
99
+ const ija = calculateIja([
100
+ {
101
+ judgeId: "j1",
102
+ dimensions: {
103
+ functionalCompleteness: 20,
104
+ codeQuality: 20,
105
+ logicAccuracy: 20,
106
+ security: 20,
107
+ engineeringPractice: 20
108
+ }
109
+ },
110
+ {
111
+ judgeId: "j2",
112
+ dimensions: {
113
+ functionalCompleteness: 95,
114
+ codeQuality: 95,
115
+ logicAccuracy: 95,
116
+ security: 95,
117
+ engineeringPractice: 95
118
+ }
119
+ }
120
+ ]);
121
+ expect(ija).toBe(0);
122
+ });
123
+ it("evaluates through judge providers and parses structured scores", async () => {
124
+ const panel = new EvaluationPanel();
125
+ const requirement = makeRequirement();
126
+ const execution = {
127
+ code: "export const answer = 42;",
128
+ language: "typescript",
129
+ timeoutMs: 60_000,
130
+ maxTokens: 8_192
131
+ };
132
+ const judges = [{ provider: "openai", model: "gpt-4o", weight: 1 }];
133
+ const provider = new StubJudgeProvider();
134
+ const results = await panel.evaluate(requirement, execution, judges, () => provider);
135
+ expect(results).toHaveLength(1);
136
+ expect(results[0].dimensions.logicAccuracy).toBe(86);
137
+ expect(results[0].judgeId).toBe("openai/gpt-4o");
138
+ });
139
+ it("tolerates failed judges when at least one judge succeeds", async () => {
140
+ const panel = new EvaluationPanel();
141
+ const requirement = makeRequirement();
142
+ const execution = {
143
+ code: "export const answer = 42;",
144
+ language: "typescript",
145
+ timeoutMs: 60_000,
146
+ maxTokens: 8_192
147
+ };
148
+ const judges = [
149
+ { provider: "openai", model: "gpt-4o", weight: 1 },
150
+ { provider: "openai", model: "gpt-4o-mini", weight: 1 }
151
+ ];
152
+ const stable = new StubJudgeProvider();
153
+ const flaky = new ThrowingJudgeProvider();
154
+ const output = await panel.evaluateWithIja(requirement, execution, judges, (judge) => judge.model === "gpt-4o" ? stable : flaky);
155
+ expect(output.results).toHaveLength(1);
156
+ expect(output.droppedJudges).toContain("openai/gpt-4o-mini");
157
+ });
158
+ it("parses fenced JSON scores with CRLF newlines", async () => {
159
+ const panel = new EvaluationPanel();
160
+ const requirement = makeRequirement();
161
+ const execution = {
162
+ code: "export const answer = 42;",
163
+ language: "typescript",
164
+ timeoutMs: 60_000,
165
+ maxTokens: 8_192
166
+ };
167
+ const judges = [{ provider: "openai", model: "gpt-4o", weight: 1 }];
168
+ const results = await panel.evaluate(requirement, execution, judges, () => new StubFencedJudgeProvider());
169
+ expect(results).toHaveLength(1);
170
+ expect(results[0].dimensions.security).toBe(75);
171
+ });
172
+ it("throws when all judges fail", async () => {
173
+ const panel = new EvaluationPanel();
174
+ const requirement = makeRequirement();
175
+ const execution = {
176
+ code: "export const answer = 42;",
177
+ language: "typescript",
178
+ timeoutMs: 60_000,
179
+ maxTokens: 8_192
180
+ };
181
+ const judges = [{ provider: "openai", model: "gpt-4o", weight: 1 }];
182
+ await expect(panel.evaluateWithIja(requirement, execution, judges, () => new ThrowingJudgeProvider())).rejects.toThrow("all judges failed");
183
+ });
184
+ });
185
+ //# sourceMappingURL=evaluation-panel.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluation-panel.test.js","sourceRoot":"","sources":["../src/evaluation-panel.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { EvidenceChain } from "./submitter-types.js";
2
+ export interface CreateEvidenceChainInput {
3
+ requirement?: string;
4
+ codeSubmission?: string;
5
+ judgeModels?: string[];
6
+ timeline?: EvidenceChain["timeline"];
7
+ samples?: EvidenceChain["samples"];
8
+ now?: Date;
9
+ }
10
+ export declare function createEvidenceChain(input: CreateEvidenceChainInput): EvidenceChain;
11
+ //# sourceMappingURL=evidence-chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence-chain.d.ts","sourceRoot":"","sources":["../src/evidence-chain.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,WAAW,wBAAwB;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACnC,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,aAAa,CAmClF"}
@@ -0,0 +1,33 @@
1
+ import { platform } from "node:os";
2
+ export function createEvidenceChain(input) {
3
+ const now = input.now ?? new Date();
4
+ const startedAt = new Date(now.getTime() - 1_500).toISOString();
5
+ const completedAt = now.toISOString();
6
+ const timeline = input.timeline && input.timeline.length > 0
7
+ ? input.timeline
8
+ : [
9
+ { phase: "generate", startedAt, completedAt, model: "system-generator" },
10
+ { phase: "execute", startedAt, completedAt, model: "target-model" },
11
+ { phase: "evaluate", startedAt, completedAt, model: (input.judgeModels ?? []).join(",") || "judge-model" },
12
+ { phase: "score", startedAt, completedAt, model: "scoring-engine" }
13
+ ];
14
+ const samples = input.samples && input.samples.length > 0
15
+ ? input.samples
16
+ : [
17
+ {
18
+ roundIndex: 0,
19
+ requirement: input.requirement ?? "requirement-unavailable",
20
+ codeSubmission: input.codeSubmission ?? "code-unavailable"
21
+ }
22
+ ];
23
+ return {
24
+ timeline,
25
+ samples,
26
+ environment: {
27
+ os: platform(),
28
+ nodeVersion: process.version,
29
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
30
+ }
31
+ };
32
+ }
33
+ //# sourceMappingURL=evidence-chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence-chain.js","sourceRoot":"","sources":["../src/evidence-chain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAYnC,MAAM,UAAU,mBAAmB,CAAC,KAA+B;IACjE,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAChE,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAEtC,MAAM,QAAQ,GACZ,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QACzC,CAAC,CAAC,KAAK,CAAC,QAAQ;QAChB,CAAC,CAAC;YACE,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,kBAAkB,EAAE;YACxE,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE;YACnE,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,aAAa,EAAE;YAC1G,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,gBAAgB,EAAE;SACpE,CAAC;IAER,MAAM,OAAO,GACX,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;QACvC,CAAC,CAAC,KAAK,CAAC,OAAO;QACf,CAAC,CAAC;YACE;gBACE,UAAU,EAAE,CAAC;gBACb,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,yBAAyB;gBAC3D,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,kBAAkB;aAC3D;SACF,CAAC;IAER,OAAO;QACL,QAAQ;QACR,OAAO;QACP,WAAW,EAAE;YACX,EAAE,EAAE,QAAQ,EAAE;YACd,WAAW,EAAE,OAAO,CAAC,OAAO;YAC5B,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,QAAQ;SAC3D;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=evidence-chain.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence-chain.test.d.ts","sourceRoot":"","sources":["../src/evidence-chain.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { createEvidenceChain } from "./evidence-chain.js";
3
+ describe("createEvidenceChain", () => {
4
+ it("builds timeline samples and environment fields", () => {
5
+ const chain = createEvidenceChain({
6
+ requirement: "Build API",
7
+ codeSubmission: "export const ok = true;",
8
+ judgeModels: ["openai/gpt-4o"],
9
+ now: new Date("2026-01-01T00:00:00.000Z")
10
+ });
11
+ expect(chain.timeline).toHaveLength(4);
12
+ expect(chain.samples).toHaveLength(1);
13
+ expect(chain.environment.os.length).toBeGreaterThan(0);
14
+ });
15
+ });
16
+ //# sourceMappingURL=evidence-chain.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence-chain.test.js","sourceRoot":"","sources":["../src/evidence-chain.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,KAAK,GAAG,mBAAmB,CAAC;YAChC,WAAW,EAAE,WAAW;YACxB,cAAc,EAAE,yBAAyB;YACzC,WAAW,EAAE,CAAC,eAAe,CAAC;YAC9B,GAAG,EAAE,IAAI,IAAI,CAAC,0BAA0B,CAAC;SAC1C,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { ProjectRequirement } from "./types.js";
2
+ import { LLMProvider } from "./providers/base.js";
3
+ export interface ExecutionResult {
4
+ code: string;
5
+ language: string;
6
+ timeoutMs: number;
7
+ maxTokens: number;
8
+ }
9
+ export interface ExecutionTarget {
10
+ provider: string;
11
+ model: string;
12
+ }
13
+ export interface ExecutionBudget {
14
+ timeoutMs: number;
15
+ maxTokens: number;
16
+ }
17
+ export interface ExecuteOptions {
18
+ rawResponse?: string;
19
+ provider?: LLMProvider;
20
+ }
21
+ export declare function parseExecutionResponse(rawResponse: string): {
22
+ code: string;
23
+ language: string;
24
+ };
25
+ export declare function resolveExecutionBudget(complexity: ProjectRequirement["metadata"]["complexity"]): ExecutionBudget;
26
+ export declare class ExecutionEngine {
27
+ execute(requirement: ProjectRequirement, target: ExecutionTarget, options?: ExecuteOptions): Promise<ExecutionResult>;
28
+ }
29
+ //# sourceMappingURL=execution-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-engine.d.ts","sourceRoot":"","sources":["../src/execution-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,WAAW,CAAC;CACxB;AAmCD,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAoB9F;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,GAAG,eAAe,CAEhH;AAED,qBAAa,eAAe;IACpB,OAAO,CAAC,WAAW,EAAE,kBAAkB,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,eAAe,CAAC;CAuDhI"}
@@ -0,0 +1,102 @@
1
+ const EXECUTION_BUDGETS = {
2
+ C1: { timeoutMs: 30_000, maxTokens: 4_096 },
3
+ C2: { timeoutMs: 60_000, maxTokens: 8_192 },
4
+ C3: { timeoutMs: 120_000, maxTokens: 16_384 },
5
+ C4: { timeoutMs: 180_000, maxTokens: 32_768 }
6
+ };
7
+ function extractFromJson(value) {
8
+ if (!value || typeof value !== "object") {
9
+ return undefined;
10
+ }
11
+ const record = value;
12
+ if (typeof record.code === "string") {
13
+ return {
14
+ code: record.code,
15
+ language: typeof record.language === "string" ? record.language : "typescript"
16
+ };
17
+ }
18
+ if (Array.isArray(record.files)) {
19
+ const firstFile = record.files[0];
20
+ if (firstFile && typeof firstFile.content === "string") {
21
+ return {
22
+ code: firstFile.content,
23
+ language: typeof firstFile.language === "string" ? firstFile.language : "typescript"
24
+ };
25
+ }
26
+ }
27
+ return undefined;
28
+ }
29
+ export function parseExecutionResponse(rawResponse) {
30
+ try {
31
+ const parsed = JSON.parse(rawResponse);
32
+ const fromJson = extractFromJson(parsed);
33
+ if (fromJson) {
34
+ return fromJson;
35
+ }
36
+ }
37
+ catch {
38
+ // fall through to code-block extraction
39
+ }
40
+ const match = rawResponse.match(/```([a-zA-Z0-9_-]+)?\r?\n([\s\S]*?)```/);
41
+ if (match) {
42
+ return {
43
+ language: match[1] ?? "text",
44
+ code: match[2].trim()
45
+ };
46
+ }
47
+ throw new Error("Unable to parse execution response");
48
+ }
49
+ export function resolveExecutionBudget(complexity) {
50
+ return EXECUTION_BUDGETS[complexity];
51
+ }
52
+ export class ExecutionEngine {
53
+ async execute(requirement, target, options = {}) {
54
+ const budget = resolveExecutionBudget(requirement.metadata.complexity);
55
+ let rawResponse = options.rawResponse;
56
+ if (!rawResponse) {
57
+ if (!options.provider) {
58
+ throw new Error("Execution provider is required when rawResponse is not provided.");
59
+ }
60
+ const executionPrompt = [
61
+ "You are implementing code for a software requirement.",
62
+ "Return code as JSON `{\"language\":\"...\",\"code\":\"...\"}`.",
63
+ "If JSON is not possible, return a single fenced code block.",
64
+ "",
65
+ `Target provider: ${target.provider}`,
66
+ `Target model: ${target.model}`,
67
+ `Requirement title: ${requirement.title}`,
68
+ `Requirement description: ${requirement.description}`,
69
+ "Functional requirements:",
70
+ ...requirement.functionalRequirements.map((item) => `- ${item.id}: ${item.description} | acceptance: ${item.acceptanceCriteria}`),
71
+ "Constraints:",
72
+ ...requirement.constraints.map((item) => `- ${item}`),
73
+ "Expected deliverables:",
74
+ ...requirement.expectedDeliverables.map((item) => `- ${item}`)
75
+ ].join("\n");
76
+ const response = await options.provider.chat({
77
+ model: target.model,
78
+ temperature: 0.2,
79
+ maxTokens: budget.maxTokens,
80
+ messages: [
81
+ {
82
+ role: "system",
83
+ content: "You generate production-ready code that strictly follows requirements."
84
+ },
85
+ {
86
+ role: "user",
87
+ content: executionPrompt
88
+ }
89
+ ]
90
+ });
91
+ rawResponse = response.content;
92
+ }
93
+ const parsed = parseExecutionResponse(rawResponse);
94
+ return {
95
+ code: parsed.code,
96
+ language: parsed.language,
97
+ timeoutMs: budget.timeoutMs,
98
+ maxTokens: budget.maxTokens
99
+ };
100
+ }
101
+ }
102
+ //# sourceMappingURL=execution-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-engine.js","sourceRoot":"","sources":["../src/execution-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=execution-engine.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execution-engine.test.d.ts","sourceRoot":"","sources":["../src/execution-engine.test.ts"],"names":[],"mappings":""}