github-router 0.3.212 → 0.3.229

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.
@@ -2,7 +2,7 @@
2
2
  "manifest_version": 3,
3
3
  "name": "github-router browser bridge",
4
4
  "short_name": "gh-router-browser",
5
- "version": "0.3.212",
5
+ "version": "0.3.229",
6
6
  "description": "Bridge between Claude (via github-router /mcp) and the browser. Implements tab control, navigation, clicks, form fill, downloads, screenshots, devtools eval. Blocks navigation to chrome://settings.",
7
7
  "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqJElxuBlonBS3TVW9FJN0mGTtShB3L1hoaYf6k39SOr1ogGYmF90EjRxy1i21k9wQQjPf26bcBu/9X67KrQjQV0uB38CaNukgiSeoLjfptN811u+PJHx6BP+jx3Qa6/3VenNPxHC8WEU0GXql8QSjIHEyCwKb6fMASXOK94JyB5Ywov2x8mt/+9ncqBBBMVzf6r5Sagy4PL1XnryLsuADD/vOEkPet8wXgH/Oj7v5tTsQQZ7U1JT51PoDs2BFnXc5v3TkVgZwd32k3ONh+nkDw1Hof+4zwUGOyJE6eMrlYzRlKM4Qxdf9JpavQvqfieAbTRWcyKeclnHeoIfE7cDBQIDAQAB",
