@deepthonk/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +293 -0
- package/dist/artifacts.d.ts +36 -0
- package/dist/artifacts.js +211 -0
- package/dist/artifacts.js.map +1 -0
- package/dist/bradleyTerry.d.ts +2 -0
- package/dist/bradleyTerry.js +204 -0
- package/dist/bradleyTerry.js.map +1 -0
- package/dist/budget.d.ts +14 -0
- package/dist/budget.js +41 -0
- package/dist/budget.js.map +1 -0
- package/dist/budgetTracker.d.ts +16 -0
- package/dist/budgetTracker.js +137 -0
- package/dist/budgetTracker.js.map +1 -0
- package/dist/critique.d.ts +2 -0
- package/dist/critique.js +52 -0
- package/dist/critique.js.map +1 -0
- package/dist/errors.d.ts +24 -0
- package/dist/errors.js +27 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/json.d.ts +1 -0
- package/dist/json.js +28 -0
- package/dist/json.js.map +1 -0
- package/dist/lifecycle.d.ts +63 -0
- package/dist/lifecycle.js +45 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/pairScheduler.d.ts +6 -0
- package/dist/pairScheduler.js +79 -0
- package/dist/pairScheduler.js.map +1 -0
- package/dist/prompts.d.ts +15 -0
- package/dist/prompts.js +200 -0
- package/dist/prompts.js.map +1 -0
- package/dist/rng.d.ts +8 -0
- package/dist/rng.js +31 -0
- package/dist/rng.js.map +1 -0
- package/dist/runner.d.ts +11 -0
- package/dist/runner.js +518 -0
- package/dist/runner.js.map +1 -0
- package/dist/schemas.d.ts +648 -0
- package/dist/schemas.js +119 -0
- package/dist/schemas.js.map +1 -0
- package/dist/services.d.ts +40 -0
- package/dist/services.js +104 -0
- package/dist/services.js.map +1 -0
- package/dist/traceStore.d.ts +22 -0
- package/dist/traceStore.js +105 -0
- package/dist/traceStore.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export type RunLifecycleState = "pending" | "running" | "completed" | "failed" | "cancelled" | "budget_exceeded";
|
|
2
|
+
export interface BudgetUsage {
|
|
3
|
+
calls: number;
|
|
4
|
+
inputTokens: number;
|
|
5
|
+
inputCacheHitTokens?: number;
|
|
6
|
+
inputCacheMissTokens?: number;
|
|
7
|
+
outputTokens: number;
|
|
8
|
+
totalTokens: number;
|
|
9
|
+
usd?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface RunStatus {
|
|
12
|
+
job_id?: string;
|
|
13
|
+
run_id?: string;
|
|
14
|
+
run_dir: string;
|
|
15
|
+
state: RunLifecycleState;
|
|
16
|
+
phase: string;
|
|
17
|
+
generation?: number | "final";
|
|
18
|
+
usage: BudgetUsage;
|
|
19
|
+
started_at?: string;
|
|
20
|
+
updated_at: string;
|
|
21
|
+
completed_at?: string;
|
|
22
|
+
worker_pid?: number;
|
|
23
|
+
error?: {
|
|
24
|
+
code: string;
|
|
25
|
+
message: string;
|
|
26
|
+
retryable: boolean;
|
|
27
|
+
fix?: string;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export declare function claimRunLock(runDir: string, jobId?: string): Promise<boolean>;
|
|
31
|
+
export declare function readRunStatus(runDir: string): Promise<RunStatus | undefined>;
|
|
32
|
+
export declare function requestRunCancel(runDir: string): Promise<void>;
|
|
33
|
+
export declare function isRunCancelRequested(runDir: string): Promise<boolean>;
|
|
34
|
+
export declare function emptyUsage(): BudgetUsage;
|
|
35
|
+
export interface UsageDelta {
|
|
36
|
+
calls: number;
|
|
37
|
+
inputTokens: number;
|
|
38
|
+
inputCacheHitTokens?: number;
|
|
39
|
+
inputCacheMissTokens?: number;
|
|
40
|
+
outputTokens: number;
|
|
41
|
+
totalTokens: number;
|
|
42
|
+
inputUsd?: number;
|
|
43
|
+
outputUsd?: number;
|
|
44
|
+
usd?: number;
|
|
45
|
+
}
|
|
46
|
+
export type CallRole = "generator" | "judge" | "mutator" | "finalizer";
|
|
47
|
+
export interface UsageRecord {
|
|
48
|
+
ts: string;
|
|
49
|
+
phase: string;
|
|
50
|
+
role: CallRole;
|
|
51
|
+
provider?: string;
|
|
52
|
+
model?: string;
|
|
53
|
+
input_tokens: number;
|
|
54
|
+
input_cache_hit_tokens?: number;
|
|
55
|
+
input_cache_miss_tokens?: number;
|
|
56
|
+
output_tokens: number;
|
|
57
|
+
total_tokens: number;
|
|
58
|
+
input_usd?: number;
|
|
59
|
+
output_usd?: number;
|
|
60
|
+
total_usd?: number;
|
|
61
|
+
latency_ms?: number;
|
|
62
|
+
retry_count?: number;
|
|
63
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { runArtifactFiles } from "./artifacts.js";
|
|
4
|
+
import { ConfigError } from "./errors.js";
|
|
5
|
+
export async function claimRunLock(runDir, jobId) {
|
|
6
|
+
await mkdir(runDir, { recursive: true });
|
|
7
|
+
try {
|
|
8
|
+
await writeFile(join(runDir, runArtifactFiles.lock), `${JSON.stringify({ job_id: jobId, worker_pid: process.pid, claimed_at: new Date().toISOString() }, null, 2)}\n`, { encoding: "utf8", flag: "wx" });
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
if (error.code === "EEXIST")
|
|
13
|
+
return false;
|
|
14
|
+
throw new ConfigError(`Could not claim run directory lock: ${error.message}`, {
|
|
15
|
+
code: "run.lock_failed",
|
|
16
|
+
retryable: false,
|
|
17
|
+
fix: "Choose a writable run directory."
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export async function readRunStatus(runDir) {
|
|
22
|
+
try {
|
|
23
|
+
return JSON.parse(await readFile(join(runDir, runArtifactFiles.status), "utf8"));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export async function requestRunCancel(runDir) {
|
|
30
|
+
await mkdir(runDir, { recursive: true });
|
|
31
|
+
await writeFile(join(runDir, runArtifactFiles.cancel), `${JSON.stringify({ requested_at: new Date().toISOString() }, null, 2)}\n`, "utf8");
|
|
32
|
+
}
|
|
33
|
+
export async function isRunCancelRequested(runDir) {
|
|
34
|
+
try {
|
|
35
|
+
await readFile(join(runDir, runArtifactFiles.cancel), "utf8");
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export function emptyUsage() {
|
|
43
|
+
return { calls: 0, inputTokens: 0, outputTokens: 0, totalTokens: 0 };
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAkC1C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAc,EAAE,KAAc;IAC/D,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,SAAS,CACb,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,IAAI,CAAC,EACnC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAChH,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CACjC,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACrE,MAAM,IAAI,WAAW,CAAC,uCAAwC,KAAe,CAAC,OAAO,EAAE,EAAE;YACvF,IAAI,EAAE,iBAAiB;YACvB,SAAS,EAAE,KAAK;YAChB,GAAG,EAAE,kCAAkC;SACxC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAc;IAChD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAc,CAAC;IAChG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAc;IACnD,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC7I,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAc;IACvD,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { ConfigError } from "./errors.js";
|
|
2
|
+
export function makeKRegularPairs(candidateIds, k, rng) {
|
|
3
|
+
const ids = [...candidateIds];
|
|
4
|
+
const n = ids.length;
|
|
5
|
+
if (n < 2)
|
|
6
|
+
throw new ConfigError("Pair scheduling requires at least two candidates.");
|
|
7
|
+
if (k >= n)
|
|
8
|
+
throw new ConfigError(`Invalid pair schedule: k (${k}) must be less than n (${n}).`);
|
|
9
|
+
if ((n * k) % 2 !== 0) {
|
|
10
|
+
throw new ConfigError(`Invalid pair schedule: n * k must be even, got ${n} * ${k}.`);
|
|
11
|
+
}
|
|
12
|
+
for (let attempt = 0; attempt < 300; attempt += 1) {
|
|
13
|
+
const stubs = rng.shuffle(ids.flatMap((id) => Array.from({ length: k }, () => id)));
|
|
14
|
+
const pairs = [];
|
|
15
|
+
const seen = new Set();
|
|
16
|
+
let ok = true;
|
|
17
|
+
for (let i = 0; i < stubs.length; i += 2) {
|
|
18
|
+
const a = stubs[i];
|
|
19
|
+
const b = stubs[i + 1];
|
|
20
|
+
const key = unorderedKey(a, b);
|
|
21
|
+
if (a === b || seen.has(key)) {
|
|
22
|
+
ok = false;
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
seen.add(key);
|
|
26
|
+
pairs.push({ a, b });
|
|
27
|
+
}
|
|
28
|
+
if (ok && hasDegree(ids, pairs, k))
|
|
29
|
+
return pairs;
|
|
30
|
+
}
|
|
31
|
+
return greedyKRegular(ids, k, rng);
|
|
32
|
+
}
|
|
33
|
+
function greedyKRegular(ids, k, rng) {
|
|
34
|
+
const remaining = new Map(ids.map((id) => [id, k]));
|
|
35
|
+
const pairs = [];
|
|
36
|
+
const seen = new Set();
|
|
37
|
+
while ([...remaining.values()].some((degree) => degree > 0)) {
|
|
38
|
+
const available = [...remaining.entries()]
|
|
39
|
+
.filter(([, degree]) => degree > 0)
|
|
40
|
+
.sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]));
|
|
41
|
+
const a = available[0]?.[0];
|
|
42
|
+
if (!a)
|
|
43
|
+
break;
|
|
44
|
+
const candidates = rng.shuffle(available.slice(1).map(([id]) => id)).sort((left, right) => {
|
|
45
|
+
return (remaining.get(right) ?? 0) - (remaining.get(left) ?? 0) || left.localeCompare(right);
|
|
46
|
+
});
|
|
47
|
+
const b = candidates.find((id) => id !== a && !seen.has(unorderedKey(a, id)));
|
|
48
|
+
if (!b) {
|
|
49
|
+
throw new ConfigError(`Could not construct ${k}-regular pair schedule for ${ids.length} candidates.`);
|
|
50
|
+
}
|
|
51
|
+
seen.add(unorderedKey(a, b));
|
|
52
|
+
remaining.set(a, (remaining.get(a) ?? 0) - 1);
|
|
53
|
+
remaining.set(b, (remaining.get(b) ?? 0) - 1);
|
|
54
|
+
pairs.push({ a, b });
|
|
55
|
+
}
|
|
56
|
+
if (!hasDegree(ids, pairs, k)) {
|
|
57
|
+
throw new ConfigError(`Could not construct ${k}-regular pair schedule for ${ids.length} candidates.`);
|
|
58
|
+
}
|
|
59
|
+
return pairs;
|
|
60
|
+
}
|
|
61
|
+
function unorderedKey(a, b) {
|
|
62
|
+
return a < b ? `${a}::${b}` : `${b}::${a}`;
|
|
63
|
+
}
|
|
64
|
+
function hasDegree(ids, pairs, k) {
|
|
65
|
+
const degrees = new Map(ids.map((id) => [id, 0]));
|
|
66
|
+
const seen = new Set();
|
|
67
|
+
for (const pair of pairs) {
|
|
68
|
+
if (pair.a === pair.b)
|
|
69
|
+
return false;
|
|
70
|
+
const key = unorderedKey(pair.a, pair.b);
|
|
71
|
+
if (seen.has(key))
|
|
72
|
+
return false;
|
|
73
|
+
seen.add(key);
|
|
74
|
+
degrees.set(pair.a, (degrees.get(pair.a) ?? 0) + 1);
|
|
75
|
+
degrees.set(pair.b, (degrees.get(pair.b) ?? 0) + 1);
|
|
76
|
+
}
|
|
77
|
+
return [...degrees.values()].every((degree) => degree === k);
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=pairScheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pairScheduler.js","sourceRoot":"","sources":["../src/pairScheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Candidate, PromptMessages, PromptOverride } from "./schemas.js";
|
|
2
|
+
export type PromptStyle = "general" | "paper-programming";
|
|
3
|
+
export type PromptPhase = "generate" | "compare" | "mutate" | "finalize";
|
|
4
|
+
export declare const PHASE_VARIABLES: Record<PromptPhase, readonly string[]>;
|
|
5
|
+
interface PhaseTemplate {
|
|
6
|
+
system: string;
|
|
7
|
+
user: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function builtInPrompt(phase: PromptPhase, style: PromptStyle): PhaseTemplate;
|
|
10
|
+
export declare function validatePromptTemplate(template: string, phase: PromptPhase): void;
|
|
11
|
+
export declare function generatePrompt(task: string, rubric?: string, style?: PromptStyle, override?: PromptOverride): PromptMessages;
|
|
12
|
+
export declare function comparePrompt(task: string, candidateA: Candidate, candidateB: Candidate, rubric?: string, style?: PromptStyle, override?: PromptOverride): PromptMessages;
|
|
13
|
+
export declare function mutatePrompt(task: string, candidate: Candidate, critique: string, rubric?: string, style?: PromptStyle, override?: PromptOverride): PromptMessages;
|
|
14
|
+
export declare function finalizePrompt(task: string, candidate: Candidate, rubric?: string, style?: PromptStyle, override?: PromptOverride): PromptMessages;
|
|
15
|
+
export {};
|
package/dist/prompts.js
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { ConfigError } from "./errors.js";
|
|
2
|
+
const defaultRubric = "Prefer answers that are correct, complete, robust, verifiable, and directly aligned with the task.";
|
|
3
|
+
const codeRubric = "The solution should be correct, efficient, and accepted under standard competitive-programming constraints.";
|
|
4
|
+
const codeJudgeRubric = "Judge correctness, edge cases, algorithmic complexity, and implementation robustness.";
|
|
5
|
+
export const PHASE_VARIABLES = {
|
|
6
|
+
generate: ["task", "rubric"],
|
|
7
|
+
compare: ["task", "rubric", "candidateA", "candidateB"],
|
|
8
|
+
mutate: ["task", "rubric", "candidate", "critique"],
|
|
9
|
+
finalize: ["task", "rubric", "candidate"]
|
|
10
|
+
};
|
|
11
|
+
const TEMPLATES = {
|
|
12
|
+
general: {
|
|
13
|
+
generate: {
|
|
14
|
+
system: "You are an expert solver. Produce the best answer you can.\nDo not include hidden chain-of-thought. You may include concise justification only when useful.\nReturn the final answer/artifact directly.",
|
|
15
|
+
user: "TASK:\n{task}\n\nRUBRIC:\n{rubric}\n\nProduce one complete candidate answer."
|
|
16
|
+
},
|
|
17
|
+
compare: {
|
|
18
|
+
system: "",
|
|
19
|
+
user: `You are a strict pairwise judge. Compare two candidate answers for the given task.
|
|
20
|
+
Select the candidate more likely to be correct, complete, robust, and aligned with the rubric.
|
|
21
|
+
Declare a tie only when neither candidate is clearly better. Do not rely on position.
|
|
22
|
+
Do not give hidden chain-of-thought. Return strict JSON only.
|
|
23
|
+
|
|
24
|
+
TASK:
|
|
25
|
+
{task}
|
|
26
|
+
|
|
27
|
+
RUBRIC:
|
|
28
|
+
{rubric}
|
|
29
|
+
|
|
30
|
+
SOLUTION A:
|
|
31
|
+
{candidateA}
|
|
32
|
+
|
|
33
|
+
SOLUTION B:
|
|
34
|
+
{candidateB}
|
|
35
|
+
|
|
36
|
+
Return JSON with exactly this shape:
|
|
37
|
+
{{
|
|
38
|
+
"feedback_a": "specific feedback for Solution A",
|
|
39
|
+
"feedback_b": "specific feedback for Solution B",
|
|
40
|
+
"winner": "A" | "B" | "tie"
|
|
41
|
+
}}`
|
|
42
|
+
},
|
|
43
|
+
mutate: {
|
|
44
|
+
system: "You are an expert solver improving a candidate answer using critique from pairwise comparisons.\nYou may either refine the current approach or abandon it and produce a fundamentally different solution.\nDo not include hidden chain-of-thought. Return the complete improved candidate answer.",
|
|
45
|
+
user: "TASK:\n{task}\n\nRUBRIC:\n{rubric}\n\nCURRENT CANDIDATE:\n{candidate}\n\nAGGREGATED CRITIQUE:\n{critique}\n\nProduce one complete improved candidate answer."
|
|
46
|
+
},
|
|
47
|
+
finalize: {
|
|
48
|
+
system: "You are preparing the winning candidate for final delivery.\nPreserve correctness. Remove obvious duplication. Do not add unsupported claims.\nReturn the final answer only.",
|
|
49
|
+
user: "TASK:\n{task}\n\nRUBRIC:\n{rubric}\n\nWINNING CANDIDATE:\n{candidate}"
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"paper-programming": {
|
|
53
|
+
generate: {
|
|
54
|
+
system: "",
|
|
55
|
+
user: `You are an expert competitive programmer. Solve the programming problem below.
|
|
56
|
+
Provide a brief explanation, then provide a complete accepted C++17 solution in one code block.
|
|
57
|
+
Do not include hidden chain-of-thought.
|
|
58
|
+
|
|
59
|
+
PROBLEM:
|
|
60
|
+
{task}
|
|
61
|
+
|
|
62
|
+
RUBRIC:
|
|
63
|
+
{rubric}`
|
|
64
|
+
},
|
|
65
|
+
compare: {
|
|
66
|
+
system: "",
|
|
67
|
+
user: `You are judging two proposed competitive-programming solutions.
|
|
68
|
+
Prefer the solution more likely to receive an Accepted verdict. If both are wrong, choose the one requiring fewer modifications to become accepted. Declare a tie only when neither is clearly better.
|
|
69
|
+
Do not give hidden chain-of-thought. Return strict JSON only.
|
|
70
|
+
|
|
71
|
+
PROBLEM:
|
|
72
|
+
{task}
|
|
73
|
+
|
|
74
|
+
RUBRIC:
|
|
75
|
+
{rubric}
|
|
76
|
+
|
|
77
|
+
SOLUTION A:
|
|
78
|
+
{candidateA}
|
|
79
|
+
|
|
80
|
+
SOLUTION B:
|
|
81
|
+
{candidateB}
|
|
82
|
+
|
|
83
|
+
Return JSON with exactly this shape:
|
|
84
|
+
{{
|
|
85
|
+
"feedback_a": "specific feedback for Solution A",
|
|
86
|
+
"feedback_b": "specific feedback for Solution B",
|
|
87
|
+
"winner": "A" | "B" | "tie"
|
|
88
|
+
}}`
|
|
89
|
+
},
|
|
90
|
+
mutate: {
|
|
91
|
+
system: "",
|
|
92
|
+
user: `You are an expert competitive programmer improving a proposed solution using feedback from pairwise judging.
|
|
93
|
+
You may refine the current approach or abandon it and use a fundamentally different approach.
|
|
94
|
+
Provide a brief explanation, then provide a complete accepted C++17 solution in one code block.
|
|
95
|
+
Do not include hidden chain-of-thought.
|
|
96
|
+
|
|
97
|
+
PROBLEM:
|
|
98
|
+
{task}
|
|
99
|
+
|
|
100
|
+
RUBRIC:
|
|
101
|
+
{rubric}
|
|
102
|
+
|
|
103
|
+
CURRENT SOLUTION:
|
|
104
|
+
{candidate}
|
|
105
|
+
|
|
106
|
+
AGGREGATED FEEDBACK:
|
|
107
|
+
{critique}`
|
|
108
|
+
},
|
|
109
|
+
finalize: {
|
|
110
|
+
system: "You are preparing the winning candidate for final delivery.\nPreserve correctness. Remove obvious duplication. Do not add unsupported claims.\nReturn the final answer only.",
|
|
111
|
+
user: "TASK:\n{task}\n\nRUBRIC:\n{rubric}\n\nWINNING CANDIDATE:\n{candidate}"
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
function defaultRubricFor(phase, style) {
|
|
116
|
+
if (style === "paper-programming") {
|
|
117
|
+
if (phase === "compare")
|
|
118
|
+
return codeJudgeRubric;
|
|
119
|
+
if (phase === "generate" || phase === "mutate")
|
|
120
|
+
return codeRubric;
|
|
121
|
+
}
|
|
122
|
+
return defaultRubric;
|
|
123
|
+
}
|
|
124
|
+
export function builtInPrompt(phase, style) {
|
|
125
|
+
const phaseStyle = TEMPLATES[style] ?? TEMPLATES.general;
|
|
126
|
+
return phaseStyle[phase];
|
|
127
|
+
}
|
|
128
|
+
export function validatePromptTemplate(template, phase) {
|
|
129
|
+
const allowed = new Set(PHASE_VARIABLES[phase]);
|
|
130
|
+
for (const variable of extractVariables(template)) {
|
|
131
|
+
if (!allowed.has(variable)) {
|
|
132
|
+
throw new ConfigError(`Unknown template variable "{${variable}}" in ${phase} prompt. Available: ${PHASE_VARIABLES[phase]
|
|
133
|
+
.map((value) => `{${value}}`)
|
|
134
|
+
.join(", ")}. Use {{ and }} to escape literal braces.`, { code: "prompts.unknown_variable", retryable: false, fix: "Remove the variable or use a supported one." });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
function extractVariables(template) {
|
|
139
|
+
const names = [];
|
|
140
|
+
template.replace(/\{\{|\}\}|\{([a-zA-Z][a-zA-Z0-9_]*)\}/g, (_match, name) => {
|
|
141
|
+
if (name)
|
|
142
|
+
names.push(name);
|
|
143
|
+
return "";
|
|
144
|
+
});
|
|
145
|
+
return names;
|
|
146
|
+
}
|
|
147
|
+
function substituteVariables(template, variables) {
|
|
148
|
+
return template.replace(/\{\{|\}\}|\{([a-zA-Z][a-zA-Z0-9_]*)\}/g, (match, name) => {
|
|
149
|
+
if (match === "{{")
|
|
150
|
+
return "{";
|
|
151
|
+
if (match === "}}")
|
|
152
|
+
return "}";
|
|
153
|
+
if (name && Object.prototype.hasOwnProperty.call(variables, name))
|
|
154
|
+
return variables[name];
|
|
155
|
+
return match;
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
function renderPhase(phase, style, override, variables) {
|
|
159
|
+
const builtIn = builtInPrompt(phase, style);
|
|
160
|
+
const systemTemplate = override?.system ?? builtIn.system;
|
|
161
|
+
const userTemplate = override?.user ?? builtIn.user;
|
|
162
|
+
if (override?.system !== undefined)
|
|
163
|
+
validatePromptTemplate(systemTemplate, phase);
|
|
164
|
+
if (override?.user !== undefined)
|
|
165
|
+
validatePromptTemplate(userTemplate, phase);
|
|
166
|
+
return {
|
|
167
|
+
system: substituteVariables(systemTemplate, variables),
|
|
168
|
+
user: substituteVariables(userTemplate, variables)
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
export function generatePrompt(task, rubric, style = "general", override) {
|
|
172
|
+
return renderPhase("generate", style, override, {
|
|
173
|
+
task,
|
|
174
|
+
rubric: rubric ?? defaultRubricFor("generate", style)
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
export function comparePrompt(task, candidateA, candidateB, rubric, style = "general", override) {
|
|
178
|
+
return renderPhase("compare", style, override, {
|
|
179
|
+
task,
|
|
180
|
+
rubric: rubric ?? defaultRubricFor("compare", style),
|
|
181
|
+
candidateA: candidateA.content,
|
|
182
|
+
candidateB: candidateB.content
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
export function mutatePrompt(task, candidate, critique, rubric, style = "general", override) {
|
|
186
|
+
return renderPhase("mutate", style, override, {
|
|
187
|
+
task,
|
|
188
|
+
rubric: rubric ?? defaultRubricFor("mutate", style),
|
|
189
|
+
candidate: candidate.content,
|
|
190
|
+
critique
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
export function finalizePrompt(task, candidate, rubric, style = "general", override) {
|
|
194
|
+
return renderPhase("finalize", style, override, {
|
|
195
|
+
task,
|
|
196
|
+
rubric: rubric ?? defaultRubricFor("finalize", style),
|
|
197
|
+
candidate: candidate.content
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,aAAa,GAAG,oGAAoG,CAAC;AAC3H,MAAM,UAAU,GAAG,6GAA6G,CAAC;AACjI,MAAM,eAAe,GAAG,uFAAuF,CAAC;AAKhH,MAAM,CAAC,MAAM,eAAe,GAA2C;IACrE,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC5B,OAAO,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,CAAC;IACvD,MAAM,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC;IACnD,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC;CACjC,CAAC;AAOX,MAAM,SAAS,GAA4D;IACzE,OAAO,EAAE;QACP,QAAQ,EAAE;YACR,MAAM,EACJ,yMAAyM;YAC3M,IAAI,EAAE,8EAA8E;SACrF;QACD,OAAO,EAAE;YACP,MAAM,EAAE,EAAE;YACV,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;GAsBT;SACE;QACD,MAAM,EAAE;YACN,MAAM,EACJ,mSAAmS;YACrS,IAAI,EAAE,8JAA8J;SACrK;QACD,QAAQ,EAAE;YACR,MAAM,EACJ,8KAA8K;YAChL,IAAI,EAAE,uEAAuE;SAC9E;KACF;IACD,mBAAmB,EAAE;QACnB,QAAQ,EAAE;YACR,MAAM,EAAE,EAAE;YACV,IAAI,EAAE;;;;;;;;SAQH;SACJ;QACD,OAAO,EAAE;YACP,MAAM,EAAE,EAAE;YACV,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;GAqBT;SACE;QACD,MAAM,EAAE;YACN,MAAM,EAAE,EAAE;YACV,IAAI,EAAE;;;;;;;;;;;;;;;WAeD;SACN;QACD,QAAQ,EAAE;YACR,MAAM,EACJ,8KAA8K;YAChL,IAAI,EAAE,uEAAuE;SAC9E;KACF;CACF,CAAC;AAEF,SAAS,gBAAgB,CAAC,KAAkB,EAAE,KAAkB;IAC9D,IAAI,KAAK,KAAK,mBAAmB,EAAE,CAAC;QAClC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,eAAe,CAAC;QAChD,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,QAAQ;YAAE,OAAO,UAAU,CAAC;IACpE,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAkB,EAAE,KAAkB;IAClE,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC;IACzD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAgB,EAAE,KAAkB;IACzE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;IAChD,KAAK,MAAM,QAAQ,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,WAAW,CACnB,+BAA+B,QAAQ,SAAS,KAAK,uBAAuB,eAAe,CAAC,KAAK,CAAC;iBAC/F,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,GAAG,CAAC;iBAC5B,IAAI,CAAC,IAAI,CAAC,2CAA2C,EACxD,EAAE,IAAI,EAAE,0BAA0B,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,6CAA6C,EAAE,CAC3G,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB;IACxC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,wCAAwC,EAAE,CAAC,MAAM,EAAE,IAAa,EAAE,EAAE;QACnF,IAAI,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAgB,EAAE,SAAiC;IAC9E,OAAO,QAAQ,CAAC,OAAO,CAAC,wCAAwC,EAAE,CAAC,KAAK,EAAE,IAAa,EAAE,EAAE;QACzF,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,GAAG,CAAC;QAC/B,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,GAAG,CAAC;QAC/B,IAAI,IAAI,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC;YAAE,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;QAC1F,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAClB,KAAkB,EAClB,KAAkB,EAClB,QAAoC,EACpC,SAAiC;IAEjC,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAG,QAAQ,EAAE,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAC1D,MAAM,YAAY,GAAG,QAAQ,EAAE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IACpD,IAAI,QAAQ,EAAE,MAAM,KAAK,SAAS;QAAE,sBAAsB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAClF,IAAI,QAAQ,EAAE,IAAI,KAAK,SAAS;QAAE,sBAAsB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAC9E,OAAO;QACL,MAAM,EAAE,mBAAmB,CAAC,cAAc,EAAE,SAAS,CAAC;QACtD,IAAI,EAAE,mBAAmB,CAAC,YAAY,EAAE,SAAS,CAAC;KACnD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,MAAe,EACf,QAAqB,SAAS,EAC9B,QAAyB;IAEzB,OAAO,WAAW,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE;QAC9C,IAAI;QACJ,MAAM,EAAE,MAAM,IAAI,gBAAgB,CAAC,UAAU,EAAE,KAAK,CAAC;KACtD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,UAAqB,EACrB,UAAqB,EACrB,MAAe,EACf,QAAqB,SAAS,EAC9B,QAAyB;IAEzB,OAAO,WAAW,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE;QAC7C,IAAI;QACJ,MAAM,EAAE,MAAM,IAAI,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC;QACpD,UAAU,EAAE,UAAU,CAAC,OAAO;QAC9B,UAAU,EAAE,UAAU,CAAC,OAAO;KAC/B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,SAAoB,EACpB,QAAgB,EAChB,MAAe,EACf,QAAqB,SAAS,EAC9B,QAAyB;IAEzB,OAAO,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;QAC5C,IAAI;QACJ,MAAM,EAAE,MAAM,IAAI,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC;QACnD,SAAS,EAAE,SAAS,CAAC,OAAO;QAC5B,QAAQ;KACT,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,SAAoB,EACpB,MAAe,EACf,QAAqB,SAAS,EAC9B,QAAyB;IAEzB,OAAO,WAAW,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE;QAC9C,IAAI;QACJ,MAAM,EAAE,MAAM,IAAI,gBAAgB,CAAC,UAAU,EAAE,KAAK,CAAC;QACrD,SAAS,EAAE,SAAS,CAAC,OAAO;KAC7B,CAAC,CAAC;AACL,CAAC"}
|
package/dist/rng.d.ts
ADDED
package/dist/rng.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export function createRng(seed) {
|
|
2
|
+
let state = seed >>> 0;
|
|
3
|
+
const next = () => {
|
|
4
|
+
state += 0x6d2b79f5;
|
|
5
|
+
let t = state;
|
|
6
|
+
t = Math.imul(t ^ (t >>> 15), t | 1);
|
|
7
|
+
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
|
|
8
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
9
|
+
};
|
|
10
|
+
return {
|
|
11
|
+
next,
|
|
12
|
+
int(maxExclusive) {
|
|
13
|
+
return Math.floor(next() * maxExclusive);
|
|
14
|
+
},
|
|
15
|
+
bool() {
|
|
16
|
+
return next() >= 0.5;
|
|
17
|
+
},
|
|
18
|
+
id(prefix) {
|
|
19
|
+
return `${prefix}_${Math.floor(next() * 0xffffffff).toString(36).padStart(7, "0")}`;
|
|
20
|
+
},
|
|
21
|
+
shuffle(items) {
|
|
22
|
+
const copy = [...items];
|
|
23
|
+
for (let i = copy.length - 1; i > 0; i -= 1) {
|
|
24
|
+
const j = Math.floor(next() * (i + 1));
|
|
25
|
+
[copy[i], copy[j]] = [copy[j], copy[i]];
|
|
26
|
+
}
|
|
27
|
+
return copy;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=rng.js.map
|
package/dist/rng.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rng.js","sourceRoot":"","sources":["../src/rng.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC;IACvB,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,KAAK,IAAI,UAAU,CAAC;QACpB,IAAI,CAAC,GAAG,KAAK,CAAC;QACd,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACrC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC;IAC/C,CAAC,CAAC;IAEF,OAAO;QACL,IAAI;QACJ,GAAG,CAAC,YAAoB;YACtB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,YAAY,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI;YACF,OAAO,IAAI,EAAE,IAAI,GAAG,CAAC;QACvB,CAAC;QACD,EAAE,CAAC,MAAc;YACf,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,UAAU,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QACtF,CAAC;QACD,OAAO,CAAI,KAAmB;YAC5B,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;YACxB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACvC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1C,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/runner.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type BtScore, type Candidate, type ModelDriver, type RunConfig, type RunResult } from "./schemas.js";
|
|
2
|
+
export interface RunControl {
|
|
3
|
+
jobId?: string;
|
|
4
|
+
shouldCancel?: () => boolean | Promise<boolean>;
|
|
5
|
+
}
|
|
6
|
+
export declare function runDeepThonk(configInput: RunConfig, driver: ModelDriver, control?: RunControl): Promise<RunResult>;
|
|
7
|
+
export declare function rankPopulation(population: Candidate[], scores: BtScore[]): Candidate[];
|
|
8
|
+
export declare function topQuartile(ranked: Candidate[]): Candidate[];
|
|
9
|
+
export declare function bottomQuartile(ranked: Candidate[]): Set<string>;
|
|
10
|
+
export declare function copyElites(elites: Candidate[], generation: number): Candidate[];
|
|
11
|
+
export declare function keepPopulationSize(population: Candidate[], n: number): Candidate[];
|