@rayu-dev/rayu-cli 1.4.467 → 1.4.469

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/rayu.js +373 -110
  2. package/package.json +1 -1
package/dist/rayu.js CHANGED
@@ -40670,6 +40670,82 @@ var init_vertexAuth = __esm(() => {
40670
40670
  DEFAULT_TOKEN_TTL_MS = 60 * 60 * 1000;
40671
40671
  });
40672
40672
 
40673
+ // src/services/api/ollamaCloud.ts
40674
+ var exports_ollamaCloud = {};
40675
+ __export(exports_ollamaCloud, {
40676
+ fetchOllamaCloudModels: () => fetchOllamaCloudModels,
40677
+ fetchOllamaCloudModelContexts: () => fetchOllamaCloudModelContexts,
40678
+ OLLAMA_CLOUD_PROVIDER_ID: () => OLLAMA_CLOUD_PROVIDER_ID,
40679
+ OLLAMA_CLOUD_BASE_URL: () => OLLAMA_CLOUD_BASE_URL
40680
+ });
40681
+ function hostOf(baseURL) {
40682
+ return (baseURL || OLLAMA_CLOUD_BASE_URL).replace(/\/+$/, "");
40683
+ }
40684
+ function bearer(apiKey) {
40685
+ return apiKey ? { Authorization: `Bearer ${apiKey}` } : {};
40686
+ }
40687
+ async function fetchOllamaCloudModels(apiKey, baseURL) {
40688
+ const host = hostOf(baseURL);
40689
+ const headers = bearer(apiKey);
40690
+ const ids = new Set;
40691
+ try {
40692
+ const res = await fetch(`${host}/v1/models`, { headers, signal: AbortSignal.timeout(15000) });
40693
+ if (res.ok) {
40694
+ const json = await res.json();
40695
+ for (const m2 of json.data ?? []) {
40696
+ if (typeof m2.id === "string" && m2.id)
40697
+ ids.add(m2.id);
40698
+ }
40699
+ }
40700
+ } catch {}
40701
+ if (ids.size === 0) {
40702
+ try {
40703
+ const res = await fetch(`${host}/api/tags`, { headers, signal: AbortSignal.timeout(15000) });
40704
+ if (res.ok) {
40705
+ const json = await res.json();
40706
+ for (const m2 of json.models ?? []) {
40707
+ const id = m2.model || m2.name;
40708
+ if (typeof id === "string" && id)
40709
+ ids.add(id);
40710
+ }
40711
+ }
40712
+ } catch {}
40713
+ }
40714
+ return [...ids].sort();
40715
+ }
40716
+ async function fetchOllamaCloudModelContexts(apiKey, baseURL, models) {
40717
+ const host = hostOf(baseURL);
40718
+ const headers = { "Content-Type": "application/json", ...bearer(apiKey) };
40719
+ const out = {};
40720
+ const CONCURRENCY = 4;
40721
+ let next = 0;
40722
+ async function worker() {
40723
+ while (next < models.length) {
40724
+ const model = models[next++];
40725
+ try {
40726
+ const res = await fetch(`${host}/api/show`, {
40727
+ method: "POST",
40728
+ headers,
40729
+ body: JSON.stringify({ model }),
40730
+ signal: AbortSignal.timeout(1e4)
40731
+ });
40732
+ if (!res.ok)
40733
+ continue;
40734
+ const json = await res.json();
40735
+ for (const [k, v] of Object.entries(json.model_info ?? {})) {
40736
+ if (k.endsWith(".context_length") && typeof v === "number" && v > 0) {
40737
+ out[model] = v;
40738
+ break;
40739
+ }
40740
+ }
40741
+ } catch {}
40742
+ }
40743
+ }
40744
+ await Promise.all(Array.from({ length: Math.min(CONCURRENCY, Math.max(models.length, 1)) }, worker));
40745
+ return out;
40746
+ }
40747
+ var OLLAMA_CLOUD_PROVIDER_ID = "ollama-cloud", OLLAMA_CLOUD_BASE_URL = "https://ollama.com";
40748
+
40673
40749
  // src/utils/rayuProviders.ts
40674
40750
  var exports_rayuProviders = {};
