@kody-ade/kody-engine 0.4.593 → 0.4.595

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.
Files changed (2) hide show
  1. package/dist/bin/kody.js +29 -2
  2. package/package.json +1 -1
package/dist/bin/kody.js CHANGED
@@ -15,7 +15,7 @@ var init_package = __esm({
15
15
  "package.json"() {
16
16
  package_default = {
17
17
  name: "@kody-ade/kody-engine",
18
- version: "0.4.593",
18
+ version: "0.4.595",
19
19
  description: "kody \u2014 autonomous development engine. Single-session Claude Code agent behind a generic executor + declarative implementation profiles.",
20
20
  license: "MIT",
21
21
  type: "module",
@@ -4180,6 +4180,7 @@ async function runAgent(opts) {
4180
4180
  env.ANTHROPIC_BASE_URL = opts.litellmUrl;
4181
4181
  env.ANTHROPIC_API_KEY = getAnthropicApiKeyOrDummy();
4182
4182
  }
4183
+ if (opts.stopOnRateLimit) env.CLAUDE_CODE_MAX_RETRIES = "0";
4183
4184
  const startedAt = Date.now();
4184
4185
  const turnTimeoutMs = resolveTurnTimeoutMs(opts);
4185
4186
  const completionGuard = typeof opts.deadlineAtMs === "number" ? createCompletionToolGuard(
@@ -4220,6 +4221,12 @@ async function runAgent(opts) {
4220
4221
  let sawTerminalSuccess = false;
4221
4222
  let sawLoginRequired = false;
4222
4223
  let noWorkSuccess = false;
4224
+ const sdkAbortController = opts.stopOnRateLimit ? new AbortController() : opts.abortController;
4225
+ const forwardOwnerAbort = () => sdkAbortController?.abort(opts.abortController?.signal.reason);
4226
+ if (opts.stopOnRateLimit && opts.abortController) {
4227
+ if (opts.abortController.signal.aborted) forwardOwnerAbort();
4228
+ else opts.abortController.signal.addEventListener("abort", forwardOwnerAbort, { once: true });
4229
+ }
4223
4230
  try {
4224
4231
  const queryOptions = {
4225
4232
  model: opts.litellmUrl ? litellmModelGroup(opts.model) : opts.model.model,
@@ -4378,7 +4385,7 @@ async function runAgent(opts) {
4378
4385
  };
4379
4386
  }
4380
4387
  queryOptions.settingSources = opts.settingSources ?? ["project", "local"];
4381
- if (opts.abortController) queryOptions.abortController = opts.abortController;
4388
+ if (sdkAbortController) queryOptions.abortController = sdkAbortController;
4382
4389
  const stableBinary = ensureStableClaudeBinary();
4383
4390
  if (stableBinary) {
4384
4391
  const sdkBinaryPathOption = ["pathToClaudeCode", "Exec", "utable"].join("");
@@ -4441,6 +4448,22 @@ async function runAgent(opts) {
4441
4448
  `);
4442
4449
  }
4443
4450
  const m = msg;
4451
+ if (opts.stopOnRateLimit && m.type === "system" && m.subtype === "api_retry" && Number(m.error_status) === 429) {
4452
+ outcome = "failed";
4453
+ outcomeKind = "rate_limit";
4454
+ errorMessage2 = "model rate limited (429)";
4455
+ sdkAbortController?.abort(new Error(errorMessage2));
4456
+ if (typeof iterator.return === "function") {
4457
+ try {
4458
+ await Promise.race([
4459
+ iterator.return(void 0).catch(() => void 0),
4460
+ new Promise((resolve24) => setTimeout(resolve24, 1e3).unref())
4461
+ ]);
4462
+ } catch {
4463
+ }
4464
+ }
4465
+ break;
4466
+ }
4444
4467
  if (opts.onProgress) {
4445
4468
  const blocks = m.message?.content ?? [];
4446
4469
  for (const block of blocks) {
@@ -4533,6 +4556,9 @@ async function runAgent(opts) {
4533
4556
  errorMessage2 = e instanceof Error ? e.message : String(e);
4534
4557
  }
4535
4558
  } finally {
4559
+ if (opts.stopOnRateLimit && opts.abortController) {
4560
+ opts.abortController.signal.removeEventListener("abort", forwardOwnerAbort);
4561
+ }
4536
4562
  try {
4537
4563
  fullLog.end();
4538
4564
  } catch {
@@ -22466,6 +22492,7 @@ async function runImplementation(profileName, input) {
22466
22492
  verbose: input.verbose,
22467
22493
  quiet: input.quiet,
22468
22494
  abortController: input.abortController,
22495
+ stopOnRateLimit: candidateIndex < modelCandidates.length - 1,
22469
22496
  deadlineAtMs: input.deadlineAtMs,
22470
22497
  ndjsonDir,
22471
22498
  additionalDirectories: agentTaskArtifacts ? [agentTaskArtifacts.absDir] : void 0,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kody-ade/kody-engine",
3
- "version": "0.4.593",
3
+ "version": "0.4.595",
4
4
  "description": "kody — autonomous development engine. Single-session Claude Code agent behind a generic executor + declarative implementation profiles.",
5
5
  "license": "MIT",
6
6
  "type": "module",