@aexol/spectral 0.9.205 → 0.9.207
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/agent/agents.d.ts.map +1 -1
- package/dist/agent/agents.js +10 -2
- package/dist/mcp/npx-resolver.d.ts +30 -1
- package/dist/mcp/npx-resolver.d.ts.map +1 -1
- package/dist/mcp/npx-resolver.js +306 -51
- package/dist/sdk/agent-core/agent-loop.d.ts.map +1 -1
- package/dist/sdk/agent-core/agent-loop.js +79 -2
- package/dist/sdk/ai/index.d.ts +1 -0
- package/dist/sdk/ai/index.d.ts.map +1 -1
- package/dist/sdk/ai/index.js +1 -0
- package/dist/sdk/ai/utils/rate-limit-retry.d.ts +45 -0
- package/dist/sdk/ai/utils/rate-limit-retry.d.ts.map +1 -0
- package/dist/sdk/ai/utils/rate-limit-retry.js +68 -0
- package/dist/sdk/coding-agent/core/agent-session.d.ts.map +1 -1
- package/dist/sdk/coding-agent/core/agent-session.js +24 -8
- package/dist/server/agent-bridge.d.ts.map +1 -1
- package/dist/server/agent-bridge.js +4 -1
- package/dist/server/error-humanizer.d.ts.map +1 -1
- package/dist/server/error-humanizer.js +6 -0
- package/dist/server/handlers/projects.d.ts +1 -0
- package/dist/server/handlers/projects.d.ts.map +1 -1
- package/dist/server/handlers/projects.js +4 -1
- package/dist/server/paths.d.ts +12 -1
- package/dist/server/paths.d.ts.map +1 -1
- package/dist/server/paths.js +21 -3
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/agent/agents.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AACrD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAC/C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IAChD,QAAQ,EAAE,MAAM,CAAC;CAClB;AACD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,eAAO,MAAM,aAAa,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/agent/agents.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AACrD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAC/C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IAChD,QAAQ,EAAE,MAAM,CAAC;CAClB;AACD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,eAAO,MAAM,aAAa,EAAE,WAAW,EAmDtC,CAAC;AA0DF,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAO3E;AACD;;;;GAIG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,yEAAyE;IACzE,YAAY,EAAE,IAAI,CAAC;IACnB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG;IACF,YAAY,EAAE,KAAK,CAAC;IACpB,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CA6EnC;AAkBD,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,UAAU,EACjB,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,oBAAoB,CAmBtB;AACD,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,KAAK,GAAE,UAAmB,EAC1B,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,WAAW,GAAG,IAAI,CAepB;AACD;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CACzC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACvC,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,WAAW,GAAG,IAAI,CAgBpB;AACD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,YAAY,EAAE,IAAI,CAChB,WAAW,EACX,MAAM,GAAG,aAAa,GAAG,cAAc,GAAG,OAAO,GAAG,QAAQ,CAC7D,GAAG,IAAI,GACP,MAAM,GAAG,SAAS,CAQpB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,IAAI,CACT,WAAW,EACX,MAAM,GAAG,aAAa,GAAG,cAAc,GAAG,OAAO,GAAG,QAAQ,CAC7D,GAAG,IAAI,GACP,MAAM,CAgBR"}
|
package/dist/agent/agents.js
CHANGED
|
@@ -6,9 +6,9 @@ import { classifyGraphqlError, createBackendClient, graphqlErrorMessage, scalars
|
|
|
6
6
|
export const SYSTEM_AGENTS = [
|
|
7
7
|
{
|
|
8
8
|
name: "ghost",
|
|
9
|
-
description: "Built-in orchestrator primary agent that delegates work to researcher, executor, and
|
|
9
|
+
description: "Built-in orchestrator primary agent that delegates work to researcher, executor, reviewer, and fork subagents.",
|
|
10
10
|
mode: "primary",
|
|
11
|
-
systemPrompt: "You are ghost, the built-in system orchestrator. Plan the work, then delegate by calling the `subagent` tool with one of your subagents, then integrate the results into a coherent outcome.\n\nYour subagents (call them via the `subagent` tool, e.g. subagent(agent=\"researcher\", task=\"...\")):\n- `researcher` — investigate the codebase, read code and documentation, and report precise, cited findings without making changes.\n- `executor` — implement the requested changes minimally and safely, run verification, and report exactly what changed with evidence.\n- `reviewer` — review proposed or implemented changes for correctness, edge cases, security, and consistency with the codebase.\n
|
|
11
|
+
systemPrompt: "You are ghost, the built-in system orchestrator. Plan the work, then delegate by calling the `subagent` tool with one of your subagents, then integrate the results into a coherent outcome.\n\nYour subagents (call them via the `subagent` tool, e.g. subagent(agent=\"researcher\", task=\"...\")):\n- `researcher` — investigate the codebase, read code and documentation, and report precise, cited findings without making changes.\n- `executor` — implement the requested changes minimally and safely, run verification, and report exactly what changed with evidence.\n- `reviewer` — review proposed or implemented changes for correctness, edge cases, security, and consistency with the codebase.\n- `fork` — a generalist worker with the same broad capabilities as the main thread; give it a self-contained task and it carries it end-to-end.\n\nTry to delegate most of the work to your subagents: use `researcher` for research/investigation, `executor` for implementation, `reviewer` for review, and `fork` for generalist tasks that don't fit the other three.",
|
|
12
12
|
source: "system",
|
|
13
13
|
filePath: "system:ghost",
|
|
14
14
|
},
|
|
@@ -36,6 +36,14 @@ export const SYSTEM_AGENTS = [
|
|
|
36
36
|
source: "system",
|
|
37
37
|
filePath: "system:reviewer",
|
|
38
38
|
},
|
|
39
|
+
{
|
|
40
|
+
name: "fork",
|
|
41
|
+
description: "Built-in system generalist subagent — works like the main thread on a delegated task.",
|
|
42
|
+
mode: "subagent",
|
|
43
|
+
systemPrompt: "You are the fork subagent for ghost — a generalist with the same broad capabilities as the main thread. Own the delegated task end-to-end: investigate what you need, do the work, verify the result, and report the outcome with evidence.",
|
|
44
|
+
source: "system",
|
|
45
|
+
filePath: "system:fork",
|
|
46
|
+
},
|
|
39
47
|
];
|
|
40
48
|
function loadAgentsFromDir(dir, source) {
|
|
41
49
|
const agents = [];
|
|
@@ -3,5 +3,34 @@ export interface NpxResolution {
|
|
|
3
3
|
extraArgs: string[];
|
|
4
4
|
isJs: boolean;
|
|
5
5
|
}
|
|
6
|
-
export
|
|
6
|
+
export interface ResolveOptions {
|
|
7
|
+
/** Override for the global node_modules root (tests / custom environments). */
|
|
8
|
+
globalRoot?: string | null;
|
|
9
|
+
/** Override for the npm cache dir (tests / custom environments). */
|
|
10
|
+
npmCacheDir?: string | null;
|
|
11
|
+
/** Override for the registry "latest version" lookup (tests / offline). */
|
|
12
|
+
latestVersionFetcher?: (packageName: string) => Promise<string | null>;
|
|
13
|
+
/** Override for the npx-cache population step (tests). */
|
|
14
|
+
forceInstall?: () => Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
interface ParsedInvocation {
|
|
17
|
+
packageSpec: string;
|
|
18
|
+
binName?: string;
|
|
19
|
+
extraArgs: string[];
|
|
20
|
+
}
|
|
21
|
+
export declare function resolveNpxBinary(command: string, args: string[], options?: ResolveOptions): Promise<NpxResolution | null>;
|
|
22
|
+
export declare function parseNpxArgs(args: string[]): ParsedInvocation | null;
|
|
23
|
+
export declare function parseNpmExecArgs(args: string[]): ParsedInvocation | null;
|
|
24
|
+
export declare function extractPackageName(spec: string): string | null;
|
|
25
|
+
/**
|
|
26
|
+
* A "floating" spec is one without a version pin: bare name, `@latest` or `@*`.
|
|
27
|
+
* Only floating specs may resolve from the global tree and only they get the
|
|
28
|
+
* registry freshness check — a pinned spec must match its exact version.
|
|
29
|
+
*/
|
|
30
|
+
export declare function isFloatingSpec(spec: string): boolean;
|
|
31
|
+
/** Reset per-process memoizations (used by tests). */
|
|
32
|
+
export declare function resetNpxResolverCachesForTests(): void;
|
|
33
|
+
/** Semver-ish comparison; release beats prerelease, identifiers compare numerically when both numeric. */
|
|
34
|
+
export declare function compareVersions(a: string, b: string): number;
|
|
35
|
+
export {};
|
|
7
36
|
//# sourceMappingURL=npx-resolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npx-resolver.d.ts","sourceRoot":"","sources":["../../src/mcp/npx-resolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"npx-resolver.d.ts","sourceRoot":"","sources":["../../src/mcp/npx-resolver.ts"],"names":[],"mappings":"AAqCA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,2EAA2E;IAC3E,oBAAoB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACvE,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAED,UAAU,gBAAgB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA0D/B;AAMD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,gBAAgB,GAAG,IAAI,CAkDpE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,gBAAgB,GAAG,IAAI,CAmCxE;AAqKD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAc9D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKpD;AAqED,sDAAsD;AACtD,wBAAgB,8BAA8B,IAAI,IAAI,CAGrD;AA+GD,0GAA0G;AAC1G,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAW5D"}
|
package/dist/mcp/npx-resolver.js
CHANGED
|
@@ -1,11 +1,26 @@
|
|
|
1
1
|
// npx-resolver.ts - Resolve npx/npm exec binaries to avoid npm parent processes
|
|
2
|
+
//
|
|
3
|
+
// Resolution order (mirrors `npm exec` semantics, minus the local project tree):
|
|
4
|
+
// 1. Global install (`<prefix>/lib/node_modules/<pkg>`) — beats the npx cache,
|
|
5
|
+
// so `npm i -g pkg@latest` takes effect on the next server (re)connect.
|
|
6
|
+
// Pinned specs (`pkg@1.2.3`) never resolve from global.
|
|
7
|
+
// 2. Own resolution cache (`~/.spectral/agent/mcp-npx-cache.json`, 24h TTL) —
|
|
8
|
+
// hot path, no registry traffic.
|
|
9
|
+
// 3. npx cache scan (`~/.npm/_npx/*`); floating specs (`pkg`, `pkg@latest`,
|
|
10
|
+
// `pkg@*`) get a registry freshness check once per TTL window and the
|
|
11
|
+
// cache is refreshed via `npm exec` when a newer version exists.
|
|
12
|
+
// 4. Slow path: force-populate the npx cache, then re-scan.
|
|
2
13
|
import { existsSync, readFileSync, realpathSync, readdirSync, statSync, writeFileSync, renameSync, mkdirSync, openSync, readSync, closeSync } from "node:fs";
|
|
3
14
|
import { join, dirname, extname, resolve, sep } from "node:path";
|
|
4
15
|
import { getAgentPath } from "./agent-dir.js";
|
|
5
16
|
import spawn from "cross-spawn";
|
|
6
17
|
const CACHE_VERSION = 1;
|
|
7
18
|
const CACHE_TTL_MS = 24 * 60 * 60 * 1000;
|
|
8
|
-
|
|
19
|
+
const CACHE_PRUNE_MS = 30 * 24 * 60 * 60 * 1000;
|
|
20
|
+
const REGISTRY_CHECK_TIMEOUT_MS = 10_000;
|
|
21
|
+
const GLOBAL_ROOT_TIMEOUT_MS = 5_000;
|
|
22
|
+
const FORCE_CACHE_TIMEOUT_MS = 30_000;
|
|
23
|
+
export async function resolveNpxBinary(command, args, options = {}) {
|
|
9
24
|
const parsed = command === "npx"
|
|
10
25
|
? parseNpxArgs(args)
|
|
11
26
|
: command === "npm"
|
|
@@ -16,24 +31,52 @@ export async function resolveNpxBinary(command, args) {
|
|
|
16
31
|
const cacheKey = JSON.stringify([command, ...args]);
|
|
17
32
|
const cache = loadCache();
|
|
18
33
|
const cached = cache?.entries?.[cacheKey];
|
|
34
|
+
// 1. Global install wins (npm exec semantics: global tree beats npx cache).
|
|
35
|
+
const global = resolveFromGlobal(parsed.packageSpec, parsed.binName, options.globalRoot);
|
|
36
|
+
if (global) {
|
|
37
|
+
if (!cached || cached.resolvedBin !== global.resolvedBin) {
|
|
38
|
+
saveCacheEntry(cacheKey, global);
|
|
39
|
+
}
|
|
40
|
+
return toResolution(global, parsed.extraArgs);
|
|
41
|
+
}
|
|
42
|
+
// 2. Own resolution cache (hot path — no registry traffic, TTL-governed).
|
|
19
43
|
if (cached && Date.now() - cached.resolvedAt < CACHE_TTL_MS && existsSync(cached.resolvedBin)) {
|
|
20
|
-
return
|
|
44
|
+
return toResolution(cached, parsed.extraArgs);
|
|
45
|
+
}
|
|
46
|
+
// 3. npx cache scan; floating specs get a registry freshness check on refresh.
|
|
47
|
+
const scanned = resolveFromNpmCache(parsed.packageSpec, parsed.binName, options.npmCacheDir);
|
|
48
|
+
if (scanned && isFloatingSpec(parsed.packageSpec) && scanned.packageVersion) {
|
|
49
|
+
const fetcher = options.latestVersionFetcher ?? fetchLatestVersion;
|
|
50
|
+
const packageName = extractPackageName(parsed.packageSpec) ?? parsed.packageSpec;
|
|
51
|
+
const latest = await fetcher(packageName);
|
|
52
|
+
if (latest && compareVersions(latest, scanned.packageVersion) > 0) {
|
|
53
|
+
const force = options.forceInstall ?? (() => forceNpxCache(parsed.packageSpec));
|
|
54
|
+
await force();
|
|
55
|
+
const refreshed = resolveFromNpmCache(parsed.packageSpec, parsed.binName, options.npmCacheDir);
|
|
56
|
+
if (refreshed) {
|
|
57
|
+
saveCacheEntry(cacheKey, refreshed);
|
|
58
|
+
return toResolution(refreshed, parsed.extraArgs);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
21
61
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
return { binPath: resolved.resolvedBin, extraArgs: parsed.extraArgs, isJs: resolved.isJs };
|
|
62
|
+
if (scanned) {
|
|
63
|
+
saveCacheEntry(cacheKey, scanned);
|
|
64
|
+
return toResolution(scanned, parsed.extraArgs);
|
|
26
65
|
}
|
|
27
|
-
// Slow path: force npx cache population
|
|
28
|
-
|
|
29
|
-
|
|
66
|
+
// 4. Slow path: force npx cache population.
|
|
67
|
+
const force = options.forceInstall ?? (() => forceNpxCache(parsed.packageSpec));
|
|
68
|
+
await force();
|
|
69
|
+
const resolvedAfterInstall = resolveFromNpmCache(parsed.packageSpec, parsed.binName, options.npmCacheDir);
|
|
30
70
|
if (resolvedAfterInstall) {
|
|
31
71
|
saveCacheEntry(cacheKey, resolvedAfterInstall);
|
|
32
|
-
return
|
|
72
|
+
return toResolution(resolvedAfterInstall, parsed.extraArgs);
|
|
33
73
|
}
|
|
34
74
|
return null;
|
|
35
75
|
}
|
|
36
|
-
function
|
|
76
|
+
function toResolution(entry, extraArgs) {
|
|
77
|
+
return { binPath: entry.resolvedBin, extraArgs, isJs: entry.isJs };
|
|
78
|
+
}
|
|
79
|
+
export function parseNpxArgs(args) {
|
|
37
80
|
const separatorIndex = args.indexOf("--");
|
|
38
81
|
const before = separatorIndex >= 0 ? args.slice(0, separatorIndex) : args;
|
|
39
82
|
const after = separatorIndex >= 0 ? args.slice(separatorIndex + 1) : [];
|
|
@@ -87,7 +130,7 @@ function parseNpxArgs(args) {
|
|
|
87
130
|
const extraArgs = positionals.slice(1).concat(after);
|
|
88
131
|
return { packageSpec: packagePositional, extraArgs };
|
|
89
132
|
}
|
|
90
|
-
function parseNpmExecArgs(args) {
|
|
133
|
+
export function parseNpmExecArgs(args) {
|
|
91
134
|
if (args[0] !== "exec")
|
|
92
135
|
return null;
|
|
93
136
|
const execArgs = args.slice(1);
|
|
@@ -128,8 +171,65 @@ function parseNpmExecArgs(args) {
|
|
|
128
171
|
const extraArgs = after.slice(1);
|
|
129
172
|
return { packageSpec, binName, extraArgs };
|
|
130
173
|
}
|
|
131
|
-
function
|
|
132
|
-
|
|
174
|
+
function pickBinEntry(binField, packageName, explicitBin) {
|
|
175
|
+
if (typeof binField === "string") {
|
|
176
|
+
return { name: defaultBinName(packageName), rel: binField };
|
|
177
|
+
}
|
|
178
|
+
for (const candidate of buildBinCandidates(packageName, explicitBin)) {
|
|
179
|
+
if (binField[candidate]) {
|
|
180
|
+
return { name: candidate, rel: binField[candidate] };
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const firstEntry = Object.entries(binField)[0];
|
|
184
|
+
if (firstEntry) {
|
|
185
|
+
return { name: firstEntry[0], rel: firstEntry[1] };
|
|
186
|
+
}
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Resolve the package from the npm global install tree. Global beats the npx
|
|
191
|
+
* cache, but only floating specs (`pkg`, `pkg@latest`, `pkg@*`) may resolve
|
|
192
|
+
* from global — a pinned spec must match its exact version.
|
|
193
|
+
*/
|
|
194
|
+
function resolveFromGlobal(packageSpec, binName, globalRootOverride) {
|
|
195
|
+
if (!isFloatingSpec(packageSpec))
|
|
196
|
+
return null;
|
|
197
|
+
const packageName = extractPackageName(packageSpec);
|
|
198
|
+
if (!packageName)
|
|
199
|
+
return null;
|
|
200
|
+
const root = globalRootOverride ?? getGlobalRoot();
|
|
201
|
+
if (!root)
|
|
202
|
+
return null;
|
|
203
|
+
const pkgDir = join(root, ...packageName.split("/"));
|
|
204
|
+
const packageJsonPath = join(pkgDir, "package.json");
|
|
205
|
+
if (!existsSync(packageJsonPath))
|
|
206
|
+
return null;
|
|
207
|
+
let pkg = null;
|
|
208
|
+
try {
|
|
209
|
+
pkg = JSON.parse(readFileSync(packageJsonPath, "utf-8"));
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
const binField = pkg?.bin;
|
|
215
|
+
if (!binField)
|
|
216
|
+
return null;
|
|
217
|
+
const picked = pickBinEntry(binField, packageName, binName);
|
|
218
|
+
if (!picked)
|
|
219
|
+
return null;
|
|
220
|
+
const resolvedBin = resolve(pkgDir, picked.rel);
|
|
221
|
+
if (!existsSync(resolvedBin))
|
|
222
|
+
return null;
|
|
223
|
+
return {
|
|
224
|
+
resolvedBin,
|
|
225
|
+
resolvedAt: Date.now(),
|
|
226
|
+
packageVersion: pkg?.version,
|
|
227
|
+
isJs: detectJsBinary(resolvedBin),
|
|
228
|
+
source: "global",
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
function resolveFromNpmCache(packageSpec, binName, cacheDirOverride) {
|
|
232
|
+
const cacheDir = cacheDirOverride ?? getNpmCacheDir();
|
|
133
233
|
if (!cacheDir)
|
|
134
234
|
return null;
|
|
135
235
|
const packageName = extractPackageName(packageSpec);
|
|
@@ -151,59 +251,36 @@ function resolveFromNpmCache(packageSpec, binName) {
|
|
|
151
251
|
const binField = pkg?.bin;
|
|
152
252
|
if (!binField)
|
|
153
253
|
return null;
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
let binRel;
|
|
157
|
-
if (typeof binField === "string") {
|
|
158
|
-
chosenBinName = defaultBinName(packageName);
|
|
159
|
-
binRel = binField;
|
|
160
|
-
}
|
|
161
|
-
else {
|
|
162
|
-
for (const candidate of candidates) {
|
|
163
|
-
if (binField[candidate]) {
|
|
164
|
-
chosenBinName = candidate;
|
|
165
|
-
binRel = binField[candidate];
|
|
166
|
-
break;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
if (!binRel) {
|
|
170
|
-
const firstEntry = Object.entries(binField)[0];
|
|
171
|
-
if (firstEntry) {
|
|
172
|
-
chosenBinName = firstEntry[0];
|
|
173
|
-
binRel = firstEntry[1];
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
if (!binRel)
|
|
254
|
+
const picked = pickBinEntry(binField, packageName, binName);
|
|
255
|
+
if (!picked)
|
|
178
256
|
return null;
|
|
179
257
|
const nodeModulesDir = findNodeModulesDir(packageDir);
|
|
180
|
-
const binLink =
|
|
181
|
-
let resolvedBin =
|
|
258
|
+
const binLink = join(nodeModulesDir, ".bin", picked.name);
|
|
259
|
+
let resolvedBin = existsSync(binLink) ? safeRealpath(binLink) : "";
|
|
182
260
|
if (!resolvedBin) {
|
|
183
|
-
resolvedBin = resolve(packageDir,
|
|
261
|
+
resolvedBin = resolve(packageDir, picked.rel);
|
|
184
262
|
if (!existsSync(resolvedBin))
|
|
185
263
|
return null;
|
|
186
264
|
}
|
|
187
|
-
const isJs = detectJsBinary(resolvedBin);
|
|
188
265
|
return {
|
|
189
266
|
resolvedBin,
|
|
190
267
|
resolvedAt: Date.now(),
|
|
191
268
|
packageVersion: pkg?.version,
|
|
192
|
-
isJs,
|
|
269
|
+
isJs: detectJsBinary(resolvedBin),
|
|
270
|
+
source: "npx-cache",
|
|
193
271
|
};
|
|
194
272
|
}
|
|
195
|
-
const FORCE_CACHE_TIMEOUT_MS = 30_000;
|
|
196
273
|
async function forceNpxCache(packageSpec) {
|
|
197
274
|
try {
|
|
198
|
-
await new Promise((
|
|
275
|
+
await new Promise((resolvePromise, rejectPromise) => {
|
|
199
276
|
const proc = spawn("npm", ["exec", "--yes", "--package", packageSpec, "--", "node", "-e", "1"], { stdio: "ignore" });
|
|
200
277
|
const timer = setTimeout(() => {
|
|
201
278
|
proc.kill();
|
|
202
|
-
|
|
279
|
+
rejectPromise(new Error("timeout"));
|
|
203
280
|
}, FORCE_CACHE_TIMEOUT_MS);
|
|
204
281
|
timer.unref();
|
|
205
|
-
proc.on("close", () => { clearTimeout(timer);
|
|
206
|
-
proc.on("error", (err) => { clearTimeout(timer);
|
|
282
|
+
proc.on("close", () => { clearTimeout(timer); resolvePromise(); });
|
|
283
|
+
proc.on("error", (err) => { clearTimeout(timer); rejectPromise(err); });
|
|
207
284
|
});
|
|
208
285
|
}
|
|
209
286
|
catch {
|
|
@@ -221,13 +298,15 @@ function buildBinCandidates(packageName, explicitBin) {
|
|
|
221
298
|
candidates.push(namePart);
|
|
222
299
|
if (scopePart && namePart)
|
|
223
300
|
candidates.push(`${scopePart}-${namePart}`);
|
|
301
|
+
if (scopePart)
|
|
302
|
+
candidates.push(scopePart);
|
|
224
303
|
}
|
|
225
304
|
else {
|
|
226
305
|
candidates.push(packageName);
|
|
227
306
|
}
|
|
228
307
|
return [...new Set(candidates.filter(Boolean))];
|
|
229
308
|
}
|
|
230
|
-
function extractPackageName(spec) {
|
|
309
|
+
export function extractPackageName(spec) {
|
|
231
310
|
const trimmed = spec.trim();
|
|
232
311
|
if (!trimmed)
|
|
233
312
|
return null;
|
|
@@ -244,6 +323,18 @@ function extractPackageName(spec) {
|
|
|
244
323
|
const atIndex = trimmed.indexOf("@");
|
|
245
324
|
return atIndex >= 0 ? trimmed.slice(0, atIndex) : trimmed;
|
|
246
325
|
}
|
|
326
|
+
/**
|
|
327
|
+
* A "floating" spec is one without a version pin: bare name, `@latest` or `@*`.
|
|
328
|
+
* Only floating specs may resolve from the global tree and only they get the
|
|
329
|
+
* registry freshness check — a pinned spec must match its exact version.
|
|
330
|
+
*/
|
|
331
|
+
export function isFloatingSpec(spec) {
|
|
332
|
+
const name = extractPackageName(spec);
|
|
333
|
+
if (!name)
|
|
334
|
+
return false;
|
|
335
|
+
const trimmed = spec.trim();
|
|
336
|
+
return trimmed === name || trimmed === `${name}@latest` || trimmed === `${name}@*`;
|
|
337
|
+
}
|
|
247
338
|
function defaultBinName(packageName) {
|
|
248
339
|
if (packageName.startsWith("@")) {
|
|
249
340
|
const parts = packageName.split("/");
|
|
@@ -265,7 +356,9 @@ function findCachedPackageDir(cacheDir, packageName) {
|
|
|
265
356
|
const mtime = safeStatMtime(full);
|
|
266
357
|
return { name: entry.name, mtime };
|
|
267
358
|
})
|
|
268
|
-
|
|
359
|
+
// Newest first; on equal mtimes fall back to a stable name order so
|
|
360
|
+
// resolution is deterministic.
|
|
361
|
+
.sort((a, b) => (b.mtime - a.mtime) || a.name.localeCompare(b.name));
|
|
269
362
|
for (const entry of candidates) {
|
|
270
363
|
const pkgDir = join(npxDir, entry.name, "node_modules", ...packagePathParts);
|
|
271
364
|
if (existsSync(join(pkgDir, "package.json"))) {
|
|
@@ -303,6 +396,12 @@ function detectJsBinary(binPath) {
|
|
|
303
396
|
}
|
|
304
397
|
}
|
|
305
398
|
let npmCacheDirCached;
|
|
399
|
+
let globalRootCached;
|
|
400
|
+
/** Reset per-process memoizations (used by tests). */
|
|
401
|
+
export function resetNpxResolverCachesForTests() {
|
|
402
|
+
npmCacheDirCached = undefined;
|
|
403
|
+
globalRootCached = undefined;
|
|
404
|
+
}
|
|
306
405
|
function getNpmCacheDir() {
|
|
307
406
|
if (npmCacheDirCached !== undefined)
|
|
308
407
|
return npmCacheDirCached;
|
|
@@ -325,6 +424,155 @@ function getNpmCacheDir() {
|
|
|
325
424
|
npmCacheDirCached = null;
|
|
326
425
|
return null;
|
|
327
426
|
}
|
|
427
|
+
/**
|
|
428
|
+
* Resolve the global node_modules root (e.g.
|
|
429
|
+
* `<prefix>/lib/node_modules` on unix, `<prefix>/node_modules` on Windows).
|
|
430
|
+
* Derived from the running node binary to avoid spawning npm on the hot path;
|
|
431
|
+
* falls back to `npm root -g` when the derived path does not exist.
|
|
432
|
+
*/
|
|
433
|
+
function getGlobalRoot() {
|
|
434
|
+
if (globalRootCached !== undefined)
|
|
435
|
+
return globalRootCached;
|
|
436
|
+
const derived = deriveGlobalRoot();
|
|
437
|
+
if (derived && existsSync(derived)) {
|
|
438
|
+
globalRootCached = derived;
|
|
439
|
+
return globalRootCached;
|
|
440
|
+
}
|
|
441
|
+
globalRootCached = discoverGlobalRootViaNpm();
|
|
442
|
+
return globalRootCached;
|
|
443
|
+
}
|
|
444
|
+
function deriveGlobalRoot() {
|
|
445
|
+
const prefix = process.env.NPM_CONFIG_PREFIX?.trim() || process.env.npm_config_prefix?.trim() || "";
|
|
446
|
+
const base = prefix || dirname(dirname(process.execPath));
|
|
447
|
+
if (!base)
|
|
448
|
+
return null;
|
|
449
|
+
return join(base, process.platform === "win32" ? "node_modules" : join("lib", "node_modules"));
|
|
450
|
+
}
|
|
451
|
+
function discoverGlobalRootViaNpm() {
|
|
452
|
+
try {
|
|
453
|
+
const result = spawn.sync("npm", ["root", "-g"], {
|
|
454
|
+
encoding: "utf-8",
|
|
455
|
+
timeout: GLOBAL_ROOT_TIMEOUT_MS,
|
|
456
|
+
});
|
|
457
|
+
if (result.status === 0) {
|
|
458
|
+
const path = String(result.stdout).trim();
|
|
459
|
+
if (path)
|
|
460
|
+
return path;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
catch {
|
|
464
|
+
// Ignore — global resolution simply stays unavailable.
|
|
465
|
+
}
|
|
466
|
+
return null;
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* Registry "latest" lookup for floating specs. Returns null on any failure
|
|
470
|
+
* (offline, timeout) so resolution degrades to the local state.
|
|
471
|
+
*/
|
|
472
|
+
async function fetchLatestVersion(packageName) {
|
|
473
|
+
return new Promise((resolvePromise) => {
|
|
474
|
+
let settled = false;
|
|
475
|
+
let timer;
|
|
476
|
+
const done = (value) => {
|
|
477
|
+
if (settled)
|
|
478
|
+
return;
|
|
479
|
+
settled = true;
|
|
480
|
+
if (timer)
|
|
481
|
+
clearTimeout(timer);
|
|
482
|
+
resolvePromise(value);
|
|
483
|
+
};
|
|
484
|
+
try {
|
|
485
|
+
const proc = spawn("npm", ["view", packageName, "version", "--json"], {
|
|
486
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
487
|
+
});
|
|
488
|
+
let out = "";
|
|
489
|
+
timer = setTimeout(() => {
|
|
490
|
+
proc.kill();
|
|
491
|
+
done(null);
|
|
492
|
+
}, REGISTRY_CHECK_TIMEOUT_MS);
|
|
493
|
+
timer.unref();
|
|
494
|
+
proc.stdout?.on("data", (chunk) => {
|
|
495
|
+
out += chunk.toString("utf-8");
|
|
496
|
+
});
|
|
497
|
+
proc.on("close", () => done(parseLatestVersionOutput(out)));
|
|
498
|
+
proc.on("error", () => done(null));
|
|
499
|
+
}
|
|
500
|
+
catch {
|
|
501
|
+
done(null);
|
|
502
|
+
}
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
function parseLatestVersionOutput(out) {
|
|
506
|
+
const raw = out.trim();
|
|
507
|
+
if (!raw)
|
|
508
|
+
return null;
|
|
509
|
+
let value = raw;
|
|
510
|
+
try {
|
|
511
|
+
const parsed = JSON.parse(raw);
|
|
512
|
+
if (typeof parsed === "string")
|
|
513
|
+
value = parsed;
|
|
514
|
+
}
|
|
515
|
+
catch {
|
|
516
|
+
value = raw.replace(/^["']|["']$/g, "");
|
|
517
|
+
}
|
|
518
|
+
return /^v?\d+\.\d+\.\d+/.test(value) ? value : null;
|
|
519
|
+
}
|
|
520
|
+
/** Semver-ish comparison; release beats prerelease, identifiers compare numerically when both numeric. */
|
|
521
|
+
export function compareVersions(a, b) {
|
|
522
|
+
const pa = parseVersion(a);
|
|
523
|
+
const pb = parseVersion(b);
|
|
524
|
+
if (!pa || !pb) {
|
|
525
|
+
// Unparseable — fall back to lexicographic so the comparison stays total.
|
|
526
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
527
|
+
}
|
|
528
|
+
for (const key of ["major", "minor", "patch"]) {
|
|
529
|
+
if (pa[key] !== pb[key])
|
|
530
|
+
return pa[key] < pb[key] ? -1 : 1;
|
|
531
|
+
}
|
|
532
|
+
return comparePrerelease(pa.prerelease, pb.prerelease);
|
|
533
|
+
}
|
|
534
|
+
function parseVersion(v) {
|
|
535
|
+
const m = /^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/.exec(v.trim());
|
|
536
|
+
if (!m)
|
|
537
|
+
return null;
|
|
538
|
+
return {
|
|
539
|
+
major: Number(m[1]),
|
|
540
|
+
minor: Number(m[2]),
|
|
541
|
+
patch: Number(m[3]),
|
|
542
|
+
prerelease: m[4] ? m[4].split(".") : null,
|
|
543
|
+
};
|
|
544
|
+
}
|
|
545
|
+
function comparePrerelease(a, b) {
|
|
546
|
+
if (!a && !b)
|
|
547
|
+
return 0;
|
|
548
|
+
if (!a)
|
|
549
|
+
return 1;
|
|
550
|
+
if (!b)
|
|
551
|
+
return -1;
|
|
552
|
+
const len = Math.max(a.length, b.length);
|
|
553
|
+
for (let i = 0; i < len; i++) {
|
|
554
|
+
const ai = a[i];
|
|
555
|
+
const bi = b[i];
|
|
556
|
+
if (ai === undefined)
|
|
557
|
+
return -1;
|
|
558
|
+
if (bi === undefined)
|
|
559
|
+
return 1;
|
|
560
|
+
const an = /^\d+$/.test(ai);
|
|
561
|
+
const bn = /^\d+$/.test(bi);
|
|
562
|
+
if (an && bn) {
|
|
563
|
+
const diff = Number(ai) - Number(bi);
|
|
564
|
+
if (diff !== 0)
|
|
565
|
+
return diff < 0 ? -1 : 1;
|
|
566
|
+
}
|
|
567
|
+
else if (an !== bn) {
|
|
568
|
+
return an ? -1 : 1;
|
|
569
|
+
}
|
|
570
|
+
else if (ai !== bi) {
|
|
571
|
+
return ai < bi ? -1 : 1;
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
return 0;
|
|
575
|
+
}
|
|
328
576
|
function getNpxCachePath() {
|
|
329
577
|
return getAgentPath("mcp-npx-cache.json");
|
|
330
578
|
}
|
|
@@ -350,7 +598,7 @@ function saveCacheEntry(key, entry) {
|
|
|
350
598
|
const cachePath = getNpxCachePath();
|
|
351
599
|
const dir = dirname(cachePath);
|
|
352
600
|
mkdirSync(dir, { recursive: true });
|
|
353
|
-
|
|
601
|
+
const merged = { version: CACHE_VERSION, entries: {} };
|
|
354
602
|
try {
|
|
355
603
|
if (existsSync(cachePath)) {
|
|
356
604
|
const existing = JSON.parse(readFileSync(cachePath, "utf-8"));
|
|
@@ -362,6 +610,13 @@ function saveCacheEntry(key, entry) {
|
|
|
362
610
|
catch {
|
|
363
611
|
// Ignore parse errors
|
|
364
612
|
}
|
|
613
|
+
// Prune entries that have not been re-resolved for 30 days.
|
|
614
|
+
const cutoff = Date.now() - CACHE_PRUNE_MS;
|
|
615
|
+
for (const [existingKey, existingEntry] of Object.entries(merged.entries)) {
|
|
616
|
+
if (existingEntry.resolvedAt < cutoff) {
|
|
617
|
+
delete merged.entries[existingKey];
|
|
618
|
+
}
|
|
619
|
+
}
|
|
365
620
|
merged.entries[key] = entry;
|
|
366
621
|
const tmpPath = `${cachePath}.${process.pid}.tmp`;
|
|
367
622
|
writeFileSync(tmpPath, JSON.stringify(merged, null, 2), "utf-8");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../../../src/sdk/agent-core/agent-loop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAGL,WAAW,
|
|
1
|
+
{"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../../../src/sdk/agent-core/agent-loop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAGL,WAAW,EAUZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,eAAe,EACf,YAAY,EACZ,SAAS,EACT,aAAa,EAEb,QAAQ,EACT,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAoCzE;;;GAGG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GAClB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CA2BzC;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GAClB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAkCzC;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GAClB,OAAO,CAAC,YAAY,EAAE,CAAC,CAgBzB;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GAClB,OAAO,CAAC,YAAY,EAAE,CAAC,CAiBzB;AAsxBD;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,CAYlG"}
|
|
@@ -2,14 +2,33 @@
|
|
|
2
2
|
* Agent loop that works with AgentMessage throughout.
|
|
3
3
|
* Transforms to Message[] only at the LLM call boundary.
|
|
4
4
|
*/
|
|
5
|
-
import { EventStream, streamSimple, validateToolArguments, } from "../ai/index.js";
|
|
5
|
+
import { EventStream, formatPaymentRequiredMessage, formatRateLimitRetryMessage, getRateLimitRetryDelayMs, isPaymentRequiredError, MAX_RATE_LIMIT_RETRIES, streamSimple, isRateLimitError, validateToolArguments, } from "../ai/index.js";
|
|
6
6
|
/** Maximum consecutive tool call errors before terminating the loop. */
|
|
7
7
|
const MAX_CONSECUTIVE_TOOL_ERRORS = 10;
|
|
8
8
|
/** Maximum retries for transient provider API errors. */
|
|
9
9
|
const MAX_API_RETRIES = 3;
|
|
10
10
|
/** Base backoff (ms) for transient API error retries; doubles per attempt. */
|
|
11
11
|
const API_RETRY_BASE_MS = 1000;
|
|
12
|
+
/** Shared transient-error classifier (excluding rate limits, which get their own schedule). */
|
|
13
|
+
const TRANSIENT_API_ERROR_RE = /overloaded|529|timeout|network|econnreset|fetch failed|socket connection was closed|connection.?closed|connection.?reset|socket hang up|other side closed|reset before headers|upstream.?connect|http2 request did not get a response/i;
|
|
12
14
|
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
15
|
+
/** Interval between keepalive ticks during long retry waits. */
|
|
16
|
+
const RETRY_WAIT_TICK_MS = 30_000;
|
|
17
|
+
/**
|
|
18
|
+
* Sleep for `ms`, invoking `onTick(elapsedMs)` roughly every
|
|
19
|
+
* RETRY_WAIT_TICK_MS while time remains. Keeps UI watchdogs fed and shows
|
|
20
|
+
* the user a countdown during long rate-limit waits (up to 180s each).
|
|
21
|
+
*/
|
|
22
|
+
async function sleepWithTicks(ms, onTick) {
|
|
23
|
+
let elapsed = 0;
|
|
24
|
+
while (ms - elapsed > RETRY_WAIT_TICK_MS) {
|
|
25
|
+
await sleep(RETRY_WAIT_TICK_MS);
|
|
26
|
+
elapsed += RETRY_WAIT_TICK_MS;
|
|
27
|
+
await onTick(elapsed);
|
|
28
|
+
}
|
|
29
|
+
if (ms > elapsed)
|
|
30
|
+
await sleep(ms - elapsed);
|
|
31
|
+
}
|
|
13
32
|
/**
|
|
14
33
|
* Start an agent loop with a new prompt message.
|
|
15
34
|
* The prompt is added to the context and events are emitted for it.
|
|
@@ -108,6 +127,7 @@ async function runLoop(initialContext, newMessages, initialConfig, signal, emit,
|
|
|
108
127
|
// Check for steering messages at start (user may have typed while waiting)
|
|
109
128
|
let pendingMessages = (await config.getSteeringMessages?.()) || [];
|
|
110
129
|
let apiRetryCount = 0;
|
|
130
|
+
let rateLimitRetryCount = 0;
|
|
111
131
|
let consecutiveToolErrors = 0;
|
|
112
132
|
// Outer loop: continues when queued follow-up messages arrive after agent would stop
|
|
113
133
|
while (true) {
|
|
@@ -137,8 +157,61 @@ async function runLoop(initialContext, newMessages, initialConfig, signal, emit,
|
|
|
137
157
|
// Fix 3: Retry on transient API errors (rate limit, overloaded, network),
|
|
138
158
|
// but NOT for safety refusals or signal-based aborts.
|
|
139
159
|
const errorMsg = message.errorMessage || "";
|
|
160
|
+
// HTTP 402 (credits / key limit exhausted) is not retryable — fail
|
|
161
|
+
// fast with a clear notice instead of burning retries.
|
|
162
|
+
if (!signal?.aborted && isPaymentRequiredError(errorMsg)) {
|
|
163
|
+
await emit({
|
|
164
|
+
type: "message_update",
|
|
165
|
+
message,
|
|
166
|
+
assistantMessageEvent: {
|
|
167
|
+
type: "text_delta",
|
|
168
|
+
contentIndex: 0,
|
|
169
|
+
delta: formatPaymentRequiredMessage(message.model),
|
|
170
|
+
partial: message,
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
await emit({ type: "turn_end", message, toolResults: [] });
|
|
174
|
+
await emit({ type: "agent_end", messages: newMessages });
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (!signal?.aborted &&
|
|
178
|
+
isRateLimitError(errorMsg) &&
|
|
179
|
+
rateLimitRetryCount < MAX_RATE_LIMIT_RETRIES) {
|
|
180
|
+
rateLimitRetryCount++;
|
|
181
|
+
const backoffMs = getRateLimitRetryDelayMs(rateLimitRetryCount);
|
|
182
|
+
await emit({
|
|
183
|
+
type: "message_update",
|
|
184
|
+
message,
|
|
185
|
+
assistantMessageEvent: {
|
|
186
|
+
type: "text_delta",
|
|
187
|
+
contentIndex: 0,
|
|
188
|
+
delta: formatRateLimitRetryMessage(rateLimitRetryCount, backoffMs),
|
|
189
|
+
partial: message,
|
|
190
|
+
},
|
|
191
|
+
});
|
|
192
|
+
// Long waits stream a visible countdown so the user (and UI
|
|
193
|
+
// inactivity watchdogs) can see the run is alive, not hung.
|
|
194
|
+
await sleepWithTicks(backoffMs, async (elapsedMs) => {
|
|
195
|
+
await emit({
|
|
196
|
+
type: "message_update",
|
|
197
|
+
message,
|
|
198
|
+
assistantMessageEvent: {
|
|
199
|
+
type: "text_delta",
|
|
200
|
+
contentIndex: 0,
|
|
201
|
+
delta: ` …waiting ${Math.round(elapsedMs / 1000)}s of ${Math.round(backoffMs / 1000)}s`,
|
|
202
|
+
partial: message,
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
// Remove the failed assistant message so we can re-stream this turn.
|
|
207
|
+
newMessages.pop();
|
|
208
|
+
currentContext.messages.pop();
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
140
211
|
const isTransientError = !signal?.aborted &&
|
|
141
|
-
|
|
212
|
+
!isPaymentRequiredError(errorMsg) &&
|
|
213
|
+
!isRateLimitError(errorMsg) &&
|
|
214
|
+
TRANSIENT_API_ERROR_RE.test(errorMsg);
|
|
142
215
|
if (isTransientError && apiRetryCount < MAX_API_RETRIES) {
|
|
143
216
|
apiRetryCount++;
|
|
144
217
|
const backoffMs = API_RETRY_BASE_MS * Math.pow(2, apiRetryCount - 1); // 1000, 2000, 4000
|
|
@@ -162,6 +235,10 @@ async function runLoop(initialContext, newMessages, initialConfig, signal, emit,
|
|
|
162
235
|
await emit({ type: "agent_end", messages: newMessages });
|
|
163
236
|
return;
|
|
164
237
|
}
|
|
238
|
+
// Successful stream: reset the retry budgets so a later transient
|
|
239
|
+
// failure in this run gets a fresh set of retries.
|
|
240
|
+
apiRetryCount = 0;
|
|
241
|
+
rateLimitRetryCount = 0;
|
|
165
242
|
// Check for tool calls
|
|
166
243
|
const toolCalls = message.content.filter((c) => c.type === "toolCall");
|
|
167
244
|
const toolResults = [];
|
package/dist/sdk/ai/index.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ export * from "./utils/event-stream.js";
|
|
|
16
16
|
export * from "./utils/json-parse.js";
|
|
17
17
|
export type { OAuthAuthInfo, OAuthCredentials, OAuthDeviceCodeInfo, OAuthLoginCallbacks, OAuthPrompt, OAuthProvider, OAuthProviderId, OAuthProviderInfo, OAuthProviderInterface, OAuthSelectOption, OAuthSelectPrompt, } from "./utils/oauth/types.js";
|
|
18
18
|
export * from "./utils/overflow.js";
|
|
19
|
+
export * from "./utils/rate-limit-retry.js";
|
|
19
20
|
export * from "./utils/typebox-helpers.js";
|
|
20
21
|
export * from "./utils/validation.js";
|
|
21
22
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sdk/ai/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kCAAkC,CAAC;AACjD,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,YAAY,EACX,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,GACjB,MAAM,wBAAwB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sdk/ai/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kCAAkC,CAAC;AACjD,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,YAAY,EACX,aAAa,EACb,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,GACjB,MAAM,wBAAwB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC"}
|
package/dist/sdk/ai/index.js
CHANGED
|
@@ -14,5 +14,6 @@ export * from "./utils/diagnostics.js";
|
|
|
14
14
|
export * from "./utils/event-stream.js";
|
|
15
15
|
export * from "./utils/json-parse.js";
|
|
16
16
|
export * from "./utils/overflow.js";
|
|
17
|
+
export * from "./utils/rate-limit-retry.js";
|
|
17
18
|
export * from "./utils/typebox-helpers.js";
|
|
18
19
|
export * from "./utils/validation.js";
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider error handling shared by the agent-core agent loop, the
|
|
3
|
+
* coding-agent auto-retry, and the server error humanizer.
|
|
4
|
+
*
|
|
5
|
+
* Rate limits (HTTP 429): instead of surfacing the raw provider error JSON
|
|
6
|
+
* we retry with an escalating backoff — 2s, 10s, 45s, 90s, 180s, then a
|
|
7
|
+
* further 20 retries spaced 180s apart. This gives the provider quota
|
|
8
|
+
* roughly an hour to recover before the run is allowed to fail.
|
|
9
|
+
*
|
|
10
|
+
* Payment required (HTTP 402): retrying cannot help (credits / key limit
|
|
11
|
+
* exhausted), so the run fails fast with a clear contact-support message
|
|
12
|
+
* instead of the raw provider error JSON.
|
|
13
|
+
*
|
|
14
|
+
* @module @spectral/ai/utils/rate-limit-retry
|
|
15
|
+
*/
|
|
16
|
+
/** Escalating backoff (ms) for the first rate-limit retries. */
|
|
17
|
+
export declare const RATE_LIMIT_RETRY_DELAYS_MS: readonly [2000, 10000, 45000, 90000, 180000];
|
|
18
|
+
/** Additional retries after the escalating table, all at the final delay. */
|
|
19
|
+
export declare const RATE_LIMIT_STEADY_RETRIES = 20;
|
|
20
|
+
/** Total rate-limit retries before giving up: 5 escalating + 20 steady. */
|
|
21
|
+
export declare const MAX_RATE_LIMIT_RETRIES: number;
|
|
22
|
+
/**
|
|
23
|
+
* Check whether an error message (which may embed a raw provider JSON blob)
|
|
24
|
+
* indicates the request was rejected with a rate limit / 429.
|
|
25
|
+
*/
|
|
26
|
+
export declare function isRateLimitError(text: string): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Backoff for the Nth rate-limit retry (1-based).
|
|
29
|
+
* Attempts 1-5 follow the escalating table; attempts 6-25 wait 180s each.
|
|
30
|
+
*/
|
|
31
|
+
export declare function getRateLimitRetryDelayMs(attempt: number): number;
|
|
32
|
+
/** User-facing retry notice, e.g. "Model provider rate limit hit, retrying in 45s (attempt 3/25)…" */
|
|
33
|
+
export declare function formatRateLimitRetryMessage(attempt: number, delayMs: number): string;
|
|
34
|
+
/**
|
|
35
|
+
* Check whether an error message (which may embed a raw provider JSON blob)
|
|
36
|
+
* indicates the request was rejected with HTTP 402 — credits or per-key
|
|
37
|
+
* limit exhausted. Unlike rate limits, this is not retryable.
|
|
38
|
+
*/
|
|
39
|
+
export declare function isPaymentRequiredError(text: string): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* User-facing notice for 402 rejections. From the user's perspective the
|
|
42
|
+
* model budget is managed on the aexol.ai side, so point them at support.
|
|
43
|
+
*/
|
|
44
|
+
export declare function formatPaymentRequiredMessage(model?: string): string;
|
|
45
|
+
//# sourceMappingURL=rate-limit-retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit-retry.d.ts","sourceRoot":"","sources":["../../../../src/sdk/ai/utils/rate-limit-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,gEAAgE;AAChE,eAAO,MAAM,0BAA0B,8CAM7B,CAAC;AAEX,6EAA6E;AAC7E,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C,2EAA2E;AAC3E,eAAO,MAAM,sBAAsB,QAC2B,CAAC;AAK/D;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKhE;AAED,sGAAsG;AACtG,wBAAgB,2BAA2B,CAC1C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACb,MAAM,CAGR;AAKD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAInE"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider error handling shared by the agent-core agent loop, the
|
|
3
|
+
* coding-agent auto-retry, and the server error humanizer.
|
|
4
|
+
*
|
|
5
|
+
* Rate limits (HTTP 429): instead of surfacing the raw provider error JSON
|
|
6
|
+
* we retry with an escalating backoff — 2s, 10s, 45s, 90s, 180s, then a
|
|
7
|
+
* further 20 retries spaced 180s apart. This gives the provider quota
|
|
8
|
+
* roughly an hour to recover before the run is allowed to fail.
|
|
9
|
+
*
|
|
10
|
+
* Payment required (HTTP 402): retrying cannot help (credits / key limit
|
|
11
|
+
* exhausted), so the run fails fast with a clear contact-support message
|
|
12
|
+
* instead of the raw provider error JSON.
|
|
13
|
+
*
|
|
14
|
+
* @module @spectral/ai/utils/rate-limit-retry
|
|
15
|
+
*/
|
|
16
|
+
/** Escalating backoff (ms) for the first rate-limit retries. */
|
|
17
|
+
export const RATE_LIMIT_RETRY_DELAYS_MS = [
|
|
18
|
+
2_000,
|
|
19
|
+
10_000,
|
|
20
|
+
45_000,
|
|
21
|
+
90_000,
|
|
22
|
+
180_000,
|
|
23
|
+
];
|
|
24
|
+
/** Additional retries after the escalating table, all at the final delay. */
|
|
25
|
+
export const RATE_LIMIT_STEADY_RETRIES = 20;
|
|
26
|
+
/** Total rate-limit retries before giving up: 5 escalating + 20 steady. */
|
|
27
|
+
export const MAX_RATE_LIMIT_RETRIES = RATE_LIMIT_RETRY_DELAYS_MS.length + RATE_LIMIT_STEADY_RETRIES;
|
|
28
|
+
const RATE_LIMIT_ERROR_RE = /\b429\b|rate.?limit|too many requests|resource.?exhausted/i;
|
|
29
|
+
/**
|
|
30
|
+
* Check whether an error message (which may embed a raw provider JSON blob)
|
|
31
|
+
* indicates the request was rejected with a rate limit / 429.
|
|
32
|
+
*/
|
|
33
|
+
export function isRateLimitError(text) {
|
|
34
|
+
return RATE_LIMIT_ERROR_RE.test(text);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Backoff for the Nth rate-limit retry (1-based).
|
|
38
|
+
* Attempts 1-5 follow the escalating table; attempts 6-25 wait 180s each.
|
|
39
|
+
*/
|
|
40
|
+
export function getRateLimitRetryDelayMs(attempt) {
|
|
41
|
+
if (attempt <= RATE_LIMIT_RETRY_DELAYS_MS.length) {
|
|
42
|
+
return RATE_LIMIT_RETRY_DELAYS_MS[attempt - 1];
|
|
43
|
+
}
|
|
44
|
+
return RATE_LIMIT_RETRY_DELAYS_MS[RATE_LIMIT_RETRY_DELAYS_MS.length - 1];
|
|
45
|
+
}
|
|
46
|
+
/** User-facing retry notice, e.g. "Model provider rate limit hit, retrying in 45s (attempt 3/25)…" */
|
|
47
|
+
export function formatRateLimitRetryMessage(attempt, delayMs) {
|
|
48
|
+
const seconds = Math.round(delayMs / 1000);
|
|
49
|
+
return `Model provider rate limit hit, retrying in ${seconds}s (attempt ${attempt}/${MAX_RATE_LIMIT_RETRIES})…`;
|
|
50
|
+
}
|
|
51
|
+
const PAYMENT_REQUIRED_ERROR_RE = /\b402\b|payment required|insufficient (?:credits?|funds|balance)|key limit/i;
|
|
52
|
+
/**
|
|
53
|
+
* Check whether an error message (which may embed a raw provider JSON blob)
|
|
54
|
+
* indicates the request was rejected with HTTP 402 — credits or per-key
|
|
55
|
+
* limit exhausted. Unlike rate limits, this is not retryable.
|
|
56
|
+
*/
|
|
57
|
+
export function isPaymentRequiredError(text) {
|
|
58
|
+
return PAYMENT_REQUIRED_ERROR_RE.test(text);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* User-facing notice for 402 rejections. From the user's perspective the
|
|
62
|
+
* model budget is managed on the aexol.ai side, so point them at support.
|
|
63
|
+
*/
|
|
64
|
+
export function formatPaymentRequiredMessage(model) {
|
|
65
|
+
return model
|
|
66
|
+
? `There is a problem on the aexol.ai side with model ${model} — contact support.`
|
|
67
|
+
: "There is a problem on the aexol.ai side with the model — contact support.";
|
|
68
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session.d.ts","sourceRoot":"","sources":["../../../../src/sdk/coding-agent/core/agent-session.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent-session.d.ts","sourceRoot":"","sources":["../../../../src/sdk/coding-agent/core/agent-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
16
16
|
import { basename, dirname } from "node:path";
|
|
17
|
-
import { clampThinkingLevel, cleanupSessionResources, getSupportedThinkingLevels, isContextOverflow, modelsAreEqual, resetApiProviders, } from "../../ai/index.js";
|
|
17
|
+
import { clampThinkingLevel, cleanupSessionResources, MAX_RATE_LIMIT_RETRIES, getRateLimitRetryDelayMs, isPaymentRequiredError, isRateLimitError, getSupportedThinkingLevels, isContextOverflow, modelsAreEqual, resetApiProviders, } from "../../ai/index.js";
|
|
18
18
|
import { stripFrontmatter } from "../utils/frontmatter.js";
|
|
19
19
|
import { resolvePath } from "../utils/paths.js";
|
|
20
20
|
import { sleep } from "../utils/sleep.js";
|
|
@@ -460,13 +460,17 @@ export class AgentSession {
|
|
|
460
460
|
}
|
|
461
461
|
_willRetryAfterAgentEnd(event) {
|
|
462
462
|
const settings = this.settingsManager.getRetrySettings();
|
|
463
|
-
if (!settings.enabled || this._retryAttempt >= settings.maxRetries) {
|
|
464
|
-
return false;
|
|
465
|
-
}
|
|
466
463
|
for (let i = event.messages.length - 1; i >= 0; i--) {
|
|
467
464
|
const message = event.messages[i];
|
|
468
465
|
if (message.role === "assistant") {
|
|
469
|
-
|
|
466
|
+
const assistantMsg = message;
|
|
467
|
+
if (!this._isRetryableError(assistantMsg))
|
|
468
|
+
return false;
|
|
469
|
+
// Rate-limit rejections get an extended retry budget (see _prepareRetry).
|
|
470
|
+
const limit = isRateLimitError(assistantMsg.errorMessage || "")
|
|
471
|
+
? MAX_RATE_LIMIT_RETRIES
|
|
472
|
+
: settings.maxRetries;
|
|
473
|
+
return this._retryAttempt < limit;
|
|
470
474
|
}
|
|
471
475
|
}
|
|
472
476
|
return false;
|
|
@@ -2629,6 +2633,9 @@ export class AgentSession {
|
|
|
2629
2633
|
_isRetryableError(message) {
|
|
2630
2634
|
if (message.stopReason !== "error" || !message.errorMessage)
|
|
2631
2635
|
return false;
|
|
2636
|
+
// Payment required (402) is a billing problem — retries cannot help.
|
|
2637
|
+
if (isPaymentRequiredError(message.errorMessage))
|
|
2638
|
+
return false;
|
|
2632
2639
|
// Context overflow is handled by compaction, not retry
|
|
2633
2640
|
const contextWindow = this.model?.contextWindow ?? 0;
|
|
2634
2641
|
if (isContextOverflow(message, contextWindow))
|
|
@@ -2647,16 +2654,25 @@ export class AgentSession {
|
|
|
2647
2654
|
return false;
|
|
2648
2655
|
}
|
|
2649
2656
|
this._retryAttempt++;
|
|
2650
|
-
|
|
2657
|
+
// Rate-limit rejections (HTTP 429) get an extended schedule: 2s, 10s,
|
|
2658
|
+
// 45s, 90s, 180s, then 20 further retries spaced 180s apart. Other
|
|
2659
|
+
// transient errors keep the settings-driven exponential backoff.
|
|
2660
|
+
const isRateLimit = isRateLimitError(message.errorMessage || "");
|
|
2661
|
+
const maxAttempts = isRateLimit
|
|
2662
|
+
? MAX_RATE_LIMIT_RETRIES
|
|
2663
|
+
: settings.maxRetries;
|
|
2664
|
+
if (this._retryAttempt > maxAttempts) {
|
|
2651
2665
|
// Preserve the completed attempt count so post-run handling can emit the final failure.
|
|
2652
2666
|
this._retryAttempt--;
|
|
2653
2667
|
return false;
|
|
2654
2668
|
}
|
|
2655
|
-
const delayMs =
|
|
2669
|
+
const delayMs = isRateLimit
|
|
2670
|
+
? getRateLimitRetryDelayMs(this._retryAttempt)
|
|
2671
|
+
: settings.baseDelayMs * 2 ** (this._retryAttempt - 1);
|
|
2656
2672
|
this._emit({
|
|
2657
2673
|
type: "auto_retry_start",
|
|
2658
2674
|
attempt: this._retryAttempt,
|
|
2659
|
-
maxAttempts
|
|
2675
|
+
maxAttempts,
|
|
2660
2676
|
delayMs,
|
|
2661
2677
|
errorMessage: message.errorMessage || "Unknown error",
|
|
2662
2678
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-bridge.d.ts","sourceRoot":"","sources":["../../src/server/agent-bridge.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"agent-bridge.d.ts","sourceRoot":"","sources":["../../src/server/agent-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAaH,OAAO,EAQL,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EAEtB,MAAM,8BAA8B,CAAC;AAatC,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,8BAA8B,CAAC;AAatC,OAAO,EACL,kBAAkB,IAAI,yBAAyB,EAEhD,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG3E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,UAAU,4BAA4B;IACpC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;CACpC;AAiBD,sEAAsE;AACtE,MAAM,MAAM,oBAAoB,GAAG,OAAO,yBAAyB,CAAC;AAmCpE,MAAM,WAAW,kBAAkB;IACjC,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2EAA2E;IAC3E,GAAG,EAAE,MAAM,CAAC;IACZ,qFAAqF;IACrF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;OAKG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,IAAI,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACnC;;;;;OAKG;IACH,0BAA0B,EAAE,CAAC,GAAG,EAAE;QAChC,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,6EAA6E;QAC7E,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,KAAK,IAAI,CAAC;IACX;;;OAGG;IACH,yBAAyB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;IAC/B;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACxB;;;;OAIG;IACH,cAAc,CAAC,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAC9C;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,oBAAoB,CAAC;IAC1C;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC;;;;;;;;;;;OAWG;IACH,yBAAyB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtE;AA+iBD,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAC,CAAe;IAC/B,OAAO,CAAC,iCAAiC,CAAqB;IAC9D,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,WAAW,CAAC,CAAa;IACjC,OAAO,CAAC,OAAO,CAAC,CAA0B;IAC1C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,IAAI,CAAqB;IACjC;;;;;OAKG;IACH,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC;;;;OAIG;IACH,OAAO,CAAC,aAAa,CAAC,CAAiB;IACvC;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB,CAAC,CAAS;IAEpC,OAAO,CAAC,mBAAmB,CAAC,CAAgC;IAC5D,OAAO,CAAC,YAAY,CAAC,CAAuB;IAC5C,8EAA8E;IAC9E,OAAO,CAAC,kBAAkB,CAAC,CAAgC;IAC3D;;;;;;;;OAQG;IACH,OAAO,CAAC,eAAe,CAAK;IAC5B,sFAAsF;IACtF,OAAO,CAAC,iBAAiB,CAMT;IAChB,OAAO,CAAC,WAAW,CACuD;IAC1E,OAAO,CAAC,mBAAmB,CAA+B;IAC1D;;;;OAIG;IACH,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,cAAc,CAAC,CAA2B;IAClD,OAAO,CAAC,mBAAmB,CAAC,CAAgC;IAC5D;;;;;OAKG;IACH,OAAO,CAAC,wBAAwB,CAO5B;gBAEQ,IAAI,EAAE,kBAAkB;IAIpC;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA0X5B,OAAO,CAAC,4BAA4B;IAQpC;;;;;OAKG;YACW,qBAAqB;IAcnC;;;OAGG;IACG,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAG3C;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAmC3B,OAAO,CAAC,sBAAsB;YAahB,oBAAoB;IAoBlC;;;;;;;;;;;;OAYG;IACH;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,0BAA0B;IA6ElC;;;;;;;;;;;;;;;OAeG;IACH;;;;;;;;OAQG;IACH,wBAAwB,IAAI,MAAM,GAAG,SAAS;IAI9C;;;;OAIG;IACH,eAAe,IACX;QAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GACxE,SAAS;IAIb,mDAAmD;IACnD,WAAW,IAAI,OAAO;IAItB,mEAAmE;IACnE,UAAU,IAAI,OAAO;IAIrB,2EAA2E;IAC3E,MAAM,IAAI,OAAO;IAIjB,gBAAgB,IAAI,KAAK,CAAC;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IAgBF,iBAAiB,IAAI;QACnB,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,YAAY,GAAG,YAAY,GAAG,SAAS,CAAC;QACtE,QAAQ,EAAE;YACR,QAAQ,EAAE,OAAO,CAAC;YAClB,UAAU,EAAE,OAAO,CAAC;YACpB,UAAU,EAAE,OAAO,CAAC;YACpB,MAAM,EAAE,OAAO,CAAC;SACjB,CAAC;KACH;IAYD,OAAO,CAAC,iBAAiB;IAmCnB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IA2DpE;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,iCAAiC;IAkBzC;;;;;;OAMG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAoBpD;;;;;;;;;OASG;IACH,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAI7D;;;;;;;;;;;;OAYG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgDrE;;;;;;;;OAQG;YACW,iBAAiB;IAwB/B;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,0BAA0B;IAiBlC;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IAM1B,2EAA2E;IAC3E,OAAO,CAAC,6BAA6B;IAUrC;;;;OAIG;IACH,OAAO,CAAC,8BAA8B;IAQtC,yEAAyE;IACzE,OAAO,CAAC,iCAAiC;IAOzC,OAAO,CAAC,iBAAiB;IAazB;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IAc/B,OAAO,CAAC,uBAAuB;IAMzB,OAAO,CACX,OAAO,CAAC,EAAE,MAAM,GAAG,4BAA4B,GAC9C,OAAO,CAAC,gBAAgB,CAAC;IAY5B,OAAO,IAAI,IAAI;IA6Bf;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAqBrB;;;;;;;;OAQG;IACH,OAAO,CAAC,6BAA6B;IAiCrC;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAiB7B,uEAAuE;IACvE,OAAO,CAAC,wBAAwB;IAMhC;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,sBAAsB;IAwD9B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,EAAE,iBAAiB,GAAG,IAAI;CAskBzC"}
|
|
@@ -2061,6 +2061,9 @@ export class AgentBridge {
|
|
|
2061
2061
|
.stopReason;
|
|
2062
2062
|
const errorMessage = ev.message
|
|
2063
2063
|
.errorMessage;
|
|
2064
|
+
// Raw upstream provider errors (e.g. 429 JSON blobs with internal
|
|
2065
|
+
// ids) must not reach the UI verbatim — same policy as the `error`
|
|
2066
|
+
// ServerEvent path. The humanizer keeps a short, sanitized cause.
|
|
2064
2067
|
const endEvent = stopReason
|
|
2065
2068
|
? {
|
|
2066
2069
|
type: "message_end",
|
|
@@ -2070,7 +2073,7 @@ export class AgentBridge {
|
|
|
2070
2073
|
...(stopReason === "error" &&
|
|
2071
2074
|
typeof errorMessage === "string" &&
|
|
2072
2075
|
errorMessage.length > 0
|
|
2073
|
-
? { errorMessage }
|
|
2076
|
+
? { errorMessage: humanizeProviderError(errorMessage) }
|
|
2074
2077
|
: {}),
|
|
2075
2078
|
}
|
|
2076
2079
|
: { type: "message_end", messageId };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-humanizer.d.ts","sourceRoot":"","sources":["../../src/server/error-humanizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"error-humanizer.d.ts","sourceRoot":"","sources":["../../src/server/error-humanizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,QACsN,CAAC;AAqC3P;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAkB1D"}
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
* keep a sanitized version of their underlying cause so the UI can show what
|
|
12
12
|
* actually happened instead of only a generic fallback.
|
|
13
13
|
*/
|
|
14
|
+
import { formatPaymentRequiredMessage, isPaymentRequiredError } from "../sdk/ai/utils/rate-limit-retry.js";
|
|
14
15
|
/**
|
|
15
16
|
* Classification regex reused from agent-loop.ts (retry classification).
|
|
16
17
|
* Matches transient provider errors: rate limits, overload, timeouts, and
|
|
@@ -70,6 +71,11 @@ function toErrorString(err) {
|
|
|
70
71
|
*/
|
|
71
72
|
export function humanizeProviderError(err) {
|
|
72
73
|
const text = toErrorString(err);
|
|
74
|
+
// HTTP 402 — credits / per-key limit exhausted on the provider account.
|
|
75
|
+
// Retrying cannot help; surface the contact-support notice.
|
|
76
|
+
if (isPaymentRequiredError(text)) {
|
|
77
|
+
return formatPaymentRequiredMessage();
|
|
78
|
+
}
|
|
73
79
|
// "too many requests" and "temporarily rate-limited" are covered by the
|
|
74
80
|
// shared regex via the `rate.?limit` and `429` alternations; rate-limit
|
|
75
81
|
// and overload signals take priority over network signals.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/projects.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAQlE,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,YAAY,EACnB,EAAE,EAAE,MAAM,EACV,KAAK,SAAK,GACT,sBAAsB,EAAE,CAI1B;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/projects.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,7 +42,10 @@ export function handleCreateProject(store, body) {
|
|
|
42
42
|
if (typeof body.path !== "string" || !body.path.trim()) {
|
|
43
43
|
throw new BadRequestError("path (non-empty string) is required");
|
|
44
44
|
}
|
|
45
|
-
|
|
45
|
+
// Strict opt-in: only a literal JSON `true` enables directory creation.
|
|
46
|
+
// Any other type ("true", 1, null) is ignored rather than coerced.
|
|
47
|
+
const createIfMissing = typeof body.createIfMissing === "boolean" && body.createIfMissing === true;
|
|
48
|
+
const validation = validateProjectPath(body.path, { createIfMissing });
|
|
46
49
|
if (!validation.ok) {
|
|
47
50
|
throw new BadRequestError(validation.error ?? "Invalid path");
|
|
48
51
|
}
|
package/dist/server/paths.d.ts
CHANGED
|
@@ -12,6 +12,11 @@
|
|
|
12
12
|
* readable. We do NOT attempt to verify writability — spectral may want to
|
|
13
13
|
* create files inside it, but failure modes there surface naturally
|
|
14
14
|
* through spectral's tools, and a write probe here would create stray files.
|
|
15
|
+
* - Create-if-missing: `validateProjectPath(path, {createIfMissing:true})`
|
|
16
|
+
* creates the directory (recursively) before validating. Used by POST
|
|
17
|
+
* /api/projects so users can point at a brand-new folder; mkdir failures
|
|
18
|
+
* surface as `Cannot create directory:` errors, while everything else
|
|
19
|
+
* falls through the normal existence/type checks below.
|
|
15
20
|
*
|
|
16
21
|
* Both helpers are synchronous because they're called on hot HTTP paths
|
|
17
22
|
* (POST /api/projects) where blocking is acceptable: the operation is rare
|
|
@@ -46,6 +51,12 @@ export interface ProjectPathValidation {
|
|
|
46
51
|
* Returns `{ok:true, path}` for a real, accessible directory. On failure,
|
|
47
52
|
* `error` carries a message suitable for surfacing to the user. The expanded
|
|
48
53
|
* path is included in both cases so callers can echo it back in errors.
|
|
54
|
+
*
|
|
55
|
+
* With `options.createIfMissing`, a missing path is created recursively first
|
|
56
|
+
* (project creation should not require a prior manual `mkdir`), then validated
|
|
57
|
+
* like any other path.
|
|
49
58
|
*/
|
|
50
|
-
export declare function validateProjectPath(input: string
|
|
59
|
+
export declare function validateProjectPath(input: string, options?: {
|
|
60
|
+
createIfMissing?: boolean;
|
|
61
|
+
}): ProjectPathValidation;
|
|
51
62
|
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/server/paths.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/server/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAMH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAehD;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,OAAO,CAAC;IACZ,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GAC1C,qBAAqB,CA2BvB"}
|
package/dist/server/paths.js
CHANGED
|
@@ -12,13 +12,18 @@
|
|
|
12
12
|
* readable. We do NOT attempt to verify writability — spectral may want to
|
|
13
13
|
* create files inside it, but failure modes there surface naturally
|
|
14
14
|
* through spectral's tools, and a write probe here would create stray files.
|
|
15
|
+
* - Create-if-missing: `validateProjectPath(path, {createIfMissing:true})`
|
|
16
|
+
* creates the directory (recursively) before validating. Used by POST
|
|
17
|
+
* /api/projects so users can point at a brand-new folder; mkdir failures
|
|
18
|
+
* surface as `Cannot create directory:` errors, while everything else
|
|
19
|
+
* falls through the normal existence/type checks below.
|
|
15
20
|
*
|
|
16
21
|
* Both helpers are synchronous because they're called on hot HTTP paths
|
|
17
22
|
* (POST /api/projects) where blocking is acceptable: the operation is rare
|
|
18
23
|
* and the user is waiting on the response anyway. `node:fs` sync calls in
|
|
19
24
|
* this regime are simpler than juggling promises through validation.
|
|
20
25
|
*/
|
|
21
|
-
import { existsSync, statSync } from "node:fs";
|
|
26
|
+
import { existsSync, mkdirSync, statSync } from "node:fs";
|
|
22
27
|
import { homedir } from "node:os";
|
|
23
28
|
import { isAbsolute, resolve, sep } from "node:path";
|
|
24
29
|
/**
|
|
@@ -57,13 +62,26 @@ export function expandPath(input) {
|
|
|
57
62
|
* Returns `{ok:true, path}` for a real, accessible directory. On failure,
|
|
58
63
|
* `error` carries a message suitable for surfacing to the user. The expanded
|
|
59
64
|
* path is included in both cases so callers can echo it back in errors.
|
|
65
|
+
*
|
|
66
|
+
* With `options.createIfMissing`, a missing path is created recursively first
|
|
67
|
+
* (project creation should not require a prior manual `mkdir`), then validated
|
|
68
|
+
* like any other path.
|
|
60
69
|
*/
|
|
61
|
-
export function validateProjectPath(input) {
|
|
70
|
+
export function validateProjectPath(input, options = {}) {
|
|
62
71
|
const path = expandPath(input);
|
|
63
72
|
let st;
|
|
64
73
|
try {
|
|
65
74
|
if (!existsSync(path)) {
|
|
66
|
-
|
|
75
|
+
if (!options.createIfMissing) {
|
|
76
|
+
return { ok: false, path, error: `Path does not exist: ${path}` };
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
mkdirSync(path, { recursive: true });
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
83
|
+
return { ok: false, path, error: `Cannot create directory: ${msg}` };
|
|
84
|
+
}
|
|
67
85
|
}
|
|
68
86
|
st = statSync(path);
|
|
69
87
|
}
|