claude-overnight 1.57.0 → 1.57.2
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/dist/bin/evolve.js +3 -1
- package/dist/core/_version.d.ts +1 -1
- package/dist/core/_version.js +1 -1
- package/dist/prompt-evolution/evaluator.js +19 -4
- package/dist/prompt-evolution/transport-batch.js +5 -2
- package/dist/prompt-evolution/transport.d.ts +8 -1
- package/dist/prompt-evolution/transport.js +21 -7
- package/package.json +1 -1
- package/plugins/claude-overnight/.claude-plugin/plugin.json +1 -1
package/dist/bin/evolve.js
CHANGED
|
@@ -293,7 +293,9 @@ async function evolveOne(opts) {
|
|
|
293
293
|
cases = cases.concat(generated);
|
|
294
294
|
}
|
|
295
295
|
catch (err) {
|
|
296
|
-
|
|
296
|
+
const msg = err.message ?? String(err);
|
|
297
|
+
console.log(`\n ⚠ case generation failed: ${msg.slice(0, 500)}`);
|
|
298
|
+
console.log(` Falling back to the existing ${cases.length} case(s). Try --gen-model with an Anthropic-compatible JSON-reliable model (e.g. claude-haiku-4-5) if this persists.\n`);
|
|
297
299
|
}
|
|
298
300
|
}
|
|
299
301
|
}
|
package/dist/core/_version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const VERSION = "1.57.
|
|
1
|
+
export declare const VERSION = "1.57.2";
|
package/dist/core/_version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Auto-generated by build — do not edit manually.
|
|
2
|
-
export const VERSION = "1.57.
|
|
2
|
+
export const VERSION = "1.57.2";
|
|
@@ -44,10 +44,7 @@ export async function buildMatrix(variants, cases, opts) {
|
|
|
44
44
|
// batch=false — work-stealing pool: keep `concurrency` jobs in flight so
|
|
45
45
|
// a slow call doesn't block the others in its slice.
|
|
46
46
|
const rawByKey = new Map();
|
|
47
|
-
|
|
48
|
-
await runBatchPath(jobs, opts, rawByKey);
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
47
|
+
const runOnlinePool = async () => {
|
|
51
48
|
let done = 0;
|
|
52
49
|
let next = 0;
|
|
53
50
|
const worker = async () => {
|
|
@@ -65,6 +62,24 @@ export async function buildMatrix(variants, cases, opts) {
|
|
|
65
62
|
}
|
|
66
63
|
};
|
|
67
64
|
await Promise.all(Array.from({ length: Math.min(concurrency, jobs.length) }, worker));
|
|
65
|
+
};
|
|
66
|
+
if (opts.batch) {
|
|
67
|
+
try {
|
|
68
|
+
await runBatchPath(jobs, opts, rawByKey);
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
// Batch submission failed (Kimi's /v1/files doesn't match OpenAI,
|
|
72
|
+
// OpenRouter has no batch at all, transient provider error, etc.).
|
|
73
|
+
// Fall back to the online pool so the whole run doesn't die — losing
|
|
74
|
+
// the 50% batch discount is better than losing the run.
|
|
75
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
76
|
+
opts.onBatchProgress?.(`batch path failed, falling back to online: ${msg.slice(0, 200)}`);
|
|
77
|
+
rawByKey.clear(); // discard any partial state
|
|
78
|
+
await runOnlinePool();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
await runOnlinePool();
|
|
68
83
|
}
|
|
69
84
|
// Adaptive sampling: for cells where any score-dim σ exceeds threshold,
|
|
70
85
|
// add one more rep and rerun — up to `cap` total reps. Converges on a
|
|
@@ -136,8 +136,11 @@ async function runOpenAIBatch(jobs, opts) {
|
|
|
136
136
|
form.append("purpose", "batch");
|
|
137
137
|
form.append("file", new Blob([jsonl], { type: "application/jsonl" }), "batch-input.jsonl");
|
|
138
138
|
const fileRes = await fetch(`${baseUrl}/v1/files`, { method: "POST", headers: authHeaders, body: form });
|
|
139
|
-
if (!fileRes.ok)
|
|
140
|
-
|
|
139
|
+
if (!fileRes.ok) {
|
|
140
|
+
const body = await fileRes.text().catch(() => "");
|
|
141
|
+
throw new Error(`Batch file-upload failed: HTTP ${fileRes.status} at ${baseUrl}/v1/files. ` +
|
|
142
|
+
`This provider may not support OpenAI-compatible batch. Response: ${body.slice(0, 300)}`);
|
|
143
|
+
}
|
|
141
144
|
const fileData = await fileRes.json();
|
|
142
145
|
const createRes = await fetch(`${baseUrl}/v1/batches`, {
|
|
143
146
|
method: "POST",
|
|
@@ -24,5 +24,12 @@ export interface CallModelResult {
|
|
|
24
24
|
/** Injectable model call — default is `defaultCallModel`; tests pass a mock. */
|
|
25
25
|
export type CallModel = (userText: string, systemText: string | undefined, opts: CallModelOpts) => Promise<CallModelResult>;
|
|
26
26
|
export declare function defaultCallModel(userText: string, systemText: string | undefined, opts: CallModelOpts): Promise<CallModelResult>;
|
|
27
|
-
/**
|
|
27
|
+
/**
|
|
28
|
+
* Strip markdown fences, strip preamble, and try to find a JSON value.
|
|
29
|
+
*
|
|
30
|
+
* Handles both `{…}` objects and `[…]` arrays — the previous implementation
|
|
31
|
+
* missed arrays entirely, which broke the case generator (Kimi returns the
|
|
32
|
+
* case list as a top-level array that's often preceded by a one-line
|
|
33
|
+
* preamble even when instructed otherwise).
|
|
34
|
+
*/
|
|
28
35
|
export declare function attemptJsonParse(text: string): unknown;
|
|
@@ -75,7 +75,14 @@ export async function defaultCallModel(userText, systemText, opts) {
|
|
|
75
75
|
const costUsd = inputTokens * 0.000003 + outputTokens * 0.000015;
|
|
76
76
|
return { raw, costUsd, inputTokens, outputTokens };
|
|
77
77
|
}
|
|
78
|
-
/**
|
|
78
|
+
/**
|
|
79
|
+
* Strip markdown fences, strip preamble, and try to find a JSON value.
|
|
80
|
+
*
|
|
81
|
+
* Handles both `{…}` objects and `[…]` arrays — the previous implementation
|
|
82
|
+
* missed arrays entirely, which broke the case generator (Kimi returns the
|
|
83
|
+
* case list as a top-level array that's often preceded by a one-line
|
|
84
|
+
* preamble even when instructed otherwise).
|
|
85
|
+
*/
|
|
79
86
|
export function attemptJsonParse(text) {
|
|
80
87
|
const cleaned = text
|
|
81
88
|
.replace(/^```(?:json)?\s*\n?/i, "")
|
|
@@ -85,14 +92,21 @@ export function attemptJsonParse(text) {
|
|
|
85
92
|
return JSON.parse(cleaned);
|
|
86
93
|
}
|
|
87
94
|
catch {
|
|
88
|
-
|
|
89
|
-
|
|
95
|
+
// Try the first plausible JSON value — object OR array, whichever comes
|
|
96
|
+
// first in the text. We build a regex union and pick the earliest match.
|
|
97
|
+
const objMatch = cleaned.match(/\{[\s\S]*\}/);
|
|
98
|
+
const arrMatch = cleaned.match(/\[[\s\S]*\]/);
|
|
99
|
+
const candidates = [];
|
|
100
|
+
if (objMatch && objMatch.index != null)
|
|
101
|
+
candidates.push({ idx: objMatch.index, text: objMatch[0] });
|
|
102
|
+
if (arrMatch && arrMatch.index != null)
|
|
103
|
+
candidates.push({ idx: arrMatch.index, text: arrMatch[0] });
|
|
104
|
+
candidates.sort((a, b) => a.idx - b.idx);
|
|
105
|
+
for (const c of candidates) {
|
|
90
106
|
try {
|
|
91
|
-
return JSON.parse(
|
|
92
|
-
}
|
|
93
|
-
catch {
|
|
94
|
-
return null;
|
|
107
|
+
return JSON.parse(c.text);
|
|
95
108
|
}
|
|
109
|
+
catch { /* try next */ }
|
|
96
110
|
}
|
|
97
111
|
return null;
|
|
98
112
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-overnight",
|
|
3
|
-
"version": "1.57.
|
|
3
|
+
"version": "1.57.2",
|
|
4
4
|
"description": "Overnight parallel coding agents in git worktrees, with a self-curating skill memory that improves while the run is going. Mix Claude Opus as planner, Kimi 2.6 or Cursor composer-2 as cheap fast worker, Gemini or Qwen for bulk implementation. Multi-wave autonomous loop that plans, executes, reviews, and steers itself until the objective is met. Crash-safe resume, rate-limit aware, usage cap preserves headroom for your interactive Claude Code.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-overnight",
|
|
3
|
-
"version": "1.57.
|
|
3
|
+
"version": "1.57.2",
|
|
4
4
|
"description": "Claude Code skill for understanding, installing, and inspecting claude-overnight runs: overnight parallel coding agents in git worktrees with a self-curating skill memory, multi-wave steering, three-layer review, and crash-safe resume. Mix Opus planner with Kimi 2.6, Cursor composer-2, Gemini, Qwen, or any Anthropic-compatible worker.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Francesco Fornace"
|