@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.
- package/LICENSE +21 -0
- package/dist/adaptive-calibration.d.ts +13 -0
- package/dist/adaptive-calibration.d.ts.map +1 -0
- package/dist/adaptive-calibration.js +39 -0
- package/dist/adaptive-calibration.js.map +1 -0
- package/dist/adaptive-calibration.test.d.ts +2 -0
- package/dist/adaptive-calibration.test.d.ts.map +1 -0
- package/dist/adaptive-calibration.test.js +20 -0
- package/dist/adaptive-calibration.test.js.map +1 -0
- package/dist/checkpoint-key.d.ts +3 -0
- package/dist/checkpoint-key.d.ts.map +1 -0
- package/dist/checkpoint-key.js +29 -0
- package/dist/checkpoint-key.js.map +1 -0
- package/dist/checkpoint-key.test.d.ts +2 -0
- package/dist/checkpoint-key.test.d.ts.map +1 -0
- package/dist/checkpoint-key.test.js +32 -0
- package/dist/checkpoint-key.test.js.map +1 -0
- package/dist/config.d.ts +205 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +85 -0
- package/dist/config.js.map +1 -0
- package/dist/domain-taxonomy.d.ts +13 -0
- package/dist/domain-taxonomy.d.ts.map +1 -0
- package/dist/domain-taxonomy.js +12 -0
- package/dist/domain-taxonomy.js.map +1 -0
- package/dist/evaluation-panel.d.ts +27 -0
- package/dist/evaluation-panel.d.ts.map +1 -0
- package/dist/evaluation-panel.js +158 -0
- package/dist/evaluation-panel.js.map +1 -0
- package/dist/evaluation-panel.test.d.ts +2 -0
- package/dist/evaluation-panel.test.d.ts.map +1 -0
- package/dist/evaluation-panel.test.js +185 -0
- package/dist/evaluation-panel.test.js.map +1 -0
- package/dist/evidence-chain.d.ts +11 -0
- package/dist/evidence-chain.d.ts.map +1 -0
- package/dist/evidence-chain.js +33 -0
- package/dist/evidence-chain.js.map +1 -0
- package/dist/evidence-chain.test.d.ts +2 -0
- package/dist/evidence-chain.test.d.ts.map +1 -0
- package/dist/evidence-chain.test.js +16 -0
- package/dist/evidence-chain.test.js.map +1 -0
- package/dist/execution-engine.d.ts +29 -0
- package/dist/execution-engine.d.ts.map +1 -0
- package/dist/execution-engine.js +102 -0
- package/dist/execution-engine.js.map +1 -0
- package/dist/execution-engine.test.d.ts +2 -0
- package/dist/execution-engine.test.d.ts.map +1 -0
- package/dist/execution-engine.test.js +86 -0
- package/dist/execution-engine.test.js.map +1 -0
- package/dist/hub-client.d.ts +21 -0
- package/dist/hub-client.d.ts.map +1 -0
- package/dist/hub-client.js +99 -0
- package/dist/hub-client.js.map +1 -0
- package/dist/hub-client.test.d.ts +2 -0
- package/dist/hub-client.test.d.ts.map +1 -0
- package/dist/hub-client.test.js +129 -0
- package/dist/hub-client.test.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/leaderboard-query.d.ts +29 -0
- package/dist/leaderboard-query.d.ts.map +1 -0
- package/dist/leaderboard-query.js +59 -0
- package/dist/leaderboard-query.js.map +1 -0
- package/dist/leaderboard-query.test.d.ts +2 -0
- package/dist/leaderboard-query.test.d.ts.map +1 -0
- package/dist/leaderboard-query.test.js +34 -0
- package/dist/leaderboard-query.test.js.map +1 -0
- package/dist/local-store.d.ts +18 -0
- package/dist/local-store.d.ts.map +1 -0
- package/dist/local-store.js +181 -0
- package/dist/local-store.js.map +1 -0
- package/dist/local-store.test.d.ts +2 -0
- package/dist/local-store.test.d.ts.map +1 -0
- package/dist/local-store.test.js +153 -0
- package/dist/local-store.test.js.map +1 -0
- package/dist/pipeline-stage-handoff.test.d.ts +2 -0
- package/dist/pipeline-stage-handoff.test.d.ts.map +1 -0
- package/dist/pipeline-stage-handoff.test.js +290 -0
- package/dist/pipeline-stage-handoff.test.js.map +1 -0
- package/dist/pipeline.d.ts +67 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +493 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/providers/anthropic.d.ts +8 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +45 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/base.d.ts +36 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +47 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/custom.d.ts +6 -0
- package/dist/providers/custom.d.ts.map +1 -0
- package/dist/providers/custom.js +6 -0
- package/dist/providers/custom.js.map +1 -0
- package/dist/providers/google.d.ts +8 -0
- package/dist/providers/google.d.ts.map +1 -0
- package/dist/providers/google.js +48 -0
- package/dist/providers/google.js.map +1 -0
- package/dist/providers/index.d.ts +31 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +63 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai.d.ts +18 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +111 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/providers.test.d.ts +2 -0
- package/dist/providers/providers.test.d.ts.map +1 -0
- package/dist/providers/providers.test.js +71 -0
- package/dist/providers/providers.test.js.map +1 -0
- package/dist/requirement-generator.d.ts +29 -0
- package/dist/requirement-generator.d.ts.map +1 -0
- package/dist/requirement-generator.js +358 -0
- package/dist/requirement-generator.js.map +1 -0
- package/dist/requirement-generator.test.d.ts +2 -0
- package/dist/requirement-generator.test.d.ts.map +1 -0
- package/dist/requirement-generator.test.js +182 -0
- package/dist/requirement-generator.test.js.map +1 -0
- package/dist/sandbox.d.ts +32 -0
- package/dist/sandbox.d.ts.map +1 -0
- package/dist/sandbox.js +124 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/sandbox.test.d.ts +2 -0
- package/dist/sandbox.test.d.ts.map +1 -0
- package/dist/sandbox.test.js +20 -0
- package/dist/sandbox.test.js.map +1 -0
- package/dist/scoring-engine.d.ts +15 -0
- package/dist/scoring-engine.d.ts.map +1 -0
- package/dist/scoring-engine.js +109 -0
- package/dist/scoring-engine.js.map +1 -0
- package/dist/scoring-engine.test.d.ts +2 -0
- package/dist/scoring-engine.test.d.ts.map +1 -0
- package/dist/scoring-engine.test.js +137 -0
- package/dist/scoring-engine.test.js.map +1 -0
- package/dist/submit-payload-builder.d.ts +9 -0
- package/dist/submit-payload-builder.d.ts.map +1 -0
- package/dist/submit-payload-builder.js +23 -0
- package/dist/submit-payload-builder.js.map +1 -0
- package/dist/submit-payload-builder.test.d.ts +2 -0
- package/dist/submit-payload-builder.test.d.ts.map +1 -0
- package/dist/submit-payload-builder.test.js +75 -0
- package/dist/submit-payload-builder.test.js.map +1 -0
- package/dist/submitter-types.d.ts +54 -0
- package/dist/submitter-types.d.ts.map +1 -0
- package/dist/submitter-types.js +2 -0
- package/dist/submitter-types.js.map +1 -0
- package/dist/types.d.ts +40 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +36 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { ExecutionEngine, parseExecutionResponse, resolveExecutionBudget } from "./execution-engine.js";
|
|
3
|
+
class StubProvider {
|
|
4
|
+
id = "stub";
|
|
5
|
+
name = "Stub";
|
|
6
|
+
callCount = 0;
|
|
7
|
+
async chat() {
|
|
8
|
+
this.callCount += 1;
|
|
9
|
+
return {
|
|
10
|
+
content: "```ts\nexport const run = () => 'ok';\n```",
|
|
11
|
+
usage: { promptTokens: 10, completionTokens: 20 },
|
|
12
|
+
latencyMs: 12
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function makeRequirement(complexity) {
|
|
17
|
+
return {
|
|
18
|
+
id: "req-1",
|
|
19
|
+
version: "1.0",
|
|
20
|
+
title: "Demo requirement",
|
|
21
|
+
description: "demo",
|
|
22
|
+
functionalRequirements: [
|
|
23
|
+
{
|
|
24
|
+
id: "FR-1",
|
|
25
|
+
description: "Do work",
|
|
26
|
+
acceptanceCriteria: "Works",
|
|
27
|
+
priority: "must"
|
|
28
|
+
}
|
|
29
|
+
],
|
|
30
|
+
constraints: [],
|
|
31
|
+
expectedDeliverables: ["source code"],
|
|
32
|
+
metadata: {
|
|
33
|
+
skills: ["api-design"],
|
|
34
|
+
complexity,
|
|
35
|
+
domain: "generic",
|
|
36
|
+
scenario: "demo",
|
|
37
|
+
techStack: ["typescript"],
|
|
38
|
+
mutationLog: []
|
|
39
|
+
},
|
|
40
|
+
evaluationGuidance: {
|
|
41
|
+
keyDifferentiators: [],
|
|
42
|
+
commonPitfalls: [],
|
|
43
|
+
edgeCases: []
|
|
44
|
+
},
|
|
45
|
+
generatedBy: "test",
|
|
46
|
+
generatedAt: new Date().toISOString(),
|
|
47
|
+
selfReviewPassed: true
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
describe("ExecutionEngine", () => {
|
|
51
|
+
it("maps C1-C4 complexity to timeout and token budgets", () => {
|
|
52
|
+
expect(resolveExecutionBudget("C1")).toEqual({ timeoutMs: 30_000, maxTokens: 4_096 });
|
|
53
|
+
expect(resolveExecutionBudget("C2")).toEqual({ timeoutMs: 60_000, maxTokens: 8_192 });
|
|
54
|
+
expect(resolveExecutionBudget("C3")).toEqual({ timeoutMs: 120_000, maxTokens: 16_384 });
|
|
55
|
+
expect(resolveExecutionBudget("C4")).toEqual({ timeoutMs: 180_000, maxTokens: 32_768 });
|
|
56
|
+
});
|
|
57
|
+
it("falls back to fenced-code parsing when JSON parsing fails", () => {
|
|
58
|
+
const parsed = parseExecutionResponse("```ts\nexport const answer = 42;\n```");
|
|
59
|
+
expect(parsed.language).toBe("ts");
|
|
60
|
+
expect(parsed.code).toContain("answer = 42");
|
|
61
|
+
});
|
|
62
|
+
it("parses fenced-code blocks with CRLF newlines", () => {
|
|
63
|
+
const parsed = parseExecutionResponse("```ts\r\nexport const answer = 42;\r\n```");
|
|
64
|
+
expect(parsed.language).toBe("ts");
|
|
65
|
+
expect(parsed.code).toContain("answer = 42");
|
|
66
|
+
});
|
|
67
|
+
it("uses requirement complexity budget during execute", async () => {
|
|
68
|
+
const provider = new StubProvider();
|
|
69
|
+
const engine = new ExecutionEngine();
|
|
70
|
+
const requirement = makeRequirement("C4");
|
|
71
|
+
const result = await engine.execute(requirement, { provider: "openai", model: "gpt-4o-mini" }, { provider });
|
|
72
|
+
expect(result.timeoutMs).toBe(180_000);
|
|
73
|
+
expect(result.maxTokens).toBe(32_768);
|
|
74
|
+
expect(result.code).toContain("run = () => 'ok'");
|
|
75
|
+
expect(provider.callCount).toBe(1);
|
|
76
|
+
});
|
|
77
|
+
it("still allows deterministic raw response override", async () => {
|
|
78
|
+
const provider = new StubProvider();
|
|
79
|
+
const engine = new ExecutionEngine();
|
|
80
|
+
const requirement = makeRequirement("C2");
|
|
81
|
+
const result = await engine.execute(requirement, { provider: "openai", model: "gpt-4o-mini" }, { provider, rawResponse: "```ts\nexport const answer = 42;\n```" });
|
|
82
|
+
expect(result.code).toContain("answer = 42");
|
|
83
|
+
expect(provider.callCount).toBe(0);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=execution-engine.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution-engine.test.js","sourceRoot":"","sources":["../src/execution-engine.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAGxG,MAAM,YAAY;IAChB,EAAE,GAAG,MAAM,CAAC;IACZ,IAAI,GAAG,MAAM,CAAC;IACd,SAAS,GAAG,CAAC,CAAC;IAEd,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;QACpB,OAAO;YACL,OAAO,EAAE,4CAA4C;YACrD,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE;YACjD,SAAS,EAAE,EAAE;SACd,CAAC;IACJ,CAAC;CACF;AAED,SAAS,eAAe,CAAC,UAAqC;IAC5D,OAAO;QACL,EAAE,EAAE,OAAO;QACX,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,MAAM;QACnB,sBAAsB,EAAE;YACtB;gBACE,EAAE,EAAE,MAAM;gBACV,WAAW,EAAE,SAAS;gBACtB,kBAAkB,EAAE,OAAO;gBAC3B,QAAQ,EAAE,MAAM;aACjB;SACF;QACD,WAAW,EAAE,EAAE;QACf,oBAAoB,EAAE,CAAC,aAAa,CAAC;QACrC,QAAQ,EAAE;YACR,MAAM,EAAE,CAAC,YAAY,CAAC;YACtB,UAAU;YACV,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,MAAM;YAChB,SAAS,EAAE,CAAC,YAAY,CAAC;YACzB,WAAW,EAAE,EAAE;SAChB;QACD,kBAAkB,EAAE;YAClB,kBAAkB,EAAE,EAAE;YACtB,cAAc,EAAE,EAAE;YAClB,SAAS,EAAE,EAAE;SACd;QACD,WAAW,EAAE,MAAM;QACnB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,gBAAgB,EAAE,IAAI;KACvB,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QACtF,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QACtF,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QACxF,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,MAAM,GAAG,sBAAsB,CAAC,uCAAuC,CAAC,CAAC;QAE/E,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,MAAM,GAAG,sBAAsB,CAAC,2CAA2C,CAAC,CAAC;QAEnF,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QAE1C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE7G,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAClD,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QAE1C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CACjC,WAAW,EACX,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,EAC5C,EAAE,QAAQ,EAAE,WAAW,EAAE,uCAAuC,EAAE,CACnE,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC7C,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { LeaderboardEntry, LeaderboardQuery, NonceResponse, SubmissionRequest, SubmissionResponse } from "./submitter-types.js";
|
|
2
|
+
export interface HubClient {
|
|
3
|
+
requestNonce(): Promise<NonceResponse>;
|
|
4
|
+
submit(payload: SubmissionRequest): Promise<SubmissionResponse>;
|
|
5
|
+
getLeaderboard(query: LeaderboardQuery): Promise<LeaderboardEntry[]>;
|
|
6
|
+
submitCalibration(payload: {
|
|
7
|
+
recommendedComplexity: "C1" | "C2" | "C3" | "C4";
|
|
8
|
+
reason: string;
|
|
9
|
+
averageScore: number;
|
|
10
|
+
sampleSize: number;
|
|
11
|
+
source?: string;
|
|
12
|
+
}): Promise<{
|
|
13
|
+
ok: boolean;
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
16
|
+
export interface HubClientOptions {
|
|
17
|
+
serverUrl?: string;
|
|
18
|
+
token?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function createHubClient(options?: HubClientOptions): HubClient;
|
|
21
|
+
//# sourceMappingURL=hub-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub-client.d.ts","sourceRoot":"","sources":["../src/hub-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAGhI,MAAM,WAAW,SAAS;IACxB,YAAY,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IACvC,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAChE,cAAc,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACrE,iBAAiB,CAAC,OAAO,EAAE;QACzB,qBAAqB,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;QACjD,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAkHD,wBAAgB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,SAAS,CASzE"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { parseLeaderboardQuery } from "./leaderboard-query.js";
|
|
2
|
+
class PlaceholderHubClient {
|
|
3
|
+
async requestNonce() {
|
|
4
|
+
return {
|
|
5
|
+
nonce: "placeholder-nonce",
|
|
6
|
+
expiresAt: new Date(Date.now() + 2 * 60 * 60 * 1000).toISOString()
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
async submit(payload) {
|
|
10
|
+
return {
|
|
11
|
+
status: "pending",
|
|
12
|
+
message: `Submit pending for ${payload.runId}`
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
async getLeaderboard(query) {
|
|
16
|
+
const normalizedQuery = parseLeaderboardQuery(query);
|
|
17
|
+
const { limit, offset, sort } = normalizedQuery;
|
|
18
|
+
const base = Array.from({ length: 5 }).map((_, index) => ({
|
|
19
|
+
rank: index + 1,
|
|
20
|
+
model: `placeholder/model-${index + 1}`,
|
|
21
|
+
score: 95 - index
|
|
22
|
+
}));
|
|
23
|
+
const ordered = sort === "asc" ? base.slice().reverse() : base;
|
|
24
|
+
return ordered.slice(offset, offset + limit).map((entry, index) => ({
|
|
25
|
+
...entry,
|
|
26
|
+
rank: offset + index + 1
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
async submitCalibration() {
|
|
30
|
+
return { ok: false };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
class HttpHubClient {
|
|
34
|
+
baseUrl;
|
|
35
|
+
token;
|
|
36
|
+
constructor(serverUrl, token) {
|
|
37
|
+
this.baseUrl = serverUrl.replace(/\/+$/, "");
|
|
38
|
+
this.token = token;
|
|
39
|
+
}
|
|
40
|
+
headers() {
|
|
41
|
+
return {
|
|
42
|
+
"content-type": "application/json",
|
|
43
|
+
Authorization: `Bearer ${this.token}`
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
async requestJson(path, init) {
|
|
47
|
+
const response = await fetch(`${this.baseUrl}${path}`, {
|
|
48
|
+
...init,
|
|
49
|
+
headers: {
|
|
50
|
+
...this.headers(),
|
|
51
|
+
...init?.headers
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
if (!response.ok) {
|
|
55
|
+
throw new Error(`Hub request failed: ${response.status}`);
|
|
56
|
+
}
|
|
57
|
+
return (await response.json());
|
|
58
|
+
}
|
|
59
|
+
async requestNonce() {
|
|
60
|
+
return this.requestJson("/api/nonces", {
|
|
61
|
+
method: "POST",
|
|
62
|
+
body: JSON.stringify({})
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
async submit(payload) {
|
|
66
|
+
return this.requestJson("/api/submissions", {
|
|
67
|
+
method: "POST",
|
|
68
|
+
body: JSON.stringify(payload)
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
async getLeaderboard(query) {
|
|
72
|
+
const normalizedQuery = parseLeaderboardQuery(query);
|
|
73
|
+
const complexitySegment = encodeURIComponent(normalizedQuery.complexity ?? "all");
|
|
74
|
+
const dimensionSegment = normalizedQuery.dimension ? `/${encodeURIComponent(normalizedQuery.dimension)}` : "";
|
|
75
|
+
const params = new URLSearchParams({
|
|
76
|
+
limit: String(normalizedQuery.limit),
|
|
77
|
+
offset: String(normalizedQuery.offset),
|
|
78
|
+
sort: normalizedQuery.sort
|
|
79
|
+
});
|
|
80
|
+
return this.requestJson(`/api/leaderboard/${complexitySegment}${dimensionSegment}?${params.toString()}`, {
|
|
81
|
+
method: "GET"
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
async submitCalibration(payload) {
|
|
85
|
+
return this.requestJson("/api/calibration", {
|
|
86
|
+
method: "POST",
|
|
87
|
+
body: JSON.stringify(payload)
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export function createHubClient(options = {}) {
|
|
92
|
+
const serverUrl = options.serverUrl ?? process.env.R2R_HUB_SERVER_URL;
|
|
93
|
+
const token = options.token ?? process.env.R2R_HUB_TOKEN;
|
|
94
|
+
if (serverUrl && token) {
|
|
95
|
+
return new HttpHubClient(serverUrl, token);
|
|
96
|
+
}
|
|
97
|
+
return new PlaceholderHubClient();
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=hub-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub-client.js","sourceRoot":"","sources":["../src/hub-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub-client.test.d.ts","sourceRoot":"","sources":["../src/hub-client.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { createHubClient } from "./hub-client.js";
|
|
3
|
+
describe("HubClient placeholder", () => {
|
|
4
|
+
afterEach(() => {
|
|
5
|
+
vi.unstubAllGlobals();
|
|
6
|
+
});
|
|
7
|
+
it("returns nonce response", async () => {
|
|
8
|
+
const client = createHubClient();
|
|
9
|
+
const nonce = await client.requestNonce();
|
|
10
|
+
expect(nonce.nonce.length).toBeGreaterThan(0);
|
|
11
|
+
expect(nonce.expiresAt).toContain("T");
|
|
12
|
+
});
|
|
13
|
+
it("returns pending submit response", async () => {
|
|
14
|
+
const client = createHubClient();
|
|
15
|
+
const response = await client.submit({
|
|
16
|
+
runId: "run-1",
|
|
17
|
+
nonce: "nonce-1",
|
|
18
|
+
targetProvider: "openai",
|
|
19
|
+
targetModel: "gpt-4o-mini",
|
|
20
|
+
overallScore: 80,
|
|
21
|
+
submittedAt: new Date("2026-01-01T00:00:00.000Z").toISOString(),
|
|
22
|
+
evidenceChain: {
|
|
23
|
+
timeline: [
|
|
24
|
+
{
|
|
25
|
+
phase: "generate",
|
|
26
|
+
startedAt: "2026-01-01T00:00:00.000Z",
|
|
27
|
+
completedAt: "2026-01-01T00:00:01.000Z",
|
|
28
|
+
model: "system"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
samples: [
|
|
32
|
+
{
|
|
33
|
+
roundIndex: 0,
|
|
34
|
+
requirement: "demo",
|
|
35
|
+
codeSubmission: "export const ok = true;"
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
environment: {
|
|
39
|
+
os: "win32",
|
|
40
|
+
nodeVersion: "v22",
|
|
41
|
+
timezone: "UTC"
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
expect(response.status).toBe("pending");
|
|
46
|
+
expect(response.message).toContain("run-1");
|
|
47
|
+
});
|
|
48
|
+
it("returns leaderboard placeholder entries", async () => {
|
|
49
|
+
const client = createHubClient();
|
|
50
|
+
const entries = await client.getLeaderboard({
|
|
51
|
+
limit: 2,
|
|
52
|
+
offset: 1,
|
|
53
|
+
sort: "asc"
|
|
54
|
+
});
|
|
55
|
+
expect(entries).toHaveLength(2);
|
|
56
|
+
expect(entries[0].score).toBeLessThanOrEqual(entries[1].score);
|
|
57
|
+
});
|
|
58
|
+
it("uses HTTP hub API when serverUrl and token are provided", async () => {
|
|
59
|
+
const fetchMock = vi.fn(async (input, init) => {
|
|
60
|
+
if (input.endsWith("/api/nonces")) {
|
|
61
|
+
expect(init?.headers).toMatchObject({
|
|
62
|
+
Authorization: "Bearer token-1"
|
|
63
|
+
});
|
|
64
|
+
return new Response(JSON.stringify({ nonce: "nonce-http", expiresAt: "2026-01-01T00:00:00.000Z" }), {
|
|
65
|
+
status: 200,
|
|
66
|
+
headers: { "content-type": "application/json" }
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
if (input.endsWith("/api/submissions")) {
|
|
70
|
+
return new Response(JSON.stringify({ status: "accepted", message: "submitted" }), {
|
|
71
|
+
status: 200,
|
|
72
|
+
headers: { "content-type": "application/json" }
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
if (input.includes("/api/leaderboard/")) {
|
|
76
|
+
return new Response(JSON.stringify([{ rank: 1, model: "openai/gpt-4o-mini", score: 92 }]), {
|
|
77
|
+
status: 200,
|
|
78
|
+
headers: { "content-type": "application/json" }
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
if (input.endsWith("/api/calibration")) {
|
|
82
|
+
return new Response(JSON.stringify({ ok: true }), {
|
|
83
|
+
status: 200,
|
|
84
|
+
headers: { "content-type": "application/json" }
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return new Response("not found", { status: 404 });
|
|
88
|
+
});
|
|
89
|
+
vi.stubGlobal("fetch", fetchMock);
|
|
90
|
+
const client = createHubClient({
|
|
91
|
+
serverUrl: "https://hub.example.com",
|
|
92
|
+
token: "token-1"
|
|
93
|
+
});
|
|
94
|
+
const nonce = await client.requestNonce();
|
|
95
|
+
expect(nonce.nonce).toBe("nonce-http");
|
|
96
|
+
const submit = await client.submit({
|
|
97
|
+
runId: "run-2",
|
|
98
|
+
nonce: "nonce-http",
|
|
99
|
+
targetProvider: "openai",
|
|
100
|
+
targetModel: "gpt-4o-mini",
|
|
101
|
+
overallScore: 90,
|
|
102
|
+
submittedAt: new Date("2026-01-01T00:00:00.000Z").toISOString(),
|
|
103
|
+
evidenceChain: {
|
|
104
|
+
timeline: [
|
|
105
|
+
{
|
|
106
|
+
phase: "generate",
|
|
107
|
+
startedAt: "2026-01-01T00:00:00.000Z",
|
|
108
|
+
completedAt: "2026-01-01T00:00:01.000Z",
|
|
109
|
+
model: "system"
|
|
110
|
+
}
|
|
111
|
+
],
|
|
112
|
+
samples: [{ roundIndex: 0, requirement: "demo", codeSubmission: "ok" }],
|
|
113
|
+
environment: { os: "win32", nodeVersion: "v22", timezone: "UTC" }
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
expect(submit.status).toBe("accepted");
|
|
117
|
+
const leaderboard = await client.getLeaderboard({ limit: 10, offset: 0, sort: "desc" });
|
|
118
|
+
expect(leaderboard[0]?.model).toBe("openai/gpt-4o-mini");
|
|
119
|
+
const calibration = await client.submitCalibration({
|
|
120
|
+
recommendedComplexity: "C2",
|
|
121
|
+
reason: "stable",
|
|
122
|
+
averageScore: 80,
|
|
123
|
+
sampleSize: 5,
|
|
124
|
+
source: "cli"
|
|
125
|
+
});
|
|
126
|
+
expect(calibration.ok).toBe(true);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
//# sourceMappingURL=hub-client.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub-client.test.js","sourceRoot":"","sources":["../src/hub-client.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export * from "./providers/index.js";
|
|
3
|
+
export * from "./requirement-generator.js";
|
|
4
|
+
export * from "./config.js";
|
|
5
|
+
export * from "./local-store.js";
|
|
6
|
+
export * from "./pipeline.js";
|
|
7
|
+
export * from "./execution-engine.js";
|
|
8
|
+
export * from "./evaluation-panel.js";
|
|
9
|
+
export * from "./scoring-engine.js";
|
|
10
|
+
export * from "./submitter-types.js";
|
|
11
|
+
export * from "./hub-client.js";
|
|
12
|
+
export * from "./evidence-chain.js";
|
|
13
|
+
export * from "./submit-payload-builder.js";
|
|
14
|
+
export * from "./leaderboard-query.js";
|
|
15
|
+
export * from "./adaptive-calibration.js";
|
|
16
|
+
export * from "./sandbox.js";
|
|
17
|
+
export * from "./checkpoint-key.js";
|
|
18
|
+
export * from "./domain-taxonomy.js";
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export * from "./providers/index.js";
|
|
3
|
+
export * from "./requirement-generator.js";
|
|
4
|
+
export * from "./config.js";
|
|
5
|
+
export * from "./local-store.js";
|
|
6
|
+
export * from "./pipeline.js";
|
|
7
|
+
export * from "./execution-engine.js";
|
|
8
|
+
export * from "./evaluation-panel.js";
|
|
9
|
+
export * from "./scoring-engine.js";
|
|
10
|
+
export * from "./submitter-types.js";
|
|
11
|
+
export * from "./hub-client.js";
|
|
12
|
+
export * from "./evidence-chain.js";
|
|
13
|
+
export * from "./submit-payload-builder.js";
|
|
14
|
+
export * from "./leaderboard-query.js";
|
|
15
|
+
export * from "./adaptive-calibration.js";
|
|
16
|
+
export * from "./sandbox.js";
|
|
17
|
+
export * from "./checkpoint-key.js";
|
|
18
|
+
export * from "./domain-taxonomy.js";
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { LeaderboardQuery } from "./submitter-types.js";
|
|
3
|
+
export declare const leaderboardQuerySchema: z.ZodObject<{
|
|
4
|
+
limit: z.ZodNumber;
|
|
5
|
+
offset: z.ZodNumber;
|
|
6
|
+
sort: z.ZodEnum<["asc", "desc"]>;
|
|
7
|
+
complexity: z.ZodOptional<z.ZodEnum<["C1", "C2", "C3", "C4", "mixed"]>>;
|
|
8
|
+
dimension: z.ZodOptional<z.ZodEnum<["functionalCompleteness", "codeQuality", "logicAccuracy", "security", "engineeringPractice"]>>;
|
|
9
|
+
}, "strip", z.ZodTypeAny, {
|
|
10
|
+
sort: "asc" | "desc";
|
|
11
|
+
limit: number;
|
|
12
|
+
offset: number;
|
|
13
|
+
complexity?: "C1" | "C2" | "C3" | "C4" | "mixed" | undefined;
|
|
14
|
+
dimension?: "functionalCompleteness" | "codeQuality" | "logicAccuracy" | "security" | "engineeringPractice" | undefined;
|
|
15
|
+
}, {
|
|
16
|
+
sort: "asc" | "desc";
|
|
17
|
+
limit: number;
|
|
18
|
+
offset: number;
|
|
19
|
+
complexity?: "C1" | "C2" | "C3" | "C4" | "mixed" | undefined;
|
|
20
|
+
dimension?: "functionalCompleteness" | "codeQuality" | "logicAccuracy" | "security" | "engineeringPractice" | undefined;
|
|
21
|
+
}>;
|
|
22
|
+
export type LeaderboardQueryNormalized = z.infer<typeof leaderboardQuerySchema>;
|
|
23
|
+
export interface LeaderboardQueryFieldLabels {
|
|
24
|
+
limit: string;
|
|
25
|
+
offset: string;
|
|
26
|
+
sort: string;
|
|
27
|
+
}
|
|
28
|
+
export declare function parseLeaderboardQuery(input: LeaderboardQuery, labels?: LeaderboardQueryFieldLabels): LeaderboardQueryNormalized;
|
|
29
|
+
//# sourceMappingURL=leaderboard-query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaderboard-query.d.ts","sourceRoot":"","sources":["../src/leaderboard-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;EAQjC,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEhF,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AA+BD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,gBAAgB,EACvB,MAAM,GAAE,2BAA4C,GACnD,0BAA0B,CAkC5B"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const leaderboardQuerySchema = z.object({
|
|
3
|
+
limit: z.number().int().positive(),
|
|
4
|
+
offset: z.number().int().nonnegative(),
|
|
5
|
+
sort: z.enum(["asc", "desc"]),
|
|
6
|
+
complexity: z.enum(["C1", "C2", "C3", "C4", "mixed"]).optional(),
|
|
7
|
+
dimension: z
|
|
8
|
+
.enum(["functionalCompleteness", "codeQuality", "logicAccuracy", "security", "engineeringPractice"])
|
|
9
|
+
.optional()
|
|
10
|
+
});
|
|
11
|
+
const DEFAULT_LABELS = {
|
|
12
|
+
limit: "limit",
|
|
13
|
+
offset: "offset",
|
|
14
|
+
sort: "sort"
|
|
15
|
+
};
|
|
16
|
+
function parseIntegerField(value, defaultValue, label) {
|
|
17
|
+
if (value === undefined) {
|
|
18
|
+
return defaultValue;
|
|
19
|
+
}
|
|
20
|
+
if (typeof value === "number") {
|
|
21
|
+
if (!Number.isInteger(value)) {
|
|
22
|
+
throw new Error(`Invalid ${label} value: ${value}`);
|
|
23
|
+
}
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
if (!/^-?\d+$/.test(value)) {
|
|
27
|
+
throw new Error(`Invalid ${label} value: ${value}`);
|
|
28
|
+
}
|
|
29
|
+
return Number.parseInt(value, 10);
|
|
30
|
+
}
|
|
31
|
+
export function parseLeaderboardQuery(input, labels = DEFAULT_LABELS) {
|
|
32
|
+
const limit = parseIntegerField(input.limit, 10, labels.limit);
|
|
33
|
+
const offset = parseIntegerField(input.offset, 0, labels.offset);
|
|
34
|
+
const sort = input.sort ?? "desc";
|
|
35
|
+
const complexity = input.complexity;
|
|
36
|
+
const dimension = input.dimension;
|
|
37
|
+
if (limit <= 0) {
|
|
38
|
+
throw new Error(`${labels.limit} must be a positive integer`);
|
|
39
|
+
}
|
|
40
|
+
if (offset < 0) {
|
|
41
|
+
throw new Error(`${labels.offset} must be a non-negative integer`);
|
|
42
|
+
}
|
|
43
|
+
if (sort !== "asc" && sort !== "desc") {
|
|
44
|
+
throw new Error(`Invalid ${labels.sort} value: ${sort}`);
|
|
45
|
+
}
|
|
46
|
+
if (complexity !== undefined && complexity !== "C1" && complexity !== "C2" && complexity !== "C3" && complexity !== "C4" && complexity !== "mixed") {
|
|
47
|
+
throw new Error(`Invalid complexity value: ${complexity}`);
|
|
48
|
+
}
|
|
49
|
+
if (dimension !== undefined &&
|
|
50
|
+
dimension !== "functionalCompleteness" &&
|
|
51
|
+
dimension !== "codeQuality" &&
|
|
52
|
+
dimension !== "logicAccuracy" &&
|
|
53
|
+
dimension !== "security" &&
|
|
54
|
+
dimension !== "engineeringPractice") {
|
|
55
|
+
throw new Error(`Invalid dimension value: ${dimension}`);
|
|
56
|
+
}
|
|
57
|
+
return leaderboardQuerySchema.parse({ limit, offset, sort, complexity, dimension });
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=leaderboard-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaderboard-query.js","sourceRoot":"","sources":["../src/leaderboard-query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaderboard-query.test.d.ts","sourceRoot":"","sources":["../src/leaderboard-query.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { parseLeaderboardQuery } from "./leaderboard-query.js";
|
|
3
|
+
describe("parseLeaderboardQuery", () => {
|
|
4
|
+
it("applies defaults for empty input", () => {
|
|
5
|
+
const query = parseLeaderboardQuery({});
|
|
6
|
+
expect(query).toEqual({ limit: 10, offset: 0, sort: "desc" });
|
|
7
|
+
});
|
|
8
|
+
it("normalizes numeric strings", () => {
|
|
9
|
+
const query = parseLeaderboardQuery({
|
|
10
|
+
limit: "2",
|
|
11
|
+
offset: "1",
|
|
12
|
+
sort: "asc",
|
|
13
|
+
complexity: "C3",
|
|
14
|
+
dimension: "security"
|
|
15
|
+
});
|
|
16
|
+
expect(query).toEqual({ limit: 2, offset: 1, sort: "asc", complexity: "C3", dimension: "security" });
|
|
17
|
+
});
|
|
18
|
+
it("throws labeled errors for invalid values", () => {
|
|
19
|
+
expect(() => parseLeaderboardQuery({ limit: "2x" }, {
|
|
20
|
+
limit: "--limit",
|
|
21
|
+
offset: "--offset",
|
|
22
|
+
sort: "--sort"
|
|
23
|
+
})).toThrow("Invalid --limit value: 2x");
|
|
24
|
+
});
|
|
25
|
+
it("enforces limit and offset boundaries", () => {
|
|
26
|
+
expect(() => parseLeaderboardQuery({ limit: 0 })).toThrow("limit must be a positive integer");
|
|
27
|
+
expect(() => parseLeaderboardQuery({ offset: -1 })).toThrow("offset must be a non-negative integer");
|
|
28
|
+
});
|
|
29
|
+
it("rejects invalid complexity and dimension", () => {
|
|
30
|
+
expect(() => parseLeaderboardQuery({ complexity: "C9" })).toThrow("Invalid complexity value: C9");
|
|
31
|
+
expect(() => parseLeaderboardQuery({ dimension: "unknown" })).toThrow("Invalid dimension value: unknown");
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=leaderboard-query.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leaderboard-query.test.js","sourceRoot":"","sources":["../src/leaderboard-query.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,KAAK,GAAG,qBAAqB,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,KAAK,GAAG,qBAAqB,CAAC;YAClC,KAAK,EAAE,GAAG;YACV,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,KAAK;YACX,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,UAAU;SACtB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;IACvG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,GAAG,EAAE,CACV,qBAAqB,CACnB,EAAE,KAAK,EAAE,IAAI,EAAE,EACf;YACE,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,UAAU;YAClB,IAAI,EAAE,QAAQ;SACf,CACF,CACF,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;QAC9F,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;IACvG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;QAClG,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;IAC5G,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { CalibrationSnapshot, LocalStoreShape, RunRecord } from "./config.js";
|
|
2
|
+
export declare class LocalStore {
|
|
3
|
+
private readonly filePath;
|
|
4
|
+
private db?;
|
|
5
|
+
constructor(filePath: string);
|
|
6
|
+
private getDb;
|
|
7
|
+
private ensureColumns;
|
|
8
|
+
private mapRun;
|
|
9
|
+
private parseJson;
|
|
10
|
+
close(): void;
|
|
11
|
+
read(): Promise<LocalStoreShape>;
|
|
12
|
+
appendRun(run: RunRecord): Promise<void>;
|
|
13
|
+
listRuns(): Promise<RunRecord[]>;
|
|
14
|
+
findRunById(runId: string): Promise<RunRecord | undefined>;
|
|
15
|
+
appendCalibration(snapshot: CalibrationSnapshot): Promise<void>;
|
|
16
|
+
listCalibrations(): Promise<CalibrationSnapshot[]>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=local-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-store.d.ts","sourceRoot":"","sources":["../src/local-store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE9E,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,EAAE,CAAC,CAAoB;gBAEnB,QAAQ,EAAE,MAAM;YAId,KAAK;IAqCnB,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,MAAM;IAgCd,OAAO,CAAC,SAAS;IAQjB,KAAK,IAAI,IAAI;IAOP,IAAI,IAAI,OAAO,CAAC,eAAe,CAAC;IAMhC,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAoCxC,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAiBhC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC;IAiB1D,iBAAiB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB/D,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;CAezD"}
|