8
8
  "background": {
@@ -0,0 +1,6 @@
1
+ import { B as TEST_DEFAULT_MODEL, F as EXPLORE_DEFAULT_MODEL, H as resolveModeDefaults, I as EXPLORE_DEFAULT_THINKING, L as IMPLEMENT_DEFAULT_MODEL, N as BROWSE_DEFAULT_MODEL, P as DEFAULT_MODEL, R as PLAN_DEFAULT_MODEL, U as resolveWorkerRunOpts, V as appendPlanReminder, W as runWorkerAgent, z as REVIEW_DEFAULT_MODEL } from "./peer-mcp-personas-BKwMCOsl.js";
2
+ import "./paths-BO22pMUb.js";
3
+ import "./lifecycle-D-1CYr1Y.js";
4
+ import "./lifecycle-bPdiXjYB.js";
5
+
6
+ export { BROWSE_DEFAULT_MODEL, DEFAULT_MODEL, EXPLORE_DEFAULT_MODEL, EXPLORE_DEFAULT_THINKING, IMPLEMENT_DEFAULT_MODEL, PLAN_DEFAULT_MODEL, REVIEW_DEFAULT_MODEL, TEST_DEFAULT_MODEL, appendPlanReminder, resolveModeDefaults, resolveWorkerRunOpts, runWorkerAgent };
@@ -250,40 +250,47 @@ function deriveDefinitionName(node) {
250
250
  return null;
251
251
  }
252
252
  /**
253
- * Collect EVERY definition node from the parse tree top-level AND
254
- * nested (class methods, methods' inner functions, nested classes, …) —
255
- * so the outline is a COMPLETE structural map the model can rely on to
256
- * decide what to read. Recurses through non-definition wrappers (TS
257
- * `export_statement`, Python `decorated_definition`, C++
258
- * `template_declaration`, …) at the same depth, and INTO each definition
259
- * at depth+1 to surface its members.
260
- *
261
- * `defTypes` is the language's definition-node-type set. Each node yields
262
- * one entry; the `name` is derived per `deriveDefinitionName` (a node
263
- * with no recoverable name is skipped, but the walk still descends into
264
- * it so its named members aren't lost). Bounded at `MAX_OUTLINE_ENTRIES`.
253
+ * Collect declarations that help a model navigate a file: top-level symbols
254
+ * and members of class-like containers. Function-local variables and nested
255
+ * helpers are deliberately omitted because they inflate the summary without
256
+ * identifying useful read targets. Non-definition wrappers (exports,
257
+ * decorators, templates) preserve the surrounding depth.
265
258
  */
259
+ const OUTLINE_MEMBER_CONTAINERS = new Set([
260
+ "class_declaration",
261
+ "class_definition",
262
+ "class_specifier",
263
+ "interface_declaration",
264
+ "annotation_type_declaration",
265
+ "impl_item",
266
+ "trait_item",
267
+ "struct_item",
268
+ "namespace_definition",
269
+ "module"
270
+ ]);
266
271
  function collectDefinitions(root, defTypes, signal) {
267
272
  const out = [];
268
- const visit = (node, depth) => {
273
+ const visit = (node, depth, includeDefinitions) => {
269
274
  if (signal?.aborted || out.length >= MAX_OUTLINE_ENTRIES) return;
270
275
  for (const child of node.namedChildren) {
271
276
  if (signal?.aborted || out.length >= MAX_OUTLINE_ENTRIES) return;
272
277
  if (defTypes.has(child.type)) {
273
- const name = deriveDefinitionName(child);
274
- if (name !== null) out.push({
275
- kind: child.type,
276
- name,
277
- line: child.startPosition.row + 1,
278
- depth
279
- });
280
- visit(child, depth + 1);
278
+ if (includeDefinitions) {
279
+ const name = deriveDefinitionName(child);
280
+ if (name !== null) out.push({
281
+ kind: child.type,
282
+ name,
283
+ line: child.startPosition.row + 1,
284
+ depth
285
+ });
286
+ }
287
+ if (includeDefinitions && OUTLINE_MEMBER_CONTAINERS.has(child.type)) visit(child, depth + 1, true);
281
288
  continue;
282
289
  }
283
- visit(child, depth);
290
+ visit(child, depth, includeDefinitions);
284
291
  }
285
292
  };
286
- visit(root, 0);
293
+ visit(root, 0, true);
287
294
  return out;
288
295
  }
289
296
  /**
package/dist/main.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { $ as buildAdvisorStream, $t as getPackageVersion, A as trustRepo, At as readResponseBodyCapped, Bt as ArtifactClient, C as fileLastPromptStore, Ct as getTokenCount, D as repoRoot, Dt as createResponses, E as repoFingerprint, Et as pickEndpoint, Ft as extractTarGzMember, G as toolbeltEnabled, Gt as DEFAULT_CLAUDE_MODEL_FALLBACKS, H as buildEnv, Ht as buildWorkspaceHeaderJson, It as extractZipMember, J as TOOLBELT_TOOLS, Jt as DEFAULT_PORT, K as toolbeltSkipSet, Kt as DEFAULT_CODEX_MODEL, Lt as CONDENSED_OPERATING_SEQUENCE, M as resolveSealedGate, Mt as provisionBrowserAssets, Nt as hasSupportedBrowserInstalled, O as stopGateEnabledForRepo, Ot as createChatCompletions, Pt as provisionAndIndexColbert, Q as ADVISOR_TOOL_INSTRUCTIONS, Qt as pickClaudeDefault, Rt as DEFINITION_OF_GREATNESS, S as fileFindingsStore, Sn as state, St as createMessages, T as isSubagentContext, Tt as resolveMcpToolTimeoutMs, U as availableToolCommands, Ut as collapsePathKeys, Vt as buildWorkspaceHeaderHelperCommand, W as buildToolbeltAwareness, Wt as toolbeltPathOverride, X as searchWeb, Xt as UPSTREAM_INACTIVITY_TIMEOUT_MS, Y as assetFor, Yt as UPSTREAM_FETCH_TIMEOUT_MS, Z as ADVISOR_INTERNAL_TOOL_NAME, Zt as generateRandomPort, _ as stopGateDisabled, _n as forwardError, _t as nativeSubagentModel, a as buildPeerAwarenessSnippet, an as cacheCopilotVersion, at as logStreamError, b as stopReviewEnabled, bn as copilotHeaders, bt as shimDefaultsToXhigh, c as personasFor, cn as filterBetaHeader, ct as handleMcpDelete, d as buildStopHookCommand, dn as resolveModel, dt as artifactToolsEnabled, en as withInstallLock, et as injectAdvisorTool, f as captureLaunchBaseline, fn as sleep$1, ft as browseAgentEnabled, g as launchBaselineKey, gn as HTTPError, gt as geminiAvailable, h as injectStopHookIntoSettingsFile, hn as fetchWithTransientRetry, ht as fleetToolsEnabled, i as buildAgentPrompt, in as tryRefreshAndRetry, it as isControllerClosedError, j as liveExec, jt as parseJsonOrDiagnose, k as stopReviewStateDir, kt as MAX_RESPONSE_BODY_BYTES, l as buildArtifactOpenHookCommand, ln as isNullish, lt as handleMcpPost, m as fileBlockBudget, mn as getGitHubUser, mt as browserToolsEnabled, n as MCP_GROUPS, nn as setupGitHubAgentToken, nt as buildAnthropicErrorEvent, o as buildPeerAwarenessSummary, on as cacheModels, ot as readIteratorWithTimeout, p as decideStopHook, pn as getModels, pt as browserCompoundToolsEnabled, q as vscodeRipgrepPath, qt as DEFAULT_CODEX_MODEL_FALLBACKS, r as assertMcpToolSurfaceConsistent, rn as setupGitHubToken, rt as buildOpenAIErrorEvent, s as enumerateInjectedMcpToolNames, sn as cacheVSCodeVersion, st as relayAnthropicStream, t as GROUP_META, tn as setupCopilotToken, tt as isAdvisorRequested, u as buildSessionBindHookCommand, un as resolveCodexModel, ut as agentToolsEnabled, v as stopGateId, vn as GITHUB_API_BASE_URL, vt as standInToolEnabled, w as fileReviewDebounce, wt as assembleResponsesPayload, x as fileBaselineStore, xn as githubHeaders, xt as countTokens, y as stopGatePlanMode, yn as copilotBaseUrl, yt as workerToolsEnabled, zt as shouldUseInsecureTls } from "./peer-mcp-personas-C1RegCRs.js";
2
+ import { $ as searchWeb, $t as UPSTREAM_FETCH_TIMEOUT_MS, A as trustRepo, At as createResponses, Bt as warmTreeSitterPool, C as fileLastPromptStore, Cn as copilotBaseUrl, Ct as shimDefaultsToXhigh, D as repoRoot, Dt as assembleResponsesPayload, E as repoFingerprint, En as state, Et as getTokenCount, Ft as provisionBrowserAssets, G as buildEnv, Gt as buildWorkspaceHeaderHelperCommand, Ht as DEFINITION_OF_GREATNESS, It as hasSupportedBrowserInstalled, J as toolbeltEnabled, Jt as toolbeltPathOverride, K as availableToolCommands, Kt as buildWorkspaceHeaderJson, Lt as provisionAndIndexColbert, M as resolveSealedGate, Mt as MAX_RESPONSE_BODY_BYTES, Nt as readResponseBodyCapped, O as stopGateEnabledForRepo, Ot as resolveMcpToolTimeoutMs, Pt as parseJsonOrDiagnose, Q as assetFor, Qt as DEFAULT_PORT, Rt as extractTarGzMember, S as fileFindingsStore, Sn as GITHUB_API_BASE_URL, St as workerToolsEnabled, T as isSubagentContext, Tn as githubHeaders, Tt as createMessages, Ut as shouldUseInsecureTls, Vt as CONDENSED_OPERATING_SEQUENCE, Wt as ArtifactClient, X as vscodeRipgrepPath, Xt as DEFAULT_CODEX_MODEL, Y as toolbeltSkipSet, Yt as DEFAULT_CLAUDE_MODEL_FALLBACKS, Z as TOOLBELT_TOOLS, Zt as DEFAULT_CODEX_MODEL_FALLBACKS, _ as stopGateDisabled, _n as getModels, _t as browserToolsEnabled, a as buildPeerAwarenessSnippet, an as setupCopilotToken, at as buildAnthropicErrorEvent, b as stopReviewEnabled, bn as HTTPError, bt as nativeSubagentModel, c as personasFor, cn as tryRefreshAndRetry, ct as logStreamError, d as buildStopHookCommand, dn as cacheVSCodeVersion, dt as handleMcpDelete, en as UPSTREAM_INACTIVITY_TIMEOUT_MS, et as ADVISOR_INTERNAL_TOOL_NAME, f as captureLaunchBaseline, fn as filterBetaHeader, ft as handleMcpPost, g as launchBaselineKey, gn as sleep$1, gt as browserCompoundToolsEnabled, h as injectStopHookIntoSettingsFile, hn as resolveModel, ht as browseAgentEnabled, i as buildAgentPrompt, in as withInstallLock, it as isAdvisorRequested, j as liveExec, jt as createChatCompletions, k as stopReviewStateDir, kt as pickEndpoint, l as buildArtifactOpenHookCommand, ln as cacheCopilotVersion, lt as readIteratorWithTimeout, m as fileBlockBudget, mn as resolveCodexModel, mt as artifactToolsEnabled, n as MCP_GROUPS, nn as pickClaudeDefault, nt as buildAdvisorStream, o as buildPeerAwarenessSummary, on as setupGitHubAgentToken, ot as buildOpenAIErrorEvent, p as decideStopHook, pn as isNullish, pt as agentToolsEnabled, q as buildToolbeltAwareness, qt as collapsePathKeys, r as assertMcpToolSurfaceConsistent, rn as getPackageVersion, rt as injectAdvisorTool, s as enumerateInjectedMcpToolNames, sn as setupGitHubToken, st as isControllerClosedError, t as GROUP_META, tn as generateRandomPort, tt as ADVISOR_TOOL_INSTRUCTIONS, u as buildSessionBindHookCommand, un as cacheModels, ut as relayAnthropicStream, v as stopGateId, vn as getGitHubUser, vt as fleetToolsEnabled, w as fileReviewDebounce, wn as copilotHeaders, wt as countTokens, x as fileBaselineStore, xn as forwardError, xt as standInToolEnabled, y as stopGatePlanMode, yn as fetchWithTransientRetry, yt as geminiAvailable, zt as extractZipMember } from "./peer-mcp-personas-BKwMCOsl.js";
3
3
  import { a as isUnderClaudeConfigMirror, d as writeRuntimeFileSecure, i as ensurePaths, o as removeOwnClaudeConfigMirror, r as ensureClaudeConfigMirror, t as PATHS, u as writeArtifactCredsToMirror } from "./paths-BO22pMUb.js";
4
4
  import { c as killManagedTree, d as runCommandCapture, f as runCommandVoid, l as parseBoolEnv, s as killChildProcessTree, u as resolveExecutable } from "./lifecycle-D-1CYr1Y.js";
5
5
  import { a as sweepRegistry } from "./lifecycle-bPdiXjYB.js";
@@ -12,8 +12,8 @@ import * as nodePath$1 from "node:path";
12
12
  import nodePath from "node:path";
13
13
  import process$1 from "node:process";
14
14
  import { execFileSync, spawn } from "node:child_process";
15
- import * as fs$1 from "node:fs";
16
- import fsSync, { existsSync, mkdirSync, promises, readFileSync, realpathSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
15
+ import * as fs$2 from "node:fs";
16
+ import fs$1, { existsSync, mkdirSync, promises, readFileSync, realpathSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
17
17
  import { Agent, ProxyAgent, setGlobalDispatcher } from "undici";
18
18
  import { Writable } from "node:stream";
19
19
  import { clearTimeout as clearTimeout$1, setTimeout as setTimeout$1 } from "node:timers";
@@ -1709,13 +1709,13 @@ function makeDedupeKey(logObj) {
1709
1709
  function rotateAtStartup(filePath) {
1710
1710
  let size;
1711
1711
  try {
1712
- size = fsSync.statSync(filePath).size;
1712
+ size = fs$1.statSync(filePath).size;
1713
1713
  } catch {
1714
1714
  return;
1715
1715
  }
1716
1716
  if (size <= MAX_LOG_BYTES) return;
1717
1717
  try {
1718
- fsSync.renameSync(filePath, filePath + ".1");
1718
+ fs$1.renameSync(filePath, filePath + ".1");
1719
1719
  } catch {}
1720
1720
  }
1721
1721
  var FileLogReporter = class FileLogReporter {
@@ -1731,7 +1731,7 @@ var FileLogReporter = class FileLogReporter {
1731
1731
  ensureFd() {
1732
1732
  if (this.fd !== void 0) return this.fd;
1733
1733
  try {
1734
- this.fd = fsSync.openSync(this.filePath, "a", 384);
1734
+ this.fd = fs$1.openSync(this.filePath, "a", 384);
1735
1735
  } catch {
1736
1736
  this.fd = void 0;
1737
1737
  }
@@ -1740,7 +1740,7 @@ var FileLogReporter = class FileLogReporter {
1740
1740
  closeFd() {
1741
1741
  if (this.fd === void 0) return;
1742
1742
  try {
1743
- fsSync.closeSync(this.fd);
1743
+ fs$1.closeSync(this.fd);
1744
1744
  } catch {}
1745
1745
  this.fd = void 0;
1746
1746
  }
@@ -1756,14 +1756,14 @@ var FileLogReporter = class FileLogReporter {
1756
1756
  rotateIfNeeded() {
1757
1757
  let size;
1758
1758
  try {
1759
- size = this.fd !== void 0 ? fsSync.fstatSync(this.fd).size : fsSync.statSync(this.filePath).size;
1759
+ size = this.fd !== void 0 ? fs$1.fstatSync(this.fd).size : fs$1.statSync(this.filePath).size;
1760
1760
  } catch {
1761
1761
  return;
1762
1762
  }
1763
1763
  if (size <= MAX_LOG_BYTES) return;
1764
1764
  this.closeFd();
1765
1765
  try {
1766
- fsSync.renameSync(this.filePath, this.filePath + ".1");
1766
+ fs$1.renameSync(this.filePath, this.filePath + ".1");
1767
1767
  } catch {}
1768
1768
  }
1769
1769
  /**
@@ -1790,7 +1790,7 @@ var FileLogReporter = class FileLogReporter {
1790
1790
  const fd = this.ensureFd();
1791
1791
  if (fd === void 0) return;
1792
1792
  try {
1793
- fsSync.writeSync(fd, line);
1793
+ fs$1.writeSync(fd, line);
1794
1794
  } catch {
1795
1795
  this.closeFd();
1796
1796
  }
@@ -2894,7 +2894,7 @@ async function discoverGateCommands(cwd, opts) {
2894
2894
  if (files.length === 0) return null;
2895
2895
  let result;
2896
2896
  try {
2897
- const { runWorkerAgent } = await import("./engine-A3oKQtu-.js");
2897
+ const { runWorkerAgent } = await import("./engine-v9-pEKoD.js");
2898
2898
  result = await runWorkerAgent({
2899
2899
  mode: "explore",
2900
2900
  workspace: root,
@@ -5222,7 +5222,7 @@ function initProxyFromEnv() {
5222
5222
  //#endregion
5223
5223
  //#region package.json
5224
5224
  var name = "github-router";
5225
- var version$1 = "0.3.212";
5225
+ var version$1 = "0.3.229";
5226
5226
 
5227
5227
  //#endregion
5228
5228
  //#region src/lib/approval.ts
@@ -8660,7 +8660,7 @@ function seedGatewayModelCache(serverUrl, models$1, configDir = PATHS.CLAUDE_CON
8660
8660
  const target = nodePath$1.join(cacheDir, "gateway-models.json");
8661
8661
  const tmp = nodePath$1.join(cacheDir, `gateway-models.json.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`);
8662
8662
  try {
8663
- fs$1.mkdirSync(cacheDir, { recursive: true });
8663
+ fs$2.mkdirSync(cacheDir, { recursive: true });
8664
8664
  const payload = {
8665
8665
  baseUrl: serverUrl,
8666
8666
  fetchedAt: Date.now(),
@@ -8669,12 +8669,12 @@ function seedGatewayModelCache(serverUrl, models$1, configDir = PATHS.CLAUDE_CON
8669
8669
  display_name: m.display_name
8670
8670
  }))
8671
8671
  };
8672
- fs$1.writeFileSync(tmp, JSON.stringify(payload), "utf-8");
8673
- fs$1.renameSync(tmp, target);
8672
+ fs$2.writeFileSync(tmp, JSON.stringify(payload), "utf-8");
8673
+ fs$2.renameSync(tmp, target);
8674
8674
  return true;
8675
8675
  } catch {
8676
8676
  try {
8677
- fs$1.rmSync(tmp, { force: true });
8677
+ fs$2.rmSync(tmp, { force: true });
8678
8678
  } catch {}
8679
8679
  return false;
8680
8680
  }
@@ -8689,7 +8689,7 @@ function seedGatewayModelCache(serverUrl, models$1, configDir = PATHS.CLAUDE_CON
8689
8689
  */
8690
8690
  function clearGatewayModelCache(configDir = PATHS.CLAUDE_CONFIG_DIR) {
8691
8691
  try {
8692
- fs$1.rmSync(nodePath$1.join(configDir, "cache", "gateway-models.json"), { force: true });
8692
+ fs$2.rmSync(nodePath$1.join(configDir, "cache", "gateway-models.json"), { force: true });
8693
8693
  } catch {}
8694
8694
  }
8695
8695
  /**
@@ -8747,7 +8747,7 @@ function getClaudeCodeEnvVars(serverUrl, model) {
8747
8747
  if (process.env.ANTHROPIC_SMALL_FAST_MODEL === void 0) vars.ANTHROPIC_SMALL_FAST_MODEL = "claude-sonnet-5";
8748
8748
  if (process.env.ANTHROPIC_DEFAULT_SONNET_MODEL === void 0) vars.ANTHROPIC_DEFAULT_SONNET_MODEL = "claude-sonnet-5";
8749
8749
  if (process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL === void 0) vars.ANTHROPIC_DEFAULT_HAIKU_MODEL = "claude-sonnet-5";
8750
- if (process.env.ANTHROPIC_DEFAULT_OPUS_MODEL === void 0) vars.ANTHROPIC_DEFAULT_OPUS_MODEL = "claude-opus-4-8";
8750
+ if (process.env.ANTHROPIC_DEFAULT_OPUS_MODEL === void 0) vars.ANTHROPIC_DEFAULT_OPUS_MODEL = "claude-opus-5";
8751
8751
  if (process.env.CLAUDE_CODE_PLAN_V2_AGENT_COUNT === void 0) vars.CLAUDE_CODE_PLAN_V2_AGENT_COUNT = "7";
8752
8752
  for (const key of [
8753
8753
  "CLAUDE_CODE_ENABLE_EXPERIMENTAL_ADVISOR_TOOL",
@@ -8979,6 +8979,7 @@ const claude = defineCommand({
8979
8979
  }
8980
8980
  }
8981
8981
  provisionAndIndexColbert();
8982
+ warmTreeSitterPool();
8982
8983
  startKeepAwake();
8983
8984
  if (browserToolsEnabled()) provisionBrowserAssets().catch((err) => consola.debug("Browser extension provisioning failed:", err));
8984
8985
  const baseShutdown = async () => {
@@ -9298,6 +9299,7 @@ const codex = defineCommand({
9298
9299
  runSelfUpdate({ selfUpdate: args["self-update"] !== false });
9299
9300
  if (toolbeltEnabled()) provisionToolbelt().catch(() => {});
9300
9301
  provisionAndIndexColbert();
9302
+ warmTreeSitterPool();
9301
9303
  startKeepAwake();
9302
9304
  if ((state.browseEnabled || process$1.env.GH_ROUTER_ENABLE_BROWSE === "1") && hasSupportedBrowserInstalled()) provisionBrowserAssets().catch((err) => consola.debug("Browser extension provisioning failed:", err));
9303
9305
  const usingDefault = !args.model;
@@ -10580,7 +10582,7 @@ function spawnCloudCli(opts) {
10580
10582
  const logPath = process.env.GH_ROUTER_CLOUDCLI_LOG;
10581
10583
  let stdio = "ignore";
10582
10584
  if (logPath) try {
10583
- const fd = fsSync.openSync(logPath, "a");
10585
+ const fd = fs$1.openSync(logPath, "a");
10584
10586
  stdio = [
10585
10587
  "ignore",
10586
10588
  fd,
@@ -12068,6 +12070,7 @@ const start = defineCommand({
12068
12070
  });
12069
12071
  runSelfUpdate({ selfUpdate: args["self-update"] !== false });
12070
12072
  provisionAndIndexColbert();
12073
+ warmTreeSitterPool();
12071
12074
  startKeepAwake();
12072
12075
  if (browserToolsEnabled()) provisionBrowserAssets().catch((err) => consola.debug("Browser extension provisioning failed:", err));
12073
12076
  if (args.cc) generateClaudeCodeCommand(serverUrl, args.model);