40675
40751
  __export(exports_rayuProviders, {
@@ -40718,8 +40794,26 @@ function ollamaBaseURL() {
40718
40794
  raw = `${raw}/v1`;
40719
40795
  return raw;
40720
40796
  }
40797
+ function envMultiKeyProviderIds() {
40798
+ const raw = process.env.RAYU_MULTI_KEY_PROVIDERS;
40799
+ if (!raw)
40800
+ return [];
40801
+ return raw.split(/[\s,]+/).map((s2) => s2.trim()).filter(Boolean);
40802
+ }
40803
+ function providerKindForId(providerId) {
40804
+ const configured = loadRayuConfig().providers.find((p) => p.id === providerId);
40805
+ if (configured)
40806
+ return configured.kind;
40807
+ return PROVIDER_PRESETS.find((p) => p.id === providerId)?.kind;
40808
+ }
40721
40809
  function supportsMultiApiKey(providerId) {
40722
- return !!providerId && MULTI_KEY_PROVIDER_IDS.has(providerId);
40810
+ if (!providerId)
40811
+ return false;
40812
+ const listed = MULTI_KEY_PROVIDER_IDS.has(providerId) || envMultiKeyProviderIds().includes(providerId);
40813
+ if (!listed)
40814
+ return false;
40815
+ const kind = providerKindForId(providerId);
40816
+ return kind !== undefined && MULTI_KEY_PROVIDER_KINDS.has(kind);
40723
40817
  }
40724
40818
  function migrateEnvKeysToConfig() {
40725
40819
  loadDotEnv();
@@ -40810,7 +40904,7 @@ function getActiveProviderDisplayName() {
40810
40904
  const p = getActiveProvider();
40811
40905
  return p ? providerDisplayName(p) : undefined;
40812
40906
  }
40813
- var DEFAULT_BEDROCK_REGION = "us-east-1", BEDROCK_REGIONS, GEMINI_VERTEX_PROVIDER_ID = "gemini-vertex", DEFAULT_VERTEX_REGION = "global", VERTEX_REGIONS, OLLAMA_DEFAULT_BASE_URL = "http://localhost:11434/v1", RAYU_HOSTED_PROVIDER_ID = "rayu-hosted", RAYU_HOSTED_PROVIDER_LABEL = "Rayu (hosted)", MULTI_KEY_PROVIDER_IDS, PROVIDER_PRESETS, PROVIDER_DISPLAY_NAMES;
40907
+ var DEFAULT_BEDROCK_REGION = "us-east-1", BEDROCK_REGIONS, GEMINI_VERTEX_PROVIDER_ID = "gemini-vertex", DEFAULT_VERTEX_REGION = "global", VERTEX_REGIONS, OLLAMA_DEFAULT_BASE_URL = "http://localhost:11434/v1", RAYU_HOSTED_PROVIDER_ID = "rayu-hosted", RAYU_HOSTED_PROVIDER_LABEL = "Rayu (hosted)", MULTI_KEY_PROVIDER_IDS, MULTI_KEY_PROVIDER_KINDS, PROVIDER_PRESETS, PROVIDER_DISPLAY_NAMES;
40814
40908
  var init_rayuProviders = __esm(() => {
40815
40909
  init_rayuConfig();
40816
40910
  init_envUtils();
@@ -40839,7 +40933,12 @@ var init_rayuProviders = __esm(() => {
40839
40933
  ];
40840
40934
  MULTI_KEY_PROVIDER_IDS = new Set([
40841
40935
  "nvidia",
40842
- "openrouter"
40936
+ "openrouter",
40937
+ "ollama-cloud"
40938
+ ]);
40939
+ MULTI_KEY_PROVIDER_KINDS = new Set([
40940
+ "openai-compatible",
40941
+ "anthropic-compatible"
40843
40942
  ]);
40844
40943
  PROVIDER_PRESETS = [
40845
40944
  {
@@ -40858,6 +40957,14 @@ var init_rayuProviders = __esm(() => {
40858
40957
  defaultModel: "LongCat-2.0",
40859
40958
  envKeys: ["LONGCAT_API_KEY"]
40860
40959
  },
40960
+ {
40961
+ id: OLLAMA_CLOUD_PROVIDER_ID,
40962
+ label: "Ollama Cloud (ollama.com) · hosted models · fetches your account models",
40963
+ kind: "anthropic-compatible",
40964
+ baseURL: OLLAMA_CLOUD_BASE_URL,
40965
+ defaultModel: "gpt-oss:120b-cloud",
40966
+ envKeys: ["OLLAMA_CLOUD_API_KEY"]
40967
+ },
40861
40968
  {
40862
40969
  id: "nvidia",
40863
40970
  label: "NVIDIA NIM (integrate.api.nvidia.com)",
@@ -41109,6 +41216,7 @@ var init_rayuProviders = __esm(() => {
41109
41216
  copilot: "GitHub Copilot",
41110
41217
  "rayu-hosted": "Rayu",
41111
41218
  ollama: "Ollama",
41219
+ "ollama-cloud": "Ollama Cloud",
41112
41220
  local: "Local"
41113
41221
  };
41114
41222
  });
@@ -41818,6 +41926,10 @@ async function fetchProviderModels(p) {
41818
41926
  const { fetchCopilotModels: fetchCopilotModels2 } = await Promise.resolve().then(() => (init_copilotAuth(), exports_copilotAuth));
41819
41927
  return fetchCopilotModels2(p.apiKey);
41820
41928
  }
41929
+ if (p.id === "ollama-cloud") {
41930
+ const { fetchOllamaCloudModels: fetchOllamaCloudModels2 } = await Promise.resolve().then(() => exports_ollamaCloud);
41931
+ return fetchOllamaCloudModels2(p.apiKey, p.baseURL);
41932
+ }
41821
41933
  if (p.kind !== "openai-compatible" || !p.baseURL)
41822
41934
  return [];
41823
41935
  const curated = CURATED_PROVIDER_MODELS[p.id] ?? [];
@@ -41850,7 +41962,7 @@ async function fetchProviderModels(p) {
41850
41962
  }
41851
41963
  async function refreshActiveProviderModels() {
41852
41964
  const p = getActiveProvider();
41853
- if (!p || p.kind !== "openai-compatible" && p.kind !== "bedrock" && p.kind !== "vertex" && p.kind !== "genai" && p.kind !== "kiro" && p.kind !== "copilot")
41965
+ if (!p || p.kind !== "openai-compatible" && p.kind !== "bedrock" && p.kind !== "vertex" && p.kind !== "genai" && p.kind !== "kiro" && p.kind !== "copilot" && p.kind !== "anthropic-compatible")
41854
41966
  return [];
41855
41967
  const models = await fetchProviderModels(p);
41856
41968
  if (models.length) {
@@ -41938,14 +42050,17 @@ var init_rayuConfig = __esm(() => {
41938
42050
  [/gpt-4\.1/i, 1048576],
41939
42051
  [/gemini[-.]?(1\.5|2|2\.5|3)/i, 1048576],
41940
42052
  [/gemini/i, 1048576],
41941
- [/deepseek[-/]?v4[-/]?(flash|pro)/i, 1e6],
42053
+ [/deepseek[-_/.]?v4/i, 1e6],
41942
42054
  [/longcat/i, 1e6],
41943
42055
  [/minimax[-_.]?m3/i, 1e6],
41944
- [/glm-5\.2/i, 1e6],
42056
+ [/glm-?5\.2/i, 1e6],
41945
42057
  [/fugu/i, 1e6],
42058
+ [/llama[-_.]?4/i, 1e6],
41946
42059
  [/kimi-k1|kimi.*long/i, 200000],
41947
42060
  [/kimi[-_.]?k2[-_.]?(thinking|\d{4}|[5-9])/i, 256000],
42061
+ [/kimi[-_.\s]?cod(e|ing)|kimi[-_.]?k?2[.\-_]?7/i, 256000],
41948
42062
  [/kimi|moonshot/i, 131072],
42063
+ [/qwen[-.]?3\.5/i, 256000],
41949
42064
  [/qwen[-.]?3[-.]?(coder|next)/i, 256000],
41950
42065
  [/jamba/i, 256000],
41951
42066
  [/step[-_.]?3\.7/i, 256000],
@@ -41953,7 +42068,7 @@ var init_rayuConfig = __esm(() => {
41953
42068
  [/minimax/i, 204800],
41954
42069
  [/deepseek-(chat|reasoner|v3|coder)/i, 131072],
41955
42070
  [/deepseek-r1/i, 131072],
41956
- [/llama-3\.[1-3]|llama-3-70b|llama-4|nemotron/i, 131072],
42071
+ [/llama-3\.[1-3]|llama-3-70b|nemotron/i, 131072],
41957
42072
  [/qwen[-_.]?[23]|qwq/i, 131072],
41958
42073
  [/gemma-[234]/i, 131072],
41959
42074
  [/mixtral|mistral|ministral|codestral|devstral/i, 131072],
@@ -41990,6 +42105,7 @@ var exports_providers = {};
41990
42105
  __export(exports_providers, {
41991
42106
  isVertexGeminiActive: () => isVertexGeminiActive,
41992
42107
  isRayuNonAnthropicActive: () => isRayuNonAnthropicActive,
42108
+ isRayuAnthropicCompatibleActive: () => isRayuAnthropicCompatibleActive,
41993
42109
  isOpenAICompatibleActive: () => isOpenAICompatibleActive,
41994
42110
  isGeminiVertexConfigured: () => isGeminiVertexConfigured,
41995
42111
  isFirstPartyAnthropicBaseUrl: () => isFirstPartyAnthropicBaseUrl,
@@ -42019,6 +42135,14 @@ function isRayuNonAnthropicActive() {
42019
42135
  return false;
42020
42136
  }
42021
42137
  }
42138
+ function isRayuAnthropicCompatibleActive() {
42139
+ try {
42140
+ const { getActiveProvider: getActiveProvider2 } = (init_rayuConfig(), __toCommonJS(exports_rayuConfig));
42141
+ return getActiveProvider2()?.kind === "anthropic-compatible";
42142
+ } catch {
42143
+ return false;
42144
+ }
42145
+ }
42022
42146
  function isOpenAICompatibleActive() {
42023
42147
  if (isEnvTruthy(process.env.RAYU_OPENAI_COMPATIBLE)) {
42024
42148
  return true;
@@ -148855,7 +148979,7 @@ var init_isEqual = __esm(() => {
148855
148979
 
148856
148980
  // src/utils/userAgent.ts
148857
148981
  function getRayuUserAgent() {
148858
- return `rayu/${"1.4.467"}`;
148982
+ return `rayu/${"1.4.469"}`;
148859
148983
  }
148860
148984
  var getClaudeCodeUserAgent;
148861
148985
  var init_userAgent = __esm(() => {
@@ -148881,7 +149005,7 @@ function getUserAgent() {
148881
149005
  const clientApp = process.env.RAYU_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.RAYU_AGENT_SDK_CLIENT_APP}` : "";
148882
149006
  const workload = getWorkload();
148883
149007
  const workloadSuffix = workload ? `, workload/${workload}` : "";
148884
- return `rayu/${"1.4.467"} (${"external"}, ${process.env.RAYU_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
149008
+ return `rayu/${"1.4.469"} (${"external"}, ${process.env.RAYU_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
148885
149009
  }
148886
149010
  function getMCPUserAgent() {
148887
149011
  const parts = [];
@@ -148895,7 +149019,7 @@ function getMCPUserAgent() {
148895
149019
  parts.push(`client-app/${process.env.RAYU_AGENT_SDK_CLIENT_APP}`);
148896
149020
  }
148897
149021
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
148898
- return `rayu/${"1.4.467"}${suffix}`;
149022
+ return `rayu/${"1.4.469"}${suffix}`;
148899
149023
  }
148900
149024
  function getWebFetchUserAgent() {
148901
149025
  return `Rayu-User (${getRayuUserAgent()})`;
@@ -174790,16 +174914,16 @@ async function getKiroBearer(provider) {
174790
174914
  if (!profileArn) {
174791
174915
  profileArn = await fetchKiroProfileArn(creds.accessToken, region) ?? "";
174792
174916
  }
174793
- const bearer = {
174917
+ const bearer2 = {
174794
174918
  token: creds.accessToken,
174795
174919
  region,
174796
174920
  ...profileArn ? { profileArn } : {}
174797
174921
  };
174798
174922
  oauthCache.set(provider.id, {
174799
- bearer,
174923
+ bearer: bearer2,
174800
174924
  expiresAtMs: creds.expiresAt ? creds.expiresAt * 1000 : Date.now() + 1800000
174801
174925
  });
174802
- return bearer;
174926
+ return bearer2;
174803
174927
  }
174804
174928
  var TOKEN_VALIDITY_BUFFER_MS, DEFAULT_REGION2 = "us-east-1", TOKEN_KEYS, DEVICE_REG_KEYS, defaultRefreshHook = async (url3, body) => {
174805
174929
  const res = await fetch(url3, {
@@ -175252,12 +175376,12 @@ function createKiroClient(provider, maxRetries = 2) {
175252
175376
  });
175253
175377
  }
175254
175378
  for (let attempt = 0;attempt <= maxRetries; attempt++) {
175255
- const bearer = await getKiroBearer(provider);
175256
- if (bearer.profileArn)
175257
- payload.profileArn = bearer.profileArn;
175258
- const endpoint = `https://q.${bearer.region}.amazonaws.com/`;
175379
+ const bearer2 = await getKiroBearer(provider);
175380
+ if (bearer2.profileArn)
175381
+ payload.profileArn = bearer2.profileArn;
175382
+ const endpoint = `https://q.${bearer2.region}.amazonaws.com/`;
175259
175383
  const headers = {
175260
- Authorization: `Bearer ${bearer.token}`,
175384
+ Authorization: `Bearer ${bearer2.token}`,
175261
175385
  "Content-Type": "application/x-amz-json-1.0",
175262
175386
  Accept: "*/*",
175263
175387
  "X-Amz-Target": AMZ_TARGET,
@@ -175267,8 +175391,8 @@ function createKiroClient(provider, maxRetries = 2) {
175267
175391
  "amz-sdk-invocation-id": invocationId,
175268
175392
  "amz-sdk-request": `attempt=${attempt + 1}; max=${maxRetries + 1}`
175269
175393
  };
175270
- if (bearer.tokenType)
175271
- headers.TokenType = bearer.tokenType;
175394
+ if (bearer2.tokenType)
175395
+ headers.TokenType = bearer2.tokenType;
175272
175396
  const timeout = AbortSignal.timeout(REQUEST_TIMEOUT_MS);
175273
175397
  const composite = signal && "any" in AbortSignal ? AbortSignal.any([signal, timeout]) : signal ?? timeout;
175274
175398
  let res;
@@ -175430,18 +175554,53 @@ var init_rayuHostedClient = __esm(() => {
175430
175554
  // src/services/api/anthropicCompatibleClient.ts
175431
175555
  var exports_anthropicCompatibleClient = {};
175432
175556
  __export(exports_anthropicCompatibleClient, {
175557
+ makeKeyRotatingFetch: () => makeKeyRotatingFetch,
175433
175558
  createAnthropicCompatibleClient: () => createAnthropicCompatibleClient
175434
175559
  });
175435
- function createAnthropicCompatibleClient(provider, maxRetries) {
175560
+ function makeKeyRotatingFetch(keys2, baseFetch) {
175561
+ let current = 0;
175562
+ const rotating = async (input, init) => {
175563
+ const n2 = keys2.length;
175564
+ let lastResp;
175565
+ for (let attempt = 0;attempt < n2; attempt++) {
175566
+ const idx = (current + attempt) % n2;
175567
+ const headers = new Headers(init?.headers);
175568
+ headers.set("Authorization", `Bearer ${keys2[idx]}`);
175569
+ const resp = await baseFetch(input, { ...init, headers });
175570
+ if (resp.ok || attempt === n2 - 1 || !ROTATABLE_KEY_STATUSES2.has(resp.status)) {
175571
+ if (resp.ok)
175572
+ current = idx;
175573
+ return resp;
175574
+ }
175575
+ try {
175576
+ await resp.body?.cancel();
175577
+ } catch {}
175578
+ lastResp = resp;
175579
+ }
175580
+ return lastResp;
175581
+ };
175582
+ return rotating;
175583
+ }
175584
+ function createAnthropicCompatibleClient(provider, maxRetries, transport = {}, apiKeys) {
175585
+ const keys2 = (apiKeys ?? []).map((k2) => k2?.trim()).filter((k2) => !!k2);
175586
+ const rotate = keys2.length > 1;
175587
+ const finalTransport = rotate ? {
175588
+ ...transport,
175589
+ fetch: makeKeyRotatingFetch(keys2, transport.fetch ?? globalThis.fetch)
175590
+ } : transport;
175436
175591
  return new Anthropic({
175592
+ dangerouslyAllowBrowser: true,
175593
+ ...finalTransport,
175437
175594
  apiKey: null,
175438
- authToken: provider.apiKey,
175595
+ authToken: keys2[0] ?? provider.apiKey,
175439
175596
  baseURL: provider.baseURL,
175440
175597
  maxRetries
175441
175598
  });
175442
175599
  }
175600
+ var ROTATABLE_KEY_STATUSES2;
175443
175601
  var init_anthropicCompatibleClient = __esm(() => {
175444
175602
  init_sdk();
175603
+ ROTATABLE_KEY_STATUSES2 = new Set([429, 402, 401, 403]);
175445
175604
  });
175446
175605
 
175447
175606
  // src/services/api/client.ts
@@ -175576,13 +175735,38 @@ async function getRayuHostedClient(maxRetries) {
175576
175735
  const { createRayuHostedClient: createRayuHostedClient2 } = await Promise.resolve().then(() => (init_rayuHostedClient(), exports_rayuHostedClient));
175577
175736
  return createRayuHostedClient2(active, maxRetries);
175578
175737
  }
175579
- async function getRayuAnthropicCompatibleClient(maxRetries) {
175580
- const { getActiveProvider: getActiveProvider2 } = await Promise.resolve().then(() => (init_rayuConfig(), exports_rayuConfig));
175738
+ function anthropicCompatibleTransport(source, fetchOverride2) {
175739
+ const customHeaders = getCustomHeaders();
175740
+ const defaultHeaders = {
175741
+ "x-app": "cli",
175742
+ "User-Agent": getUserAgent(),
175743
+ "X-Claude-Code-Session-Id": getSessionId(),
175744
+ ...customHeaders
175745
+ };
175746
+ const resolvedFetch = buildFetch(fetchOverride2, source);
175747
+ return {
175748
+ defaultHeaders,
175749
+ timeout: parseInt(process.env.API_TIMEOUT_MS || String(600000), 10),
175750
+ fetchOptions: getProxyFetchOptions({
175751
+ forAnthropicAPI: true
175752
+ }),
175753
+ ...resolvedFetch ? { fetch: resolvedFetch } : {},
175754
+ ...isDebugToStdErr() ? { logger: createStderrLogger() } : {}
175755
+ };
175756
+ }
175757
+ async function getRayuAnthropicCompatibleClient(maxRetries, source, fetchOverride2) {
175758
+ const { getActiveProvider: getActiveProvider2, getProviderApiKeys: getProviderApiKeys2 } = await Promise.resolve().then(() => (init_rayuConfig(), exports_rayuConfig));
175581
175759
  const active = getActiveProvider2();
175582
175760
  if (active?.kind !== "anthropic-compatible")
175583
175761
  return null;
175584
175762
  const { createAnthropicCompatibleClient: createAnthropicCompatibleClient2 } = await Promise.resolve().then(() => (init_anthropicCompatibleClient(), exports_anthropicCompatibleClient));
175585
- return createAnthropicCompatibleClient2(active, maxRetries);
175763
+ let apiKeys = getProviderApiKeys2(active);
175764
+ const { supportsMultiApiKey: supportsMultiApiKey2 } = await Promise.resolve().then(() => (init_rayuProviders(), exports_rayuProviders));
175765
+ const { isMultiApiKeyAllowed: isMultiApiKeyAllowed2 } = await Promise.resolve().then(() => (init_multiApiKeyFeature(), exports_multiApiKeyFeature));
175766
+ if (!supportsMultiApiKey2(active.id) || !isMultiApiKeyAllowed2()) {
175767
+ apiKeys = apiKeys.slice(0, 1);
175768
+ }
175769
+ return createAnthropicCompatibleClient2(active, maxRetries, anthropicCompatibleTransport(source, fetchOverride2), apiKeys);
175586
175770
  }
175587
175771
  async function buildClientForProvider(provider, maxRetries) {
175588
175772
  if (provider.kind === "bedrock" && provider.bedrockApi === "anthropic" && provider.apiKey) {
@@ -175624,7 +175808,14 @@ async function buildClientForProvider(provider, maxRetries) {
175624
175808
  }
175625
175809
  if (provider.kind === "anthropic-compatible") {
175626
175810
  const { createAnthropicCompatibleClient: createAnthropicCompatibleClient2 } = await Promise.resolve().then(() => (init_anthropicCompatibleClient(), exports_anthropicCompatibleClient));
175627
- return createAnthropicCompatibleClient2(provider, maxRetries);
175811
+ const { getProviderApiKeys: getProviderApiKeys2 } = await Promise.resolve().then(() => (init_rayuConfig(), exports_rayuConfig));
175812
+ const { supportsMultiApiKey: supportsMultiApiKey2 } = await Promise.resolve().then(() => (init_rayuProviders(), exports_rayuProviders));
175813
+ const { isMultiApiKeyAllowed: isMultiApiKeyAllowed2 } = await Promise.resolve().then(() => (init_multiApiKeyFeature(), exports_multiApiKeyFeature));
175814
+ let apiKeys = getProviderApiKeys2(provider);
175815
+ if (!supportsMultiApiKey2(provider.id) || !isMultiApiKeyAllowed2()) {
175816
+ apiKeys = apiKeys.slice(0, 1);
175817
+ }
175818
+ return createAnthropicCompatibleClient2(provider, maxRetries, anthropicCompatibleTransport(), apiKeys);
175628
175819
  }
175629
175820
  if ((provider.kind === "openai-compatible" || provider.kind === "bedrock") && provider.baseURL) {
175630
175821
  const { createOpenAICompatibleClient: createOpenAICompatibleClient2 } = await Promise.resolve().then(() => (init_openaiAdapter(), exports_openaiAdapter));
@@ -175699,7 +175890,7 @@ async function getAnthropicClient({
175699
175890
  if (rayuHostedClient) {
175700
175891
  return rayuHostedClient;
175701
175892
  }
175702
- const anthropicCompatibleClient = await getRayuAnthropicCompatibleClient(maxRetries);
175893
+ const anthropicCompatibleClient = await getRayuAnthropicCompatibleClient(maxRetries, source, fetchOverride2);
175703
175894
  if (anthropicCompatibleClient) {
175704
175895
  return anthropicCompatibleClient;
175705
175896
  }
@@ -205143,7 +205334,7 @@ function getAttributionHeader(fingerprint) {
205143
205334
  if (!isAttributionHeaderEnabled()) {
205144
205335
  return "";
205145
205336
  }
205146
- const version2 = `${"1.4.467"}.${fingerprint}`;
205337
+ const version2 = `${"1.4.469"}.${fingerprint}`;
205147
205338
  const entrypoint = process.env.CLAUDE_CODE_ENTRYPOINT ?? "unknown";
205148
205339
  const cch = "";
205149
205340
  const workload = getWorkload();
@@ -240215,7 +240406,13 @@ function modelSupportsAdaptiveThinking(model) {
240215
240406
  if (supported3P !== undefined) {
240216
240407
  return supported3P;
240217
240408
  }
240218
- if (isOpenAICompatibleActive() || isRayuNonAnthropicActive()) {
240409
+ if (isOpenAICompatibleActive()) {
240410
+ return true;
240411
+ }
240412
+ if (isRayuAnthropicCompatibleActive()) {
240413
+ return false;
240414
+ }
240415
+ if (isRayuNonAnthropicActive()) {
240219
240416
  return true;
240220
240417
  }
240221
240418
  const canonical = getCanonicalName(model);
@@ -259106,7 +259303,7 @@ var init_metadata = __esm(() => {
259106
259303
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
259107
259304
  WHITESPACE_REGEX = /\s+/;
259108
259305
  getVersionBase = memoize_default(() => {
259109
- const match = "1.4.467".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
259306
+ const match = "1.4.469".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
259110
259307
  return match ? match[0] : undefined;
259111
259308
  });
259112
259309
  buildEnvContext = memoize_default(async () => {
@@ -259145,7 +259342,7 @@ var init_metadata = __esm(() => {
259145
259342
  },
259146
259343
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
259147
259344
  isRayuAction: isEnvTruthy(process.env.RAYU_ACTION),
259148
- version: "1.4.467",
259345
+ version: "1.4.469",
259149
259346
  versionBase: getVersionBase(),
259150
259347
  buildTime: "",
259151
259348
  deploymentEnvironment: env3.detectDeploymentEnvironment(),
@@ -291159,7 +291356,7 @@ function getTelemetryAttributes() {
291159
291356
  attributes["session.id"] = sessionId;
291160
291357
  }
291161
291358
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
291162
- attributes["app.version"] = "1.4.467";
291359
+ attributes["app.version"] = "1.4.469";
291163
291360
  }
291164
291361
  const oauthAccount = getOauthAccountInfo();
291165
291362
  if (oauthAccount) {
@@ -401516,7 +401713,7 @@ function getInstallationEnv() {
401516
401713
  return;
401517
401714
  }
401518
401715
  function getClaudeCodeVersion() {
401519
- return "1.4.467";
401716
+ return "1.4.469";
401520
401717
  }
401521
401718
  async function getInstalledVSCodeExtensionVersion(command) {
401522
401719
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -406754,7 +406951,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
406754
406951
  const client3 = new Client({
406755
406952
  name: "claude-code",
406756
406953
  title: "RAYU",
406757
- version: "1.4.467",
406954
+ version: "1.4.469",
406758
406955
  description: "Anthropic's agentic coding tool",
406759
406956
  websiteUrl: PRODUCT_URL
406760
406957
  }, {
@@ -407071,7 +407268,7 @@ var init_client7 = __esm(() => {
407071
407268
  const client3 = new Client({
407072
407269
  name: "claude-code",
407073
407270
  title: "RAYU",
407074
- version: "1.4.467",
407271
+ version: "1.4.469",
407075
407272
  description: "Anthropic's agentic coding tool",
407076
407273
  websiteUrl: PRODUCT_URL
407077
407274
  }, {
@@ -421890,7 +422087,7 @@ function computeFingerprint(messageText, version2) {
421890
422087
  }
421891
422088
  function computeFingerprintFromMessages(messages) {
421892
422089
  const firstMessageText = extractFirstMessageText(messages);
421893
- return computeFingerprint(firstMessageText, "1.4.467");
422090
+ return computeFingerprint(firstMessageText, "1.4.469");
421894
422091
  }
421895
422092
  var FINGERPRINT_SALT = "59cf53e54c78";
421896
422093
  var init_fingerprint = () => {};
@@ -421932,7 +422129,7 @@ async function sideQuery(opts) {
421932
422129
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
421933
422130
  }
421934
422131
  const messageText = extractFirstUserMessageText(messages);
421935
- const fingerprint = computeFingerprint(messageText, "1.4.467");
422132
+ const fingerprint = computeFingerprint(messageText, "1.4.469");
421936
422133
  const attributionHeader = getAttributionHeader(fingerprint);
421937
422134
  const systemBlocks = [
421938
422135
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -521268,9 +521465,9 @@ async function assertMinVersion() {
521268
521465
  if (false) {}
521269
521466
  try {
521270
521467
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
521271
- if (versionConfig.minVersion && lt("1.4.467", versionConfig.minVersion)) {
521468
+ if (versionConfig.minVersion && lt("1.4.469", versionConfig.minVersion)) {
521272
521469
  console.error(`
521273
- It looks like your version of RAYU (${"1.4.467"}) needs an update.
521470
+ It looks like your version of RAYU (${"1.4.469"}) needs an update.
521274
521471
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
521275
521472
 
521276
521473
  To update, please run:
@@ -521496,7 +521693,7 @@ async function installGlobalPackage(specificVersion) {
521496
521693
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
521497
521694
  logEvent("tengu_auto_updater_lock_contention", {
521498
521695
  pid: process.pid,
521499
- currentVersion: "1.4.467"
521696
+ currentVersion: "1.4.469"
521500
521697
  });
521501
521698
  return "in_progress";
521502
521699
  }
@@ -521505,7 +521702,7 @@ async function installGlobalPackage(specificVersion) {
521505
521702
  if (!env3.isRunningWithBun() && env3.isNpmFromWindowsPath()) {
521506
521703
  logError2(new Error("Windows NPM detected in WSL environment"));
521507
521704
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
521508
- currentVersion: "1.4.467"
521705
+ currentVersion: "1.4.469"
521509
521706
  });
521510
521707
  console.error(`
521511
521708
  Error: Windows NPM detected in WSL
@@ -522036,7 +522233,7 @@ function detectLinuxGlobPatternWarnings() {
522036
522233
  }
522037
522234
  async function getDoctorDiagnostic() {
522038
522235
  const installationType = await getCurrentInstallationType();
522039
- const version2 = typeof MACRO !== "undefined" ? "1.4.467" : "unknown";
522236
+ const version2 = typeof MACRO !== "undefined" ? "1.4.469" : "unknown";
522040
522237
  const installationPath = await getInstallationPath();
522041
522238
  const invokedBinary = getInvokedBinary();
522042
522239
  const multipleInstallations = await detectMultipleInstallations();
@@ -522830,8 +523027,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
522830
523027
  const maxVersion = await getMaxVersion();
522831
523028
  if (maxVersion && gt(version2, maxVersion)) {
522832
523029
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
522833
- if (gte("1.4.467", maxVersion)) {
522834
- logForDebugging(`Native installer: current version ${"1.4.467"} is already at or above maxVersion ${maxVersion}, skipping update`);
523030
+ if (gte("1.4.469", maxVersion)) {
523031
+ logForDebugging(`Native installer: current version ${"1.4.469"} is already at or above maxVersion ${maxVersion}, skipping update`);
522835
523032
  logEvent("tengu_native_update_skipped_max_version", {
522836
523033
  latency_ms: Date.now() - startTime2,
522837
523034
  max_version: maxVersion,
@@ -522842,7 +523039,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
522842
523039
  version2 = maxVersion;
522843
523040
  }
522844
523041
  }
522845
- if (!forceReinstall && version2 === "1.4.467" && await versionIsAvailable(version2) && await isPossibleClaudeBinary(executablePath)) {
523042
+ if (!forceReinstall && version2 === "1.4.469" && await versionIsAvailable(version2) && await isPossibleClaudeBinary(executablePath)) {
522846
523043
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
522847
523044
  logEvent("tengu_native_update_complete", {
522848
523045
  latency_ms: Date.now() - startTime2,
@@ -524038,7 +524235,7 @@ function buildPrimarySection() {
524038
524235
  });
524039
524236
  return [{
524040
524237
  label: "Version",
524041
- value: "1.4.467"
524238
+ value: "1.4.469"
524042
524239
  }, {
524043
524240
  label: "Session name",
524044
524241
  value: nameValue
@@ -527709,7 +527906,7 @@ function Config({
527709
527906
  }
527710
527907
  })
527711
527908
  }) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_runtime168.jsx(ChannelDowngradeDialog, {
527712
- currentVersion: "1.4.467",
527909
+ currentVersion: "1.4.469",
527713
527910
  onChoice: (choice) => {
527714
527911
  setShowSubmenu(null);
527715
527912
  setTabsHidden(false);
@@ -527721,7 +527918,7 @@ function Config({
527721
527918
  autoUpdatesChannel: "stable"
527722
527919
  };
527723
527920
  if (choice === "stay") {
527724
- newSettings.minimumVersion = "1.4.467";
527921
+ newSettings.minimumVersion = "1.4.469";
527725
527922
  }
527726
527923
  updateSettingsForSource("userSettings", newSettings);
527727
527924
  setSettingsData((prev_27) => ({
@@ -535781,7 +535978,7 @@ function HelpV2(t0) {
535781
535978
  let t6;
535782
535979
  if ($3[31] !== tabs) {
535783
535980
  t6 = /* @__PURE__ */ jsx_runtime195.jsx(Tabs, {
535784
- title: `Rayu-CLI v${"1.4.467"}`,
535981
+ title: `Rayu-CLI v${"1.4.469"}`,
535785
535982
  color: "professionalBlue",
535786
535983
  defaultTab: "general",
535787
535984
  children: tabs
@@ -555864,7 +556061,7 @@ function getRecentReleaseNotes(currentVersion, previousVersion, changelogContent
555864
556061
  }
555865
556062
  return [];
555866
556063
  }
555867
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.4.467") {
556064
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.4.469") {
555868
556065
  if (false) {}
555869
556066
  const cachedChangelog = await getStoredChangelog();
555870
556067
  if (lastSeenVersion !== currentVersion || !cachedChangelog) {
@@ -555877,7 +556074,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.4.467")
555877
556074
  releaseNotes
555878
556075
  };
555879
556076
  }
555880
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.4.467") {
556077
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.4.469") {
555881
556078
  if (false) {}
555882
556079
  const releaseNotes = getRecentReleaseNotes(currentVersion, lastSeenVersion);
555883
556080
  return {
@@ -556005,7 +556202,7 @@ function getRecentActivitySync() {
556005
556202
  return cachedActivity;
556006
556203
  }
556007
556204
  function getLogoDisplayData() {
556008
- const version2 = process.env.DEMO_VERSION ?? "1.4.467";
556205
+ const version2 = process.env.DEMO_VERSION ?? "1.4.469";
556009
556206
  const serverUrl = getDirectConnectServerUrl();
556010
556207
  const displayPath = process.env.DEMO_VERSION ? "/code/claude" : getDisplayPath(getCwd());
556011
556208
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -556083,12 +556280,12 @@ var RAYU_BANNER_CLAWD, RAYU_BANNER_WELCOME, BANNERS, ACTIVE_BANNER_ID = "rayu";
556083
556280
  var init_bannerConfig = __esm(() => {
556084
556281
  RAYU_BANNER_CLAWD = {
556085
556282
  lines: [
556086
- ["██████╗ █████╗ ██╗ ██╗██╗ ██╗", "#7cffb2"],
556283
+ ["██████╗ █████╗ ██╗ ██╗██╗ ██╗", "#c109ef"],
556087
556284
  ["██╔══██╗██╔══██╗╚██╗ ██╔╝██║ ██║", "#5bf58d"],
556088
- ["██████╔╝███████║ ╚████╔╝ ██║ ██║", "#3de877"],
556089
- ["██╔══██╗██╔══██║ ╚██╔╝ ██║ ██║", "#22c96a"],
556090
- ["██║ ██║██║ ██║ ██║ ╚██████╔╝", "#149b52"],
556091
- ["╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ", "#0e7a40"]
556285
+ ["██████╔╝███████║ ╚████╔╝ ██║ ██║", "#e8df3d"],
556286
+ ["██╔══██╗██╔══██║ ╚██╔╝ ██║ ██║", "#2257c9"],
556287
+ ["██║ ██║██║ ██║ ██║ ╚██████╔╝", "#43149b"],
556288
+ ["╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝ ", "#db5e71"]
556092
556289
  ]
556093
556290
  };
556094
556291
  RAYU_BANNER_WELCOME = {
@@ -557169,7 +557366,7 @@ function LogoV2() {
557169
557366
  if ($3[2] === Symbol.for("react.memo_cache_sentinel")) {
557170
557367
  t2 = () => {
557171
557368
  const currentConfig = getGlobalConfig();
557172
- if (currentConfig.lastReleaseNotesSeen === "1.4.467") {
557369
+ if (currentConfig.lastReleaseNotesSeen === "1.4.469") {
557173
557370
  return;
557174
557371
  }
557175
557372
  saveGlobalConfig(_temp327);
@@ -557647,7 +557844,7 @@ function LogoV2() {
557647
557844
  t24 = $3[61];
557648
557845
  }
557649
557846
  const _latestNpm = getCachedLatestNpmVersionSync();
557650
- const _updateFeeds = _latestNpm && gt(_latestNpm, "1.4.467") ? [createUpdateAvailableFeed("1.4.467", _latestNpm)] : [];
557847
+ const _updateFeeds = _latestNpm && gt(_latestNpm, "1.4.469") ? [createUpdateAvailableFeed("1.4.469", _latestNpm)] : [];
557651
557848
  const t25 = layoutMode === "horizontal" && /* @__PURE__ */ jsx_runtime236.jsx(FeedColumn, {
557652
557849
  feeds: showOnboarding ? [createProjectOnboardingFeed(getSteps()), createRecentActivityFeed(activities)] : showGuestPassesUpsell ? [createRecentActivityFeed(activities), createGuestPassesFeed()] : showOverageCreditUpsell ? [createRecentActivityFeed(activities), createOverageCreditFeed()] : [createRecentActivityFeed(activities), ..._updateFeeds, createWhatsNewFeed(changelog)],
557653
557850
  maxWidth: rightWidth
@@ -557847,12 +558044,12 @@ function LogoV2() {
557847
558044
  return t41;
557848
558045
  }
557849
558046
  function _temp327(current) {
557850
- if (current.lastReleaseNotesSeen === "1.4.467") {
558047
+ if (current.lastReleaseNotesSeen === "1.4.469") {
557851
558048
  return current;
557852
558049
  }
557853
558050
  return {
557854
558051
  ...current,
557855
- lastReleaseNotesSeen: "1.4.467"
558052
+ lastReleaseNotesSeen: "1.4.469"
557856
558053
  };
557857
558054
  }
557858
558055
  function _temp241(s_0) {
@@ -582850,7 +583047,7 @@ async function captureMemoryDiagnostics(trigger, dumpNumber = 0) {
582850
583047
  smapsRollup,
582851
583048
  platform: process.platform,
582852
583049
  nodeVersion: process.version,
582853
- ccVersion: "1.4.467"
583050
+ ccVersion: "1.4.469"
582854
583051
  };
582855
583052
  }
582856
583053
  async function performHeapDump(trigger = "manual", dumpNumber = 0) {
@@ -583372,7 +583569,7 @@ var init_bridge_kick = __esm(() => {
583372
583569
  var call50 = async () => {
583373
583570
  return {
583374
583571
  type: "text",
583375
- value: "1.4.467"
583572
+ value: "1.4.469"
583376
583573
  };
583377
583574
  }, version2, version_default;
583378
583575
  var init_version = __esm(() => {
@@ -586365,6 +586562,7 @@ function RayuProviderSetup({
586365
586562
  const [baseURL, setBaseURL] = import_react178.useState("");
586366
586563
  const [model, setModel] = import_react178.useState("");
586367
586564
  const [apiKey, setApiKey] = import_react178.useState("");
586565
+ const [multiKeys, setMultiKeys] = import_react178.useState([]);
586368
586566
  const [cursor, setCursor] = import_react178.useState(0);
586369
586567
  const [region, setRegion] = import_react178.useState(DEFAULT_BEDROCK_REGION);
586370
586568
  const [bedrockModels, setBedrockModels] = import_react178.useState([]);
@@ -586795,6 +586993,44 @@ ${r2.output.slice(-200)}`);
586795
586993
  cancelled = true;
586796
586994
  };
586797
586995
  }, [phase, kiroStep]);
586996
+ import_react178.default.useEffect(() => {
586997
+ if (phase !== "ollamaCloudFetching")
586998
+ return;
586999
+ let cancelled = false;
587000
+ (async () => {
587001
+ const { fetchOllamaCloudModelContexts: fetchOllamaCloudModelContexts2, OLLAMA_CLOUD_BASE_URL: OLLAMA_CLOUD_BASE_URL2 } = await Promise.resolve().then(() => exports_ollamaCloud);
587002
+ const keys2 = (multiKeys.length ? multiKeys : [apiKey]).map((k2) => k2.trim()).filter(Boolean);
587003
+ const base2 = {
587004
+ id: preset?.id ?? "ollama-cloud",
587005
+ kind: "anthropic-compatible",
587006
+ apiKey: keys2[0],
587007
+ ...keys2.length > 1 ? { apiKeys: keys2 } : {},
587008
+ baseURL: (baseURL || preset?.baseURL || OLLAMA_CLOUD_BASE_URL2).trim()
587009
+ };
587010
+ upsertProvider(base2, true);
587011
+ const models = await fetchProviderModels(base2).catch(() => []);
587012
+ if (cancelled)
587013
+ return;
587014
+ const chat2 = models.filter(isLikelyChatModel);
587015
+ const list = chat2.length ? chat2 : models;
587016
+ const contexts = list.length ? await fetchOllamaCloudModelContexts2(base2.apiKey, base2.baseURL, list).catch(() => ({})) : {};
587017
+ if (cancelled)
587018
+ return;
587019
+ const preferred = list.find((m3) => /qwen3-coder/i.test(m3)) ?? list.find((m3) => /glm-4\.[67]|glm-5/i.test(m3)) ?? list.find((m3) => /gpt-oss/i.test(m3)) ?? list.find((m3) => /cloud/i.test(m3)) ?? list[0] ?? "gpt-oss:120b-cloud";
587020
+ upsertProvider({
587021
+ ...base2,
587022
+ ...list.length ? { fetchedModels: list } : {},
587023
+ ...Object.keys(contexts).length ? { modelContextWindows: contexts } : {},
587024
+ defaultModel: preferred
587025
+ }, true);
587026
+ if (cancelled)
587027
+ return;
587028
+ onDone();
587029
+ })();
587030
+ return () => {
587031
+ cancelled = true;
587032
+ };
587033
+ }, [phase]);
586798
587034
  if (phase === "pick") {
586799
587035
  const localIds = new Set(["ollama", "local"]);
586800
587036
  const pickOptions = [
@@ -587019,6 +587255,23 @@ ${r2.output.slice(-200)}`);
587019
587255
  ]
587020
587256
  });
587021
587257
  }
587258
+ if (phase === "ollamaCloudFetching") {
587259
+ return /* @__PURE__ */ jsx_runtime324.jsxs(ThemedBox_default, {
587260
+ flexDirection: "column",
587261
+ gap: 1,
587262
+ paddingLeft: 1,
587263
+ children: [
587264
+ /* @__PURE__ */ jsx_runtime324.jsx(ThemedText, {
587265
+ bold: true,
587266
+ children: "Fetching your Ollama Cloud models…"
587267
+ }),
587268
+ /* @__PURE__ */ jsx_runtime324.jsx(ThemedText, {
587269
+ dimColor: true,
587270
+ children: "Listing the models available to your ollama.com account and their context sizes."
587271
+ })
587272
+ ]
587273
+ });
587274
+ }
587022
587275
  if (phase === "kiroChoice") {
587023
587276
  return /* @__PURE__ */ jsx_runtime324.jsxs(ThemedBox_default, {
587024
587277
  flexDirection: "column",
@@ -587640,11 +587893,21 @@ ${r2.output.slice(-200)}`);
587640
587893
  providerLabel: preset.label,
587641
587894
  maxKeys: getMaxStoredApiKeys(),
587642
587895
  initialKeys: existing,
587643
- onDone: finishMultiKey,
587896
+ onDone: (keys2) => {
587897
+ const cleaned = keys2.map((k2) => k2.trim()).filter(Boolean);
587898
+ if (preset.id === "ollama-cloud") {
587899
+ setMultiKeys(cleaned);
587900
+ setApiKey(cleaned[0] ?? "");
587901
+ setPhase("ollamaCloudFetching");
587902
+ return;
587903
+ }
587904
+ finishMultiKey(cleaned);
587905
+ },
587644
587906
  onCancel: onDone
587645
587907
  });
587646
587908
  }
587647
587909
  const isBedrock = preset?.kind === "bedrock";
587910
+ const isOllamaCloud = preset?.id === "ollama-cloud";
587648
587911
  const showMultiKeyUpsell = supportsMultiApiKey(preset?.id);
587649
587912
  return /* @__PURE__ */ jsx_runtime324.jsxs(ThemedBox_default, {
587650
587913
  flexDirection: "column",
@@ -587657,7 +587920,7 @@ ${r2.output.slice(-200)}`);
587657
587920
  }),
587658
587921
  /* @__PURE__ */ jsx_runtime324.jsx(ThemedText, {
587659
587922
  dimColor: true,
587660
- children: isBedrock ? "Bedrock API key (bearer token). Stored locally in ~/.rayu/providers.json (0600)." : "Stored locally in ~/.rayu/providers.json (0600). Leave blank to skip."
587923
+ children: isBedrock ? "Bedrock API key (bearer token). Stored locally in ~/.rayu/providers.json (0600)." : isOllamaCloud ? "Ollama Cloud API key (ollama.com → Settings → Keys). Stored locally in ~/.rayu/providers.json (0600)." : "Stored locally in ~/.rayu/providers.json (0600). Leave blank to skip."
587661
587924
  }),
587662
587925
  showMultiKeyUpsell ? /* @__PURE__ */ jsx_runtime324.jsxs(ThemedText, {
587663
587926
  dimColor: true,
@@ -587670,9 +587933,9 @@ ${r2.output.slice(-200)}`);
587670
587933
  /* @__PURE__ */ jsx_runtime324.jsx(TextInput, {
587671
587934
  value: apiKey,
587672
587935
  onChange: setApiKey,
587673
- onSubmit: () => isBedrock ? setPhase("region") : finish(apiKey),
587936
+ onSubmit: () => isBedrock ? setPhase("region") : isOllamaCloud ? setPhase("ollamaCloudFetching") : finish(apiKey),
587674
587937
  mask: "*",
587675
- placeholder: isBedrock ? "ABSK..." : "sk-...",
587938
+ placeholder: isBedrock ? "ABSK..." : isOllamaCloud ? "your ollama.com API key" : "sk-...",
587676
587939
  columns: 80,
587677
587940
  cursorOffset: cursor,
587678
587941
  onChangeCursorOffset: setCursor
@@ -593564,7 +593827,7 @@ function generateHtmlReport(data, insights) {
593564
593827
  </html>`;
593565
593828
  }
593566
593829
  function buildExportData(data, insights, facets, remoteStats) {
593567
- const version3 = typeof MACRO !== "undefined" ? "1.4.467" : "unknown";
593830
+ const version3 = typeof MACRO !== "undefined" ? "1.4.469" : "unknown";
593568
593831
  const remote_hosts_collected = remoteStats?.hosts.filter((h3) => h3.sessionCount > 0).map((h3) => h3.name);
593569
593832
  const facets_summary = {
593570
593833
  total: facets.size,
@@ -597474,7 +597737,7 @@ var init_sessionStorage = __esm(() => {
597474
597737
  init_settings2();
597475
597738
  init_slowOperations();
597476
597739
  init_uuid();
597477
- VERSION6 = typeof MACRO !== "undefined" ? "1.4.467" : "unknown";
597740
+ VERSION6 = typeof MACRO !== "undefined" ? "1.4.469" : "unknown";
597478
597741
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
597479
597742
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
597480
597743
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -598692,7 +598955,7 @@ var init_filesystem = __esm(() => {
598692
598955
  });
598693
598956
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
598694
598957
  const nonce = randomBytes19(16).toString("hex");
598695
- return join153(getClaudeTempDir(), "bundled-skills", "1.4.467", nonce);
598958
+ return join153(getClaudeTempDir(), "bundled-skills", "1.4.469", nonce);
598696
598959
  });
598697
598960
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
598698
598961
  });
@@ -603862,7 +604125,7 @@ __export(exports_update, {
603862
604125
  update: () => update
603863
604126
  });
603864
604127
  async function update() {
603865
- writeToStdout(`Current version: ${"1.4.467"}
604128
+ writeToStdout(`Current version: ${"1.4.469"}
603866
604129
  `);
603867
604130
  const isBundled = isInBundledMode();
603868
604131
  if (isBundled) {
@@ -603893,13 +604156,13 @@ Manual check: npm view ${"@rayu-dev/rayu-cli"} version
603893
604156
  process.exit(1);
603894
604157
  return;
603895
604158
  }
603896
- if (latestVersion === "1.4.467") {
604159
+ if (latestVersion === "1.4.469") {
603897
604160
  writeToStdout(source_default.green(`
603898
- Rayu CLI is up to date (${"1.4.467"})
604161
+ Rayu CLI is up to date (${"1.4.469"})
603899
604162
  `));
603900
604163
  process.exit(0);
603901
604164
  }
603902
- writeToStdout(`New version available: ${latestVersion} (current: ${"1.4.467"})
604165
+ writeToStdout(`New version available: ${latestVersion} (current: ${"1.4.469"})
603903
604166
  `);
603904
604167
  writeToStdout(`Installing update...
603905
604168
 
@@ -603966,14 +604229,14 @@ async function updateNativeBinary() {
603966
604229
  } catch {
603967
604230
  latestVersion = "";
603968
604231
  }
603969
- if (latestVersion && latestVersion === "1.4.467") {
604232
+ if (latestVersion && latestVersion === "1.4.469") {
603970
604233
  writeToStdout(source_default.green(`
603971
- Rayu CLI is up to date (1.4.467)
604234
+ Rayu CLI is up to date (1.4.469)
603972
604235
  `));
603973
604236
  process.exit(0);
603974
604237
  }
603975
604238
  if (latestVersion) {
603976
- writeToStdout(`New version available: ${latestVersion} (current: 1.4.467)
604239
+ writeToStdout(`New version available: ${latestVersion} (current: 1.4.469)
603977
604240
  `);
603978
604241
  }
603979
604242
  writeToStdout(`Downloading and installing update...
@@ -603988,13 +604251,13 @@ Rayu CLI is up to date (1.4.467)
603988
604251
  return;
603989
604252
  }
603990
604253
  writeToStdout(source_default.green(`
603991
- Rayu CLI is up to date (1.4.467)
604254
+ Rayu CLI is up to date (1.4.469)
603992
604255
  `));
603993
604256
  process.exit(0);
603994
604257
  }
603995
604258
  const updatedTo = result.latestVersion ?? latestVersion ?? "latest";
603996
604259
  writeToStdout(source_default.green(`
603997
- Successfully updated from 1.4.467 to ${updatedTo}
604260
+ Successfully updated from 1.4.469 to ${updatedTo}
603998
604261
  `));
603999
604262
  writeToStdout(`Restart your terminal to use the new version.
604000
604263
  `);
@@ -604059,7 +604322,7 @@ async function removeDataDir(dir) {
604059
604322
  async function uninstall(args = []) {
604060
604323
  const yes = args.includes("--yes") || args.includes("-y");
604061
604324
  const keepData = args.includes("--keep-data");
604062
- writeToStdout(`Uninstalling Rayu CLI (${"1.4.467"})...
604325
+ writeToStdout(`Uninstalling Rayu CLI (${"1.4.469"})...
604063
604326
  `);
604064
604327
  writeToStdout(`Running: npm uninstall -g ${"@rayu-dev/rayu-cli"}
604065
604328
 
@@ -604093,7 +604356,7 @@ This looks like a permissions error on npm's global install
604093
604356
  return;
604094
604357
  }
604095
604358
  writeToStdout(source_default.green(`
604096
- Successfully uninstalled ${"@rayu-dev/rayu-cli"} ${"1.4.467"}
604359
+ Successfully uninstalled ${"@rayu-dev/rayu-cli"} ${"1.4.469"}
604097
604360
  `));
604098
604361
  const configDir = getRayuConfigHomeDir();
604099
604362
  const dataExists = existsSync28(configDir);
@@ -604176,7 +604439,7 @@ function showFirstRunWelcome() {
604176
604439
  `);
604177
604440
  try {
604178
604441
  mkdirSync16(getRayuConfigHomeDir(), { recursive: true });
604179
- writeFileSync18(markerPath(), "1.4.467", "utf8");
604442
+ writeFileSync18(markerPath(), "1.4.469", "utf8");
604180
604443
  } catch {}
604181
604444
  }
604182
604445
  var init_firstRun = __esm(() => {
@@ -620362,7 +620625,7 @@ async function initializeBetaTracing(resource) {
620362
620625
  });
620363
620626
  import_api_logs.logs.setGlobalLoggerProvider(loggerProvider);
620364
620627
  setLoggerProvider(loggerProvider);
620365
- const eventLogger = import_api_logs.logs.getLogger("com.anthropic.claude_code.events", "1.4.467");
620628
+ const eventLogger = import_api_logs.logs.getLogger("com.anthropic.claude_code.events", "1.4.469");
620366
620629
  setEventLogger(eventLogger);
620367
620630
  process.on("beforeExit", async () => {
620368
620631
  await loggerProvider?.forceFlush();
@@ -620402,7 +620665,7 @@ async function initializeTelemetry() {
620402
620665
  const platform4 = getPlatform();
620403
620666
  const baseAttributes = {
620404
620667
  [import_semantic_conventions.ATTR_SERVICE_NAME]: "claude-code",
620405
- [import_semantic_conventions.ATTR_SERVICE_VERSION]: "1.4.467"
620668
+ [import_semantic_conventions.ATTR_SERVICE_VERSION]: "1.4.469"
620406
620669
  };
620407
620670
  if (platform4 === "wsl") {
620408
620671
  const wslVersion = getWslVersion();
@@ -620447,7 +620710,7 @@ async function initializeTelemetry() {
620447
620710
  } catch {}
620448
620711
  };
620449
620712
  registerCleanup(shutdownTelemetry2);
620450
- return meterProvider2.getMeter("com.anthropic.claude_code", "1.4.467");
620713
+ return meterProvider2.getMeter("com.anthropic.claude_code", "1.4.469");
620451
620714
  }
620452
620715
  const meterProvider = new import_sdk_metrics2.MeterProvider({
620453
620716
  resource,
@@ -620467,7 +620730,7 @@ async function initializeTelemetry() {
620467
620730
  });
620468
620731
  import_api_logs.logs.setGlobalLoggerProvider(loggerProvider);
620469
620732
  setLoggerProvider(loggerProvider);
620470
- const eventLogger = import_api_logs.logs.getLogger("com.anthropic.claude_code.events", "1.4.467");
620733
+ const eventLogger = import_api_logs.logs.getLogger("com.anthropic.claude_code.events", "1.4.469");
620471
620734
  setEventLogger(eventLogger);
620472
620735
  logForDebugging("[3P telemetry] Event logger set successfully");
620473
620736
  process.on("beforeExit", async () => {
@@ -620529,7 +620792,7 @@ Current timeout: ${timeoutMs}ms
620529
620792
  }
620530
620793
  };
620531
620794
  registerCleanup(shutdownTelemetry);
620532
- return meterProvider.getMeter("com.anthropic.claude_code", "1.4.467");
620795
+ return meterProvider.getMeter("com.anthropic.claude_code", "1.4.469");
620533
620796
  }
620534
620797
  async function flushTelemetry() {
620535
620798
  const meterProvider = getMeterProvider();
@@ -622031,7 +622294,7 @@ function buildSystemInitMessage(inputs) {
622031
622294
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
622032
622295
  apiKeySource: getAnthropicApiKeyWithSource().source,
622033
622296
  betas: getSdkBetas(),
622034
- claude_code_version: "1.4.467",
622297
+ claude_code_version: "1.4.469",
622035
622298
  output_style: outputStyle2,
622036
622299
  agents: inputs.agents.map((agent) => agent.agentType),
622037
622300
  skills: inputs.skills.filter((s2) => s2.userInvocable !== false).map((skill) => skill.name),
@@ -638362,7 +638625,7 @@ var init_useVoiceEnabled = __esm(() => {
638362
638625
  function getSemverPart(version3) {
638363
638626
  return `${import_semver12.major(version3, { loose: true })}.${import_semver12.minor(version3, { loose: true })}.${import_semver12.patch(version3, { loose: true })}`;
638364
638627
  }
638365
- function useUpdateNotification(updatedVersion, initialVersion = "1.4.467") {
638628
+ function useUpdateNotification(updatedVersion, initialVersion = "1.4.469") {
638366
638629
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react216.useState(() => getSemverPart(initialVersion));
638367
638630
  if (!updatedVersion) {
638368
638631
  return null;
@@ -638402,7 +638665,7 @@ function AutoUpdater({
638402
638665
  return;
638403
638666
  }
638404
638667
  if (false) {}
638405
- const currentVersion = "1.4.467";
638668
+ const currentVersion = "1.4.469";
638406
638669
  const channel2 = getInitialSettings()?.autoUpdatesChannel ?? "latest";
638407
638670
  let latestVersion = await getLatestVersion(channel2);
638408
638671
  const isDisabled = isAutoUpdaterDisabled();
@@ -638615,12 +638878,12 @@ function NativeAutoUpdater({
638615
638878
  logEvent("tengu_native_auto_updater_start", {});
638616
638879
  try {
638617
638880
  const maxVersion = await getMaxVersion();
638618
- if (maxVersion && gt("1.4.467", maxVersion)) {
638881
+ if (maxVersion && gt("1.4.469", maxVersion)) {
638619
638882
  const msg = await getMaxVersionMessage();
638620
638883
  setMaxVersionIssue(msg ?? "affects your version");
638621
638884
  }
638622
638885
  const result = await installLatest(channel2);
638623
- const currentVersion = "1.4.467";
638886
+ const currentVersion = "1.4.469";
638624
638887
  const latencyMs = Date.now() - startTime2;
638625
638888
  if (result.lockFailed) {
638626
638889
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -638757,17 +639020,17 @@ function PackageManagerAutoUpdater(t0) {
638757
639020
  const maxVersion = await getMaxVersion();
638758
639021
  if (maxVersion && latest && gt(latest, maxVersion)) {
638759
639022
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
638760
- if (gte("1.4.467", maxVersion)) {
638761
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.4.467"} is already at or above maxVersion ${maxVersion}, skipping update`);
639023
+ if (gte("1.4.469", maxVersion)) {
639024
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.4.469"} is already at or above maxVersion ${maxVersion}, skipping update`);
638762
639025
  setUpdateAvailable(false);
638763
639026
  return;
638764
639027
  }
638765
639028
  latest = maxVersion;
638766
639029
  }
638767
- const hasUpdate = latest && !gte("1.4.467", latest) && !shouldSkipVersion(latest);
639030
+ const hasUpdate = latest && !gte("1.4.469", latest) && !shouldSkipVersion(latest);
638768
639031
  setUpdateAvailable(!!hasUpdate);
638769
639032
  if (hasUpdate) {
638770
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.4.467"} -> ${latest}`);
639033
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.4.469"} -> ${latest}`);
638771
639034
  }
638772
639035
  };
638773
639036
  $3[0] = t1;
@@ -638801,7 +639064,7 @@ function PackageManagerAutoUpdater(t0) {
638801
639064
  wrap: "truncate",
638802
639065
  children: [
638803
639066
  "currentVersion: ",
638804
- "1.4.467"
639067
+ "1.4.469"
638805
639068
  ]
638806
639069
  });
638807
639070
  $3[3] = verbose;
@@ -646965,7 +647228,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
646965
647228
  project_dir: getOriginalCwd(),
646966
647229
  added_dirs: addedDirs
646967
647230
  },
646968
- version: "1.4.467",
647231
+ version: "1.4.469",
646969
647232
  output_style: {
646970
647233
  name: outputStyleName
646971
647234
  },
@@ -649144,7 +649407,7 @@ var init_user = __esm(() => {
649144
649407
  deviceId,
649145
649408
  sessionId: getSessionId(),
649146
649409
  email: getEmail(),
649147
- appVersion: "1.4.467",
649410
+ appVersion: "1.4.469",
649148
649411
  platform: getHostPlatformForAnalytics(),
649149
649412
  organizationUuid,
649150
649413
  accountUuid,
@@ -658583,7 +658846,7 @@ async function submitTranscriptShare(messages, trigger, appearanceId) {
658583
658846
  } catch {}
658584
658847
  const data = {
658585
658848
  trigger,
658586
- version: "1.4.467",
658849
+ version: "1.4.469",
658587
658850
  platform: process.platform,
658588
658851
  transcript,
658589
658852
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -670550,7 +670813,7 @@ function WelcomeV2() {
670550
670813
  dimColor: true,
670551
670814
  children: [
670552
670815
  "v",
670553
- "1.4.467"
670816
+ "1.4.469"
670554
670817
  ]
670555
670818
  })
670556
670819
  ]
@@ -671557,7 +671820,7 @@ function completeOnboarding() {
671557
671820
  saveGlobalConfig((current) => ({
671558
671821
  ...current,
671559
671822
  hasCompletedOnboarding: true,
671560
- lastOnboardingVersion: "1.4.467"
671823
+ lastOnboardingVersion: "1.4.469"
671561
671824
  }));
671562
671825
  }
671563
671826
  function showDialog(root2, renderer) {
@@ -676490,7 +676753,7 @@ function appendToLog(path29, message) {
676490
676753
  cwd: getFsImplementation().cwd(),
676491
676754
  userType: "external",
676492
676755
  sessionId: getSessionId(),
676493
- version: "1.4.467"
676756
+ version: "1.4.469"
676494
676757
  };
676495
676758
  getLogWriter(path29).write(messageWithTimestamp);
676496
676759
  }
@@ -680595,8 +680858,8 @@ async function getEnvLessBridgeConfig() {
680595
680858
  }
680596
680859
  async function checkEnvLessBridgeMinVersion() {
680597
680860
  const cfg = await getEnvLessBridgeConfig();
680598
- if (cfg.min_version && lt("1.4.467", cfg.min_version)) {
680599
- return `Your version of RAYU (${"1.4.467"}) is too old for Remote Control.
680861
+ if (cfg.min_version && lt("1.4.469", cfg.min_version)) {
680862
+ return `Your version of RAYU (${"1.4.469"}) is too old for Remote Control.
680600
680863
  Version ${cfg.min_version} or higher is required. Run \`claude update\` to update.`;
680601
680864
  }
680602
680865
  return null;
@@ -681069,7 +681332,7 @@ async function initBridgeCore(params) {
681069
681332
  const rawApi = createBridgeApiClient({
681070
681333
  baseUrl,
681071
681334
  getAccessToken,
681072
- runnerVersion: "1.4.467",
681335
+ runnerVersion: "1.4.469",
681073
681336
  onDebug: logForDebugging,
681074
681337
  onAuth401,
681075
681338
  getTrustedDeviceToken
@@ -686424,7 +686687,7 @@ async function startMCPServer(cwd3, debug4, verbose) {
686424
686687
  setCwd(cwd3);
686425
686688
  const server = new Server({
686426
686689
  name: "claude/tengu",
686427
- version: "1.4.467"
686690
+ version: "1.4.469"
686428
686691
  }, {
686429
686692
  capabilities: {
686430
686693
  tools: {}
@@ -688950,7 +689213,7 @@ ${customInstructions}` : customInstructions;
688950
689213
  }
688951
689214
  }
688952
689215
  logForDiagnosticsNoPII("info", "started", {
688953
- version: "1.4.467",
689216
+ version: "1.4.469",
688954
689217
  is_native_binary: isInBundledMode()
688955
689218
  });
688956
689219
  registerCleanup(async () => {
@@ -689669,7 +689932,7 @@ Usage: rayu --remote "your task description"`, () => gracefulShutdown(1));
689669
689932
  pendingHookMessages
689670
689933
  }, renderAndRun);
689671
689934
  }
689672
- }).version(`1.4.467 (${PRODUCT_NAME})`, "-v, --version", "Output the version number");
689935
+ }).version(`1.4.469 (${PRODUCT_NAME})`, "-v, --version", "Output the version number");
689673
689936
  program.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
689674
689937
  program.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
689675
689938
  if (canUserConfigureAdvisor()) {
@@ -690129,7 +690392,7 @@ if (false) {}
690129
690392
  async function main2() {
690130
690393
  const args = process.argv.slice(2);
690131
690394
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
690132
- console.log(`${"1.4.467"} (Rayu-CLI)`);
690395
+ console.log(`${"1.4.469"} (Rayu-CLI)`);
690133
690396
  return;
690134
690397
  }
690135
690398
  if (!isEnvTruthy(process.env.CLAUDE_CODE_DISABLE_TERMINAL_TITLE)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rayu-dev/rayu-cli",
3
- "version": "1.4.467",
3
+ "version": "1.4.469",
4
4
  "description": "Rayu-CLI — a multi-provider AI coding CLI",
5
5
  "type": "module",
6
6
  "bin": {