@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.
@@ -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,EAyCtC,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"}
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"}
@@ -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 reviewer subagents.",
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\nDelegate the actual work to the appropriate subagent instead of doing it yourself; use `researcher` for research/investigation, `executor` for implementation, and `reviewer` for review.",
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 declare function resolveNpxBinary(command: string, args: string[]): Promise<NpxResolution | null>;
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":"AAqBA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;CACf;AAQD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAgC/B"}
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"}
@@ -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
- export async function resolveNpxBinary(command, args) {
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 { binPath: cached.resolvedBin, extraArgs: parsed.extraArgs, isJs: cached.isJs };
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
- const resolved = resolveFromNpmCache(parsed.packageSpec, parsed.binName);
23
- if (resolved) {
24
- saveCacheEntry(cacheKey, resolved);
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
- await forceNpxCache(parsed.packageSpec);
29
- const resolvedAfterInstall = resolveFromNpmCache(parsed.packageSpec, parsed.binName);
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 { binPath: resolvedAfterInstall.resolvedBin, extraArgs: parsed.extraArgs, isJs: resolvedAfterInstall.isJs };
72
+ return toResolution(resolvedAfterInstall, parsed.extraArgs);
33
73
  }
34
74
  return null;
35
75
  }
36
- function parseNpxArgs(args) {
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 resolveFromNpmCache(packageSpec, binName) {
132
- const cacheDir = getNpmCacheDir();
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 candidates = buildBinCandidates(packageName, binName);
155
- let chosenBinName;
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 = chosenBinName ? join(nodeModulesDir, ".bin", chosenBinName) : null;
181
- let resolvedBin = binLink && existsSync(binLink) ? safeRealpath(binLink) : "";
258
+ const binLink = join(nodeModulesDir, ".bin", picked.name);
259
+ let resolvedBin = existsSync(binLink) ? safeRealpath(binLink) : "";
182
260
  if (!resolvedBin) {
183
- resolvedBin = resolve(packageDir, binRel);
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((resolve, reject) => {
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
- reject(new Error("timeout"));
279
+ rejectPromise(new Error("timeout"));
203
280
  }, FORCE_CACHE_TIMEOUT_MS);
204
281
  timer.unref();
205
- proc.on("close", () => { clearTimeout(timer); resolve(); });
206
- proc.on("error", (err) => { clearTimeout(timer); reject(err); });
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
- .sort((a, b) => b.mtime - a.mtime);
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
- let merged = { version: CACHE_VERSION, entries: {} };
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,EAIZ,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;AAYzE;;;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;AA2tBD;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,CAYlG"}
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
- /rate.?limit|429|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.test(errorMsg);
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 = [];
@@ -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"}
@@ -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
- return this._isRetryableError(message);
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
- if (this._retryAttempt > settings.maxRetries) {
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 = settings.baseDelayMs * 2 ** (this._retryAttempt - 1);
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: settings.maxRetries,
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":"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;CAmkBzC"}
1
+ {"version":3,"file":"agent-bridge.d.ts","sourceRoot":"","sources":["../../src/server/agent-bridge.ts"],"names":[],"mappings":"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"}
@@ -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;AAEH;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,QACsN,CAAC;AAqC3P;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAa1D"}
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.
@@ -32,6 +32,7 @@ export declare function handleGetProjectObservations(store: SessionStore, id: st
32
32
  export interface CreateProjectInputRaw {
33
33
  name?: unknown;
34
34
  path?: unknown;
35
+ createIfMissing?: unknown;
35
36
  }
36
37
  export interface UpdateProjectInputRaw {
37
38
  name?: unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../../src/server/handlers/projects.ts"],"names":[],"mappings":"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"}
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
- const validation = validateProjectPath(body.path);
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
  }
@@ -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): ProjectPathValidation;
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;;;;;;;;;;;;;;;;;;;GAmBG;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;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB,CAmBxE"}
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"}
@@ -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
- return { ok: false, path, error: `Path does not exist: ${path}` };
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aexol/spectral",
3
- "version": "0.9.205",
3
+ "version": "0.9.207",
4
4
  "description": "AI coding agent for Aexol with relay-based browser access.",
5
5
  "type": "module",
6
6
  "private": false,