claude-overnight 1.25.10 → 1.25.13
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/_version.d.ts +1 -1
- package/dist/_version.js +1 -1
- package/dist/index.js +11 -24
- package/dist/models.d.ts +1 -1
- package/dist/models.js +2 -1
- package/dist/providers.js +58 -5
- package/package.json +1 -1
- package/plugins/claude-overnight/.claude-plugin/plugin.json +1 -1
package/dist/_version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const VERSION = "1.25.
|
|
1
|
+
export declare const VERSION = "1.25.13";
|
package/dist/_version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Auto-generated by build — do not edit manually.
|
|
2
|
-
export const VERSION = "1.25.
|
|
2
|
+
export const VERSION = "1.25.13";
|
package/dist/index.js
CHANGED
|
@@ -806,32 +806,19 @@ async function main() {
|
|
|
806
806
|
}
|
|
807
807
|
}
|
|
808
808
|
process.stdout.write(` ${chalk.dim(`◆ Pinging ${pending.map(([r, p]) => `${r} (${p.displayName})`).join(", ")}…`)}\n`);
|
|
809
|
-
//
|
|
810
|
-
//
|
|
811
|
-
//
|
|
812
|
-
//
|
|
813
|
-
//
|
|
809
|
+
// All preflights run in parallel. Cursor proxy preflights now go through a
|
|
810
|
+
// plain HTTP POST /v1/messages (see preflightCursorProxyViaHttp) instead of
|
|
811
|
+
// spawning the claude CLI, and the bundled proxy has no internal queue —
|
|
812
|
+
// each request spawns its own cursor-agent subprocess (request-listener.js
|
|
813
|
+
// → handleAnthropicMessages → runAgentStream).
|
|
814
814
|
const progress = (msg) => process.stdout.write(chalk.dim(` ${msg}\n`));
|
|
815
|
-
/** Cursor agent cold start + model
|
|
815
|
+
/** Cursor agent cold start + thinking-variant model latency can exceed 20s; API providers stay tight. */
|
|
816
816
|
const preflightMs = (p) => isCursorProxyProvider(p) ? 60_000 : 20_000;
|
|
817
|
-
const
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
else
|
|
823
|
-
nonCursorIdx.push(i);
|
|
824
|
-
}
|
|
825
|
-
const slot = Array.from({ length: pending.length });
|
|
826
|
-
await Promise.all(nonCursorIdx.map(async (i) => {
|
|
827
|
-
const [role, p] = pending[i];
|
|
828
|
-
slot[i] = { role, provider: p, result: await preflightProvider(p, cwd, preflightMs(p), { onProgress: progress }) };
|
|
829
|
-
}));
|
|
830
|
-
for (const i of cursorIdx) {
|
|
831
|
-
const [role, p] = pending[i];
|
|
832
|
-
slot[i] = { role, provider: p, result: await preflightProvider(p, cwd, preflightMs(p), { onProgress: progress }) };
|
|
833
|
-
}
|
|
834
|
-
const results = slot;
|
|
817
|
+
const results = await Promise.all(pending.map(async ([role, p]) => ({
|
|
818
|
+
role,
|
|
819
|
+
provider: p,
|
|
820
|
+
result: await preflightProvider(p, cwd, preflightMs(p), { onProgress: progress }),
|
|
821
|
+
})));
|
|
835
822
|
for (const { role, provider, result } of results) {
|
|
836
823
|
if (!result.ok) {
|
|
837
824
|
console.error(chalk.red(` ✗ ${role} preflight failed: ${chalk.dim(result.error)}`));
|
package/dist/models.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export interface ModelCapability {
|
|
|
7
7
|
}
|
|
8
8
|
export declare const MODEL_CAPABILITIES: Record<string, ModelCapability>;
|
|
9
9
|
export declare const DEFAULT_MODEL = "claude-sonnet-4-6";
|
|
10
|
-
export declare const FALLBACK_MODEL = "claude-opus-4-
|
|
10
|
+
export declare const FALLBACK_MODEL = "claude-opus-4-7";
|
|
11
11
|
/**
|
|
12
12
|
* Find capability info for a model string. Tries: exact match → lowercase
|
|
13
13
|
* exact → substring match. Falls back to "unknown" entry.
|
package/dist/models.js
CHANGED
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
export const MODEL_CAPABILITIES = {
|
|
21
21
|
// ── Anthropic Claude (Apr 2026) ──
|
|
22
22
|
// Opus: only model that earns "relaxed". 100% on 38-task routing, 95%+ IFEval.
|
|
23
|
+
"claude-opus-4-7": { contextWindow: 1_000_000, safeContext: 400_000, contextConstraint: "relaxed", displayName: "Opus 4.7" },
|
|
23
24
|
"claude-opus-4-6": { contextWindow: 1_000_000, safeContext: 400_000, contextConstraint: "relaxed", displayName: "Opus 4.6" },
|
|
24
25
|
// Sonnet: good but loses thread more than Opus on autonomous multi-file work.
|
|
25
26
|
"claude-sonnet-4-6": { contextWindow: 1_000_000, safeContext: 300_000, contextConstraint: "moderate", displayName: "Sonnet 4.6" },
|
|
@@ -59,7 +60,7 @@ export const MODEL_CAPABILITIES = {
|
|
|
59
60
|
};
|
|
60
61
|
// ── Default / fallback models ──
|
|
61
62
|
export const DEFAULT_MODEL = "claude-sonnet-4-6";
|
|
62
|
-
export const FALLBACK_MODEL = "claude-opus-4-
|
|
63
|
+
export const FALLBACK_MODEL = "claude-opus-4-7"; // used for planner + worker recovery
|
|
63
64
|
// ── Lookup ──
|
|
64
65
|
/**
|
|
65
66
|
* Find capability info for a model string. Tries: exact match → lowercase
|
package/dist/providers.js
CHANGED
|
@@ -256,6 +256,12 @@ function normalizeBaseURL(raw) {
|
|
|
256
256
|
* so misconfig doesn't delay the main run.
|
|
257
257
|
*/
|
|
258
258
|
export async function preflightProvider(p, cwd, timeoutMs = 20_000, opts) {
|
|
259
|
+
// Cursor proxy path: direct HTTP POST /v1/messages instead of spawning a
|
|
260
|
+
// full `claude` CLI subprocess. Same end-to-end validation (proxy + auth +
|
|
261
|
+
// cursor-agent + model) without per-check 1-3s of CLI spawn overhead.
|
|
262
|
+
if (isCursorProxyProvider(p)) {
|
|
263
|
+
return preflightCursorProxyViaHttp(p, timeoutMs, opts);
|
|
264
|
+
}
|
|
259
265
|
let env;
|
|
260
266
|
try {
|
|
261
267
|
env = envFor(p);
|
|
@@ -264,11 +270,7 @@ export async function preflightProvider(p, cwd, timeoutMs = 20_000, opts) {
|
|
|
264
270
|
return { ok: false, error: err.message };
|
|
265
271
|
}
|
|
266
272
|
// Show what we're checking
|
|
267
|
-
const keyInfo = p.
|
|
268
|
-
? `proxy auth`
|
|
269
|
-
: p.keyEnv
|
|
270
|
-
? `env ${p.keyEnv}`
|
|
271
|
-
: "stored key";
|
|
273
|
+
const keyInfo = p.keyEnv ? `env ${p.keyEnv}` : "stored key";
|
|
272
274
|
opts?.onProgress?.(`checking ${p.model} (${keyInfo})…`);
|
|
273
275
|
let pq;
|
|
274
276
|
try {
|
|
@@ -327,6 +329,57 @@ export async function preflightProvider(p, cwd, timeoutMs = 20_000, opts) {
|
|
|
327
329
|
catch { }
|
|
328
330
|
}
|
|
329
331
|
}
|
|
332
|
+
/**
|
|
333
|
+
* Cursor-proxy-only preflight: HTTP POST /v1/messages instead of spawning the
|
|
334
|
+
* `claude` CLI. The proxy spawns its own cursor-agent subprocess per request
|
|
335
|
+
* (see cursor-composer-in-claude agent-runner.js) with no internal queue —
|
|
336
|
+
* callers can safely run these in parallel.
|
|
337
|
+
*/
|
|
338
|
+
async function preflightCursorProxyViaHttp(p, timeoutMs, opts) {
|
|
339
|
+
opts?.onProgress?.(`checking ${p.model} (proxy auth)…`);
|
|
340
|
+
const baseURL = (p.baseURL || PROXY_DEFAULT_URL).replace(/\/$/, "");
|
|
341
|
+
const key = resolveCursorProxyKey();
|
|
342
|
+
const headers = { "content-type": "application/json" };
|
|
343
|
+
if (key)
|
|
344
|
+
headers["authorization"] = `Bearer ${key}`;
|
|
345
|
+
const controller = new AbortController();
|
|
346
|
+
let elapsed = 0;
|
|
347
|
+
const PROGRESS_INTERVAL_MS = 3_000;
|
|
348
|
+
const progressTimer = setInterval(() => {
|
|
349
|
+
elapsed += PROGRESS_INTERVAL_MS;
|
|
350
|
+
opts?.onProgress?.(`still waiting… (${(elapsed / 1000).toFixed(1)}s)`);
|
|
351
|
+
}, PROGRESS_INTERVAL_MS);
|
|
352
|
+
const deadline = setTimeout(() => controller.abort(), timeoutMs);
|
|
353
|
+
try {
|
|
354
|
+
const res = await fetch(`${baseURL}/v1/messages`, {
|
|
355
|
+
method: "POST",
|
|
356
|
+
headers,
|
|
357
|
+
body: JSON.stringify({
|
|
358
|
+
model: p.model,
|
|
359
|
+
max_tokens: 1,
|
|
360
|
+
messages: [{ role: "user", content: "ok" }],
|
|
361
|
+
}),
|
|
362
|
+
signal: controller.signal,
|
|
363
|
+
});
|
|
364
|
+
if (!res.ok) {
|
|
365
|
+
const text = await res.text().catch(() => "");
|
|
366
|
+
return { ok: false, error: `HTTP ${res.status}: ${text.slice(0, 200)}` };
|
|
367
|
+
}
|
|
368
|
+
// Drain body so the connection closes cleanly; we don't care about content.
|
|
369
|
+
await res.text().catch(() => "");
|
|
370
|
+
return { ok: true };
|
|
371
|
+
}
|
|
372
|
+
catch (err) {
|
|
373
|
+
if (err?.name === "AbortError") {
|
|
374
|
+
return { ok: false, error: `timeout after ${Math.round(timeoutMs / 1000)}s` };
|
|
375
|
+
}
|
|
376
|
+
return { ok: false, error: String(err?.message || err).slice(0, 200) };
|
|
377
|
+
}
|
|
378
|
+
finally {
|
|
379
|
+
clearTimeout(deadline);
|
|
380
|
+
clearInterval(progressTimer);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
330
383
|
// ── Cursor API Proxy ──
|
|
331
384
|
export const PROXY_DEFAULT_URL = "http://127.0.0.1:8765";
|
|
332
385
|
/** Check if a provider routes through cursor-composer-in-claude. */
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-overnight",
|
|
3
|
-
"version": "1.25.
|
|
3
|
+
"version": "1.25.13",
|
|
4
4
|
"description": "Parallel Claude agents in git worktrees with a usage cap that reserves headroom for your interactive Claude Code. Crash-safe resume. Provider-agnostic model catalog (Anthropic, Cursor, OpenAI, Gemini, DeepSeek, Llama, Qwen) with capability-based task scoping.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-overnight",
|
|
3
|
-
"version": "1.25.
|
|
3
|
+
"version": "1.25.13",
|
|
4
4
|
"description": "Claude Code skill for understanding, installing, and inspecting claude-overnight runs -- parallel Claude agents in git worktrees with thinking waves, multi-wave steering, and crash-safe resume. Supports Cursor API Proxy, Qwen, OpenRouter.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Francesco Fornace"
|