cc-claw 0.13.1 → 0.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli.js +24 -14
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -72,7 +72,7 @@ var VERSION;
72
72
  var init_version = __esm({
73
73
  "src/version.ts"() {
74
74
  "use strict";
75
- VERSION = true ? "0.13.1" : (() => {
75
+ VERSION = true ? "0.13.2" : (() => {
76
76
  try {
77
77
  return JSON.parse(readFileSync(join2(process.cwd(), "package.json"), "utf-8")).version ?? "unknown";
78
78
  } catch {
@@ -9684,6 +9684,9 @@ function stopAgent(chatId) {
9684
9684
  }
9685
9685
  return true;
9686
9686
  }
9687
+ function getGeminiFallback(model2) {
9688
+ return GEMINI_FALLBACK_CHAIN[model2] ?? null;
9689
+ }
9687
9690
  function spawnQuery(adapter, config2, model2, cancelState, thinkingLevel, timeoutMs, maxTurns, opts) {
9688
9691
  const effectiveTimeout = timeoutMs ?? SPAWN_TIMEOUT_MS;
9689
9692
  return new Promise((resolve, reject) => {
@@ -9952,12 +9955,14 @@ async function spawnGeminiWithRotation(chatId, adapter, baseConfig, configWithSe
9952
9955
  const isTimeout = errMsg.startsWith(FIRST_RESPONSE_TIMEOUT_ERROR);
9953
9956
  const isExhausted = /RESOURCE.?EXHAUSTED|resource has been exhausted/i.test(errMsg);
9954
9957
  if ((isTimeout || isExhausted) && GEMINI_DOWNGRADE_MODELS.has(model2)) {
9958
+ const fallbackModel = getGeminiFallback(model2);
9955
9959
  const reason = isTimeout ? "No response within timeout" : "Resource exhausted";
9956
- warn(`[agent:gemini-rotation] ${reason} on ${model2} (${slotLabel}) \u2014 downgrading to ${GEMINI_FALLBACK_MODEL}`);
9957
- onModelDowngrade?.(model2, GEMINI_FALLBACK_MODEL, `${reason} \u2014 model likely overloaded`);
9960
+ warn(`[agent:gemini-rotation] ${reason} on ${model2} (${slotLabel}) \u2014 downgrading to ${fallbackModel}`);
9961
+ onModelDowngrade?.(model2, fallbackModel, `${reason} \u2014 model likely overloaded`);
9962
+ setModel(chatId, fallbackModel);
9958
9963
  const fallbackConfig = adapter.buildSpawnConfig({
9959
9964
  prompt: effectiveConfig.args[effectiveConfig.args.indexOf("-p") + 1],
9960
- model: GEMINI_FALLBACK_MODEL,
9965
+ model: fallbackModel,
9961
9966
  permMode: "yolo",
9962
9967
  allowedTools: [],
9963
9968
  cwd: effectiveConfig.cwd,
@@ -9974,8 +9979,8 @@ async function spawnGeminiWithRotation(chatId, adapter, baseConfig, configWithSe
9974
9979
  }
9975
9980
  }
9976
9981
  }
9977
- const fallbackResult = await spawnQuery(adapter, fallbackConfig, GEMINI_FALLBACK_MODEL, cancelState, thinkingLevel, timeoutMs, maxTurns, { ...opts, envOverride: env, firstResponseTimeoutMs: 0 });
9978
- fallbackResult.resolvedModel = GEMINI_FALLBACK_MODEL;
9982
+ const fallbackResult = await spawnQuery(adapter, fallbackConfig, fallbackModel, cancelState, thinkingLevel, timeoutMs, maxTurns, { ...opts, envOverride: env });
9983
+ fallbackResult.resolvedModel = fallbackModel;
9979
9984
  return fallbackResult;
9980
9985
  }
9981
9986
  const quotaClass = classifyGeminiQuota(errMsg);
@@ -10088,12 +10093,14 @@ async function askAgentImpl(chatId, userMessage, opts) {
10088
10093
  const isTimeout = errMsg.startsWith(FIRST_RESPONSE_TIMEOUT_ERROR);
10089
10094
  const isExhausted = /RESOURCE.?EXHAUSTED|resource has been exhausted/i.test(errMsg);
10090
10095
  if (adapter.id === "gemini" && (isTimeout || isExhausted) && GEMINI_DOWNGRADE_MODELS.has(resolvedModel)) {
10096
+ const fallbackModel = getGeminiFallback(resolvedModel);
10091
10097
  const reason = isTimeout ? "No response within timeout" : "Resource exhausted";
10092
- warn(`[agent] ${reason} on ${resolvedModel} (no rotation) \u2014 downgrading to ${GEMINI_FALLBACK_MODEL}`);
10093
- onModelDowngrade?.(chatId, resolvedModel, GEMINI_FALLBACK_MODEL, `${reason} \u2014 model likely overloaded`);
10098
+ warn(`[agent] ${reason} on ${resolvedModel} (no rotation) \u2014 downgrading to ${fallbackModel}`);
10099
+ onModelDowngrade?.(chatId, resolvedModel, fallbackModel, `${reason} \u2014 model likely overloaded`);
10100
+ setModel(chatId, fallbackModel);
10094
10101
  const fallbackConfig = adapter.buildSpawnConfig({
10095
10102
  prompt: configWithSession.args[configWithSession.args.indexOf("-p") + 1],
10096
- model: GEMINI_FALLBACK_MODEL,
10103
+ model: fallbackModel,
10097
10104
  permMode: mode,
10098
10105
  allowedTools,
10099
10106
  cwd: resolvedCwd,
@@ -10103,8 +10110,8 @@ async function askAgentImpl(chatId, userMessage, opts) {
10103
10110
  if (mcpConfigPath) {
10104
10111
  fallbackConfig.args = injectMcpConfig(adapter.id, fallbackConfig.args, mcpConfigPath);
10105
10112
  }
10106
- result = await spawnQuery(adapter, fallbackConfig, GEMINI_FALLBACK_MODEL, cancelState, thinkingLevel, timeoutMs, maxTurns, { ...spawnOpts, firstResponseTimeoutMs: 0 });
10107
- result.resolvedModel = GEMINI_FALLBACK_MODEL;
10113
+ result = await spawnQuery(adapter, fallbackConfig, fallbackModel, cancelState, thinkingLevel, timeoutMs, maxTurns, spawnOpts);
10114
+ result.resolvedModel = fallbackModel;
10108
10115
  } else {
10109
10116
  throw err;
10110
10117
  }
@@ -10190,7 +10197,7 @@ function injectMcpConfig(adapterId, args, mcpConfigPath) {
10190
10197
  if (!flag) return args;
10191
10198
  return [...args, ...flag, mcpConfigPath];
10192
10199
  }
10193
- var activeChats, chatLocks, SPAWN_TIMEOUT_MS, FIRST_RESPONSE_TIMEOUT_MS, FIRST_RESPONSE_TIMEOUT_ERROR, GEMINI_FALLBACK_MODEL, GEMINI_DOWNGRADE_MODELS, MCP_CONFIG_FLAG;
10200
+ var activeChats, chatLocks, SPAWN_TIMEOUT_MS, FIRST_RESPONSE_TIMEOUT_MS, FIRST_RESPONSE_TIMEOUT_ERROR, GEMINI_FALLBACK_CHAIN, GEMINI_DOWNGRADE_MODELS, MCP_CONFIG_FLAG;
10194
10201
  var init_agent = __esm({
10195
10202
  "src/agent.ts"() {
10196
10203
  "use strict";
@@ -10215,8 +10222,11 @@ var init_agent = __esm({
10215
10222
  SPAWN_TIMEOUT_MS = 10 * 60 * 1e3;
10216
10223
  FIRST_RESPONSE_TIMEOUT_MS = parseInt(process.env.GEMINI_FIRST_RESPONSE_TIMEOUT_MS ?? "30000", 10);
10217
10224
  FIRST_RESPONSE_TIMEOUT_ERROR = "FIRST_RESPONSE_TIMEOUT";
10218
- GEMINI_FALLBACK_MODEL = "gemini-2.5-pro";
10219
- GEMINI_DOWNGRADE_MODELS = /* @__PURE__ */ new Set(["gemini-3.1-pro-preview"]);
10225
+ GEMINI_FALLBACK_CHAIN = {
10226
+ "gemini-3.1-pro-preview": "gemini-2.5-pro",
10227
+ "gemini-2.5-pro": "gemini-3.1-flash-preview"
10228
+ };
10229
+ GEMINI_DOWNGRADE_MODELS = new Set(Object.keys(GEMINI_FALLBACK_CHAIN));
10220
10230
  MCP_CONFIG_FLAG = {
10221
10231
  claude: ["--mcp-config"]
10222
10232
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cc-claw",
3
- "version": "0.13.1",
3
+ "version": "0.13.2",
4
4
  "description": "CC-Claw: Personal AI assistant on Telegram — multi-backend (Claude, Gemini, Codex, Cursor), sub-agent orchestration, MCP management",
5
5
  "type": "module",
6
6
  "main": "dist/cli.js",