ur-agent 1.31.0 → 1.32.0

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.32.0
4
+
5
+ - `/model` now shows the subscription providers (Codex CLI, Claude Code, Gemini
6
+ CLI, Antigravity) again. They are enabled the moment you `ur connect` them
7
+ (persisted per-account opt-in) — no `UR_ENABLE_EXTERNAL_APP_PROVIDERS` env var
8
+ needed — and run via the official CLI. Not connected → clear connect prompt.
9
+ - API providers (OpenAI, Anthropic, Gemini, OpenRouter) now load their model
10
+ lists **live** from each provider's `/models` endpoint using your connected
11
+ key (OpenAI/Anthropic/OpenRouter `data[].id`; Gemini `models[]` filtered to
12
+ `generateContent`). No hardcoded model IDs; the curated list is only a
13
+ fallback shown before you connect. Subscription CLIs keep a curated list
14
+ because their official CLIs expose no models API.
15
+ - Live-discovered models validate against the discovered list (with cold-process
16
+ tolerance), so a saved API model keeps working across restarts.
17
+
3
18
  ## 1.31.0
4
19
 
5
20
  - Add in-app provider connection: `ur connect` / `/connect` connects a provider
package/dist/cli.js CHANGED
@@ -51616,6 +51616,7 @@ __export(exports_providerRegistry, {
51616
51616
  isProviderRuntimeSelectable: () => isProviderRuntimeSelectable,
51617
51617
  isProviderId: () => isProviderId,
51618
51618
  isModelSupportedByProvider: () => isModelSupportedByProvider,
51619
+ isExternalBridgeEnabled: () => isExternalBridgeEnabled,
51619
51620
  getValidModelIdsForProvider: () => getValidModelIdsForProvider,
51620
51621
  getRuntimeProviderId: () => getRuntimeProviderId,
51621
51622
  getProviderStatus: () => getProviderStatus,
@@ -51635,6 +51636,7 @@ __export(exports_providerRegistry, {
51635
51636
  formatProviderDoctor: () => formatProviderDoctor,
51636
51637
  formatInvalidProviderModelMessage: () => formatInvalidProviderModelMessage,
51637
51638
  externalAppProviderBridgeEnabled: () => externalAppProviderBridgeEnabled,
51639
+ enableExternalBridge: () => enableExternalBridge,
51638
51640
  doctorProvider: () => doctorProvider,
51639
51641
  doctorActiveProvider: () => doctorActiveProvider,
51640
51642
  credentialTypeLabel: () => credentialTypeLabel,
@@ -51775,11 +51777,43 @@ function credentialTypeLabel(type) {
51775
51777
  function externalAppProviderBridgeEnabled(env4 = process.env) {
51776
51778
  return env4.UR_ENABLE_EXTERNAL_APP_PROVIDERS === "1";
51777
51779
  }
51780
+ function isExternalBridgeEnabled(providerId, env4 = process.env, settings = getInitialSettings()) {
51781
+ if (externalAppProviderBridgeEnabled(env4)) {
51782
+ return true;
51783
+ }
51784
+ const provider = resolveProviderId(providerId);
51785
+ const enabled = settings.provider?.enabledExternalBridges;
51786
+ return Boolean(provider && Array.isArray(enabled) && enabled.includes(provider));
51787
+ }
51788
+ function enableExternalBridge(providerId) {
51789
+ const provider = resolveProviderId(providerId);
51790
+ if (!provider) {
51791
+ return { ok: false, message: `Unknown provider "${providerId}". Run: ur provider list` };
51792
+ }
51793
+ if (getProviderDefinition(provider).runtimeKind !== "external-app") {
51794
+ return { ok: true, message: `${provider} does not require an external-app opt-in.` };
51795
+ }
51796
+ const settings = getInitialSettings();
51797
+ const current = settings.provider?.enabledExternalBridges ?? [];
51798
+ if (current.includes(provider)) {
51799
+ return { ok: true, message: `${provider} is already enabled.` };
51800
+ }
51801
+ const result = updateSettingsForSource("userSettings", {
51802
+ provider: {
51803
+ ...settings.provider ?? {},
51804
+ enabledExternalBridges: [...current, provider]
51805
+ }
51806
+ });
51807
+ if (result.error) {
51808
+ return { ok: false, message: `Failed to persist opt-in: ${result.error.message}` };
51809
+ }
51810
+ return { ok: true, message: `Enabled ${provider} for this account.` };
51811
+ }
51778
51812
  function getProviderRuntimeKind(providerId) {
51779
51813
  const provider = resolveProviderId(providerId);
51780
51814
  return provider ? getProviderDefinition(provider).runtimeKind : "unknown";
51781
51815
  }
51782
- function getProviderRuntimeBlockReason(providerId, env4 = process.env) {
51816
+ function getProviderRuntimeBlockReason(providerId, env4 = process.env, settings = getInitialSettings()) {
51783
51817
  const provider = resolveProviderId(providerId);
51784
51818
  if (!provider) {
51785
51819
  return `Unknown provider "${providerId}". Run: ur provider list`;
@@ -51791,10 +51825,10 @@ function getProviderRuntimeBlockReason(providerId, env4 = process.env) {
51791
51825
  if (definition.runtimeKind !== "external-app") {
51792
51826
  return null;
51793
51827
  }
51794
- if (externalAppProviderBridgeEnabled(env4)) {
51828
+ if (isExternalBridgeEnabled(provider, env4, settings)) {
51795
51829
  return null;
51796
51830
  }
51797
- return `Provider "${provider}" uses an external app bridge (${definition.displayName}), not a UR-native model endpoint. UR's independent runtime does not require Codex, Claude Code, Gemini CLI, or Antigravity to be installed. Choose an API/local/server provider such as openai-api, anthropic-api, gemini-api, openrouter, ollama, lmstudio, llama.cpp, or vllm. To intentionally delegate turns to the external app bridge, set UR_ENABLE_EXTERNAL_APP_PROVIDERS=1.`;
51831
+ return `Provider "${provider}" uses an external app bridge (${definition.displayName}). Connect it once with \`ur connect ${provider}\` (or set UR_ENABLE_EXTERNAL_APP_PROVIDERS=1) to enable it. Otherwise choose an API/local/server provider such as openai-api, anthropic-api, gemini-api, openrouter, ollama, lmstudio, llama.cpp, or vllm.`;
51798
51832
  }
51799
51833
  function isProviderRuntimeSelectable(providerId, env4 = process.env) {
51800
51834
  return getProviderRuntimeBlockReason(providerId, env4) === null;
@@ -52564,6 +52598,9 @@ function staticModelsForProvider(provider) {
52564
52598
  async function discoverLiveModelsForProvider(provider, options = {}) {
52565
52599
  const definition = getProviderDefinition(provider);
52566
52600
  if (!definition.endpointKind) {
52601
+ if (definition.accessType === "api" && definition.modelDiscoveryType === "live") {
52602
+ return discoverApiProviderModels(provider, definition, options);
52603
+ }
52567
52604
  return [];
52568
52605
  }
52569
52606
  const settings = options.settings ?? getInitialSettings();
@@ -52585,6 +52622,68 @@ async function discoverLiveModelsForProvider(provider, options = {}) {
52585
52622
  const names = definition.endpointKind === "ollama" ? parseOllamaModelNamesFromTags(body) : parseOpenAICompatibleModelNames(body);
52586
52623
  return modelDefinitionsFromNames(provider, names, "live");
52587
52624
  }
52625
+ function apiModelsRequest(provider, apiKey) {
52626
+ switch (provider) {
52627
+ case "anthropic-api":
52628
+ return {
52629
+ url: "https://api.anthropic.com/v1/models",
52630
+ headers: { "x-api-key": apiKey, "anthropic-version": "2023-06-01" }
52631
+ };
52632
+ case "gemini-api":
52633
+ return {
52634
+ url: "https://generativelanguage.googleapis.com/v1beta/models",
52635
+ headers: { "x-goog-api-key": apiKey }
52636
+ };
52637
+ case "openrouter":
52638
+ return {
52639
+ url: "https://openrouter.ai/api/v1/models",
52640
+ headers: { Authorization: `Bearer ${apiKey}` }
52641
+ };
52642
+ default:
52643
+ return {
52644
+ url: "https://api.openai.com/v1/models",
52645
+ headers: { Authorization: `Bearer ${apiKey}` }
52646
+ };
52647
+ }
52648
+ }
52649
+ function parseApiModelIds(provider, body) {
52650
+ const root2 = body ?? {};
52651
+ if (provider === "gemini-api") {
52652
+ const models = Array.isArray(root2.models) ? root2.models : [];
52653
+ const names2 = models.filter((m) => {
52654
+ const methods = m.supportedGenerationMethods;
52655
+ return !Array.isArray(methods) || methods.includes("generateContent");
52656
+ }).map((m) => typeof m.name === "string" ? m.name.replace(/^models\//, "") : "").filter(Boolean);
52657
+ return [...new Set(names2)].sort((a2, b) => a2.localeCompare(b));
52658
+ }
52659
+ const data = Array.isArray(root2.data) ? root2.data : [];
52660
+ const names = data.map((m) => typeof m.id === "string" ? m.id : "").filter(Boolean);
52661
+ return [...new Set(names)].sort((a2, b) => a2.localeCompare(b));
52662
+ }
52663
+ async function discoverApiProviderModels(provider, definition, options) {
52664
+ const env4 = options.adapters?.env ?? process.env;
52665
+ let apiKey = definition.envKey ? env4[definition.envKey] : undefined;
52666
+ if (!apiKey) {
52667
+ try {
52668
+ const { getProviderApiKey: getProviderApiKey2 } = await Promise.resolve().then(() => (init_providerCredentials(), exports_providerCredentials));
52669
+ apiKey = getProviderApiKey2(provider, { env: env4 });
52670
+ } catch {}
52671
+ }
52672
+ if (!apiKey) {
52673
+ throw new Error(`Not connected: run \`ur connect ${provider}\` to add an API key.`);
52674
+ }
52675
+ const { url: url3, headers } = apiModelsRequest(provider, apiKey);
52676
+ const response = await (options.adapters?.fetch ?? fetch)(url3, {
52677
+ method: "GET",
52678
+ signal: options.signal,
52679
+ headers
52680
+ });
52681
+ if (!response.ok) {
52682
+ throw new Error(`${url3} returned HTTP ${response.status}.`);
52683
+ }
52684
+ const body = await response.json();
52685
+ return modelDefinitionsFromNames(provider, parseApiModelIds(provider, body), "live");
52686
+ }
52588
52687
  async function listModelsForProviderWithSource(providerId, options = {}) {
52589
52688
  const provider = resolveProviderId(providerId);
52590
52689
  if (!provider) {
@@ -52707,12 +52806,13 @@ function validateProviderModelPair(providerId, modelId, options = {}) {
52707
52806
  const suppliedModels = (options.availableModels ?? []).map((model) => typeof model === "string" ? model : model.id);
52708
52807
  const cachedModels = getCachedProviderModels(provider).map((model) => model.id);
52709
52808
  const staticModelIds = staticModelsForProvider(provider).map((model) => model.id);
52710
- const hasDynamicModels = models.some((model) => model.isDynamic);
52809
+ const hasDynamicModels = models.some((model) => model.isDynamic) || getProviderDefinition(provider).modelDiscoveryType === "live";
52711
52810
  const validModelIds = suppliedModels.length > 0 ? suppliedModels : hasDynamicModels ? cachedModels.length > 0 ? cachedModels : staticModelIds : Array.from(new Set([...staticModelIds, ...cachedModels]));
52712
52811
  if (validModelIds.includes(modelId)) {
52713
52812
  return { valid: true };
52714
52813
  }
52715
- if (hasDynamicModels && options.allowUncachedDynamic && validModelIds.length === 0) {
52814
+ const noAuthoritativeList = cachedModels.length === 0 && suppliedModels.length === 0;
52815
+ if (hasDynamicModels && options.allowUncachedDynamic && noAuthoritativeList) {
52716
52816
  return { valid: true };
52717
52817
  }
52718
52818
  const defaultModel = getDefaultModelForProvider(provider);
@@ -52889,10 +52989,10 @@ var init_providerRegistry = __esm(() => {
52889
52989
  statusBarName: "OpenAI",
52890
52990
  accessType: "api",
52891
52991
  credentialType: "api-key",
52892
- modelDiscoveryType: "static",
52992
+ modelDiscoveryType: "live",
52893
52993
  statusCheck: "api-key",
52894
52994
  listModels: "static",
52895
- validateModel: "static-list",
52995
+ validateModel: "discovered-list",
52896
52996
  runtimeKind: "ur-native",
52897
52997
  authMode: "api",
52898
52998
  legalPath: "OPENAI_API_KEY",
@@ -52905,10 +53005,10 @@ var init_providerRegistry = __esm(() => {
52905
53005
  statusBarName: "Claude API",
52906
53006
  accessType: "api",
52907
53007
  credentialType: "api-key",
52908
- modelDiscoveryType: "static",
53008
+ modelDiscoveryType: "live",
52909
53009
  statusCheck: "api-key",
52910
53010
  listModels: "static",
52911
- validateModel: "static-list",
53011
+ validateModel: "discovered-list",
52912
53012
  runtimeKind: "ur-native",
52913
53013
  authMode: "api",
52914
53014
  legalPath: "ANTHROPIC_API_KEY",
@@ -52921,10 +53021,10 @@ var init_providerRegistry = __esm(() => {
52921
53021
  statusBarName: "Gemini API",
52922
53022
  accessType: "api",
52923
53023
  credentialType: "api-key",
52924
- modelDiscoveryType: "static",
53024
+ modelDiscoveryType: "live",
52925
53025
  statusCheck: "api-key",
52926
53026
  listModels: "static",
52927
- validateModel: "static-list",
53027
+ validateModel: "discovered-list",
52928
53028
  runtimeKind: "ur-native",
52929
53029
  authMode: "api",
52930
53030
  legalPath: "GEMINI_API_KEY",
@@ -52937,10 +53037,10 @@ var init_providerRegistry = __esm(() => {
52937
53037
  statusBarName: "OpenRouter",
52938
53038
  accessType: "api",
52939
53039
  credentialType: "api-key",
52940
- modelDiscoveryType: "static",
53040
+ modelDiscoveryType: "live",
52941
53041
  statusCheck: "api-key",
52942
53042
  listModels: "static",
52943
- validateModel: "static-list",
53043
+ validateModel: "discovered-list",
52944
53044
  runtimeKind: "ur-native",
52945
53045
  authMode: "api",
52946
53046
  legalPath: "OPENROUTER_API_KEY",
@@ -69418,7 +69518,7 @@ var init_auth = __esm(() => {
69418
69518
 
69419
69519
  // src/utils/userAgent.ts
69420
69520
  function getURCodeUserAgent() {
69421
- return `ur/${"1.31.0"}`;
69521
+ return `ur/${"1.32.0"}`;
69422
69522
  }
69423
69523
 
69424
69524
  // src/utils/workloadContext.ts
@@ -69440,7 +69540,7 @@ function getUserAgent() {
69440
69540
  const clientApp = process.env.UR_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}` : "";
69441
69541
  const workload = getWorkload();
69442
69542
  const workloadSuffix = workload ? `, workload/${workload}` : "";
69443
- return `ur-cli/${"1.31.0"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
69543
+ return `ur-cli/${"1.32.0"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
69444
69544
  }
69445
69545
  function getMCPUserAgent() {
69446
69546
  const parts = [];
@@ -69454,7 +69554,7 @@ function getMCPUserAgent() {
69454
69554
  parts.push(`client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}`);
69455
69555
  }
69456
69556
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
69457
- return `ur/${"1.31.0"}${suffix}`;
69557
+ return `ur/${"1.32.0"}${suffix}`;
69458
69558
  }
69459
69559
  function getWebFetchUserAgent() {
69460
69560
  return `UR-User (${getURCodeUserAgent()})`;
@@ -69592,7 +69692,7 @@ var init_user = __esm(() => {
69592
69692
  deviceId,
69593
69693
  sessionId: getSessionId(),
69594
69694
  email: getEmail(),
69595
- appVersion: "1.31.0",
69695
+ appVersion: "1.32.0",
69596
69696
  platform: getHostPlatformForAnalytics(),
69597
69697
  organizationUuid,
69598
69698
  accountUuid,
@@ -76109,7 +76209,7 @@ var init_metadata = __esm(() => {
76109
76209
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
76110
76210
  WHITESPACE_REGEX = /\s+/;
76111
76211
  getVersionBase = memoize_default(() => {
76112
- const match = "1.31.0".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
76212
+ const match = "1.32.0".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
76113
76213
  return match ? match[0] : undefined;
76114
76214
  });
76115
76215
  buildEnvContext = memoize_default(async () => {
@@ -76149,7 +76249,7 @@ var init_metadata = __esm(() => {
76149
76249
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
76150
76250
  isURCodeAction: isEnvTruthy(process.env.UR_CODE_ACTION),
76151
76251
  isURAiAuth: isURAISubscriber2(),
76152
- version: "1.31.0",
76252
+ version: "1.32.0",
76153
76253
  versionBase: getVersionBase(),
76154
76254
  buildTime: "",
76155
76255
  deploymentEnvironment: env2.detectDeploymentEnvironment(),
@@ -76819,7 +76919,7 @@ function initialize1PEventLogging() {
76819
76919
  const platform2 = getPlatform();
76820
76920
  const attributes = {
76821
76921
  [import_semantic_conventions4.ATTR_SERVICE_NAME]: "ur",
76822
- [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.31.0"
76922
+ [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.32.0"
76823
76923
  };
76824
76924
  if (platform2 === "wsl") {
76825
76925
  const wslVersion = getWslVersion();
@@ -76846,7 +76946,7 @@ function initialize1PEventLogging() {
76846
76946
  })
76847
76947
  ]
76848
76948
  });
76849
- firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.31.0");
76949
+ firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.32.0");
76850
76950
  }
76851
76951
  async function reinitialize1PEventLoggingIfConfigChanged() {
76852
76952
  if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
@@ -82143,7 +82243,7 @@ function formatAgentTrendReport(report = buildAgentTrendReport()) {
82143
82243
  function formatA2AAgentCard(options = {}, pretty = true) {
82144
82244
  return JSON.stringify(buildA2AAgentCard(options), null, pretty ? 2 : 0);
82145
82245
  }
82146
- var urVersion = "1.31.0", coverage, priorityRoadmap;
82246
+ var urVersion = "1.32.0", coverage, priorityRoadmap;
82147
82247
  var init_trends = __esm(() => {
82148
82248
  coverage = [
82149
82249
  {
@@ -84136,7 +84236,7 @@ function getAttributionHeader(fingerprint) {
84136
84236
  if (!isAttributionHeaderEnabled()) {
84137
84237
  return "";
84138
84238
  }
84139
- const version2 = `${"1.31.0"}.${fingerprint}`;
84239
+ const version2 = `${"1.32.0"}.${fingerprint}`;
84140
84240
  const entrypoint = process.env.UR_CODE_ENTRYPOINT ?? "unknown";
84141
84241
  const cch = "";
84142
84242
  const workload = getWorkload();
@@ -191790,7 +191890,7 @@ function getTelemetryAttributes() {
191790
191890
  attributes["session.id"] = sessionId;
191791
191891
  }
191792
191892
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
191793
- attributes["app.version"] = "1.31.0";
191893
+ attributes["app.version"] = "1.32.0";
191794
191894
  }
191795
191895
  const oauthAccount = getOauthAccountInfo();
191796
191896
  if (oauthAccount) {
@@ -227175,7 +227275,7 @@ function getInstallationEnv() {
227175
227275
  return;
227176
227276
  }
227177
227277
  function getURCodeVersion() {
227178
- return "1.31.0";
227278
+ return "1.32.0";
227179
227279
  }
227180
227280
  async function getInstalledVSCodeExtensionVersion(command) {
227181
227281
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -230014,7 +230114,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
230014
230114
  const client2 = new Client({
230015
230115
  name: "ur",
230016
230116
  title: "UR",
230017
- version: "1.31.0",
230117
+ version: "1.32.0",
230018
230118
  description: "UR-AGENT autonomous engineering workflow engine",
230019
230119
  websiteUrl: PRODUCT_URL
230020
230120
  }, {
@@ -230368,7 +230468,7 @@ var init_client5 = __esm(() => {
230368
230468
  const client2 = new Client({
230369
230469
  name: "ur",
230370
230470
  title: "UR",
230371
- version: "1.31.0",
230471
+ version: "1.32.0",
230372
230472
  description: "UR-AGENT autonomous engineering workflow engine",
230373
230473
  websiteUrl: PRODUCT_URL
230374
230474
  }, {
@@ -240182,9 +240282,9 @@ async function assertMinVersion() {
240182
240282
  if (false) {}
240183
240283
  try {
240184
240284
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
240185
- if (versionConfig.minVersion && lt("1.31.0", versionConfig.minVersion)) {
240285
+ if (versionConfig.minVersion && lt("1.32.0", versionConfig.minVersion)) {
240186
240286
  console.error(`
240187
- It looks like your version of UR (${"1.31.0"}) needs an update.
240287
+ It looks like your version of UR (${"1.32.0"}) needs an update.
240188
240288
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
240189
240289
 
240190
240290
  To update, please run:
@@ -240400,7 +240500,7 @@ async function installGlobalPackage(specificVersion) {
240400
240500
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
240401
240501
  logEvent("tengu_auto_updater_lock_contention", {
240402
240502
  pid: process.pid,
240403
- currentVersion: "1.31.0"
240503
+ currentVersion: "1.32.0"
240404
240504
  });
240405
240505
  return "in_progress";
240406
240506
  }
@@ -240409,7 +240509,7 @@ async function installGlobalPackage(specificVersion) {
240409
240509
  if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
240410
240510
  logError2(new Error("Windows NPM detected in WSL environment"));
240411
240511
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
240412
- currentVersion: "1.31.0"
240512
+ currentVersion: "1.32.0"
240413
240513
  });
240414
240514
  console.error(`
240415
240515
  Error: Windows NPM detected in WSL
@@ -240944,7 +241044,7 @@ function detectLinuxGlobPatternWarnings() {
240944
241044
  }
240945
241045
  async function getDoctorDiagnostic() {
240946
241046
  const installationType = await getCurrentInstallationType();
240947
- const version2 = typeof MACRO !== "undefined" ? "1.31.0" : "unknown";
241047
+ const version2 = typeof MACRO !== "undefined" ? "1.32.0" : "unknown";
240948
241048
  const installationPath = await getInstallationPath();
240949
241049
  const invokedBinary = getInvokedBinary();
240950
241050
  const multipleInstallations = await detectMultipleInstallations();
@@ -241879,8 +241979,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
241879
241979
  const maxVersion = await getMaxVersion();
241880
241980
  if (maxVersion && gt(version2, maxVersion)) {
241881
241981
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
241882
- if (gte("1.31.0", maxVersion)) {
241883
- logForDebugging(`Native installer: current version ${"1.31.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
241982
+ if (gte("1.32.0", maxVersion)) {
241983
+ logForDebugging(`Native installer: current version ${"1.32.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
241884
241984
  logEvent("tengu_native_update_skipped_max_version", {
241885
241985
  latency_ms: Date.now() - startTime,
241886
241986
  max_version: maxVersion,
@@ -241891,7 +241991,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
241891
241991
  version2 = maxVersion;
241892
241992
  }
241893
241993
  }
241894
- if (!forceReinstall && version2 === "1.31.0" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
241994
+ if (!forceReinstall && version2 === "1.32.0" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
241895
241995
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
241896
241996
  logEvent("tengu_native_update_complete", {
241897
241997
  latency_ms: Date.now() - startTime,
@@ -338795,7 +338895,7 @@ function Feedback({
338795
338895
  platform: env2.platform,
338796
338896
  gitRepo: envInfo.isGit,
338797
338897
  terminal: env2.terminal,
338798
- version: "1.31.0",
338898
+ version: "1.32.0",
338799
338899
  transcript: normalizeMessagesForAPI(messages),
338800
338900
  errors: sanitizedErrors,
338801
338901
  lastApiRequest: getLastAPIRequest(),
@@ -338987,7 +339087,7 @@ function Feedback({
338987
339087
  ", ",
338988
339088
  env2.terminal,
338989
339089
  ", v",
338990
- "1.31.0"
339090
+ "1.32.0"
338991
339091
  ]
338992
339092
  }, undefined, true, undefined, this)
338993
339093
  ]
@@ -339093,7 +339193,7 @@ ${sanitizedDescription}
339093
339193
  ` + `**Environment Info**
339094
339194
  ` + `- Platform: ${env2.platform}
339095
339195
  ` + `- Terminal: ${env2.terminal}
339096
- ` + `- Version: ${"1.31.0"}
339196
+ ` + `- Version: ${"1.32.0"}
339097
339197
  ` + `- Feedback ID: ${feedbackId}
339098
339198
  ` + `
339099
339199
  **Errors**
@@ -342204,7 +342304,7 @@ function buildPrimarySection() {
342204
342304
  }, undefined, false, undefined, this);
342205
342305
  return [{
342206
342306
  label: "Version",
342207
- value: "1.31.0"
342307
+ value: "1.32.0"
342208
342308
  }, {
342209
342309
  label: "Session name",
342210
342310
  value: nameValue
@@ -345504,7 +345604,7 @@ function Config({
345504
345604
  }
345505
345605
  }, undefined, false, undefined, this)
345506
345606
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime177.jsxDEV(ChannelDowngradeDialog, {
345507
- currentVersion: "1.31.0",
345607
+ currentVersion: "1.32.0",
345508
345608
  onChoice: (choice) => {
345509
345609
  setShowSubmenu(null);
345510
345610
  setTabsHidden(false);
@@ -345516,7 +345616,7 @@ function Config({
345516
345616
  autoUpdatesChannel: "stable"
345517
345617
  };
345518
345618
  if (choice === "stay") {
345519
- newSettings.minimumVersion = "1.31.0";
345619
+ newSettings.minimumVersion = "1.32.0";
345520
345620
  }
345521
345621
  updateSettingsForSource("userSettings", newSettings);
345522
345622
  setSettingsData((prev_27) => ({
@@ -353586,7 +353686,7 @@ function HelpV2(t0) {
353586
353686
  let t6;
353587
353687
  if ($3[31] !== tabs) {
353588
353688
  t6 = /* @__PURE__ */ jsx_dev_runtime204.jsxDEV(Tabs, {
353589
- title: `UR v${"1.31.0"}`,
353689
+ title: `UR v${"1.32.0"}`,
353590
353690
  color: "professionalBlue",
353591
353691
  defaultTab: "general",
353592
353692
  children: tabs
@@ -354332,7 +354432,7 @@ function buildToolUseContext(tools, readFileStateCache) {
354332
354432
  async function handleInitialize(options2) {
354333
354433
  return {
354334
354434
  name: "ur-agent",
354335
- version: "1.31.0",
354435
+ version: "1.32.0",
354336
354436
  protocolVersion: "0.1.0",
354337
354437
  workspaceRoot: options2.cwd,
354338
354438
  capabilities: {
@@ -374456,7 +374556,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
374456
374556
  return [];
374457
374557
  }
374458
374558
  }
374459
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.31.0") {
374559
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.32.0") {
374460
374560
  if (process.env.USER_TYPE === "ant") {
374461
374561
  const changelog = "";
374462
374562
  if (changelog) {
@@ -374483,7 +374583,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.31.0")
374483
374583
  releaseNotes
374484
374584
  };
374485
374585
  }
374486
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.31.0") {
374586
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.32.0") {
374487
374587
  if (process.env.USER_TYPE === "ant") {
374488
374588
  const changelog = "";
374489
374589
  if (changelog) {
@@ -375653,7 +375753,7 @@ function getRecentActivitySync() {
375653
375753
  return cachedActivity;
375654
375754
  }
375655
375755
  function getLogoDisplayData() {
375656
- const version2 = process.env.DEMO_VERSION ?? "1.31.0";
375756
+ const version2 = process.env.DEMO_VERSION ?? "1.32.0";
375657
375757
  const serverUrl = getDirectConnectServerUrl();
375658
375758
  const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd2());
375659
375759
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -376442,7 +376542,7 @@ function LogoV2() {
376442
376542
  if ($3[2] === Symbol.for("react.memo_cache_sentinel")) {
376443
376543
  t2 = () => {
376444
376544
  const currentConfig = getGlobalConfig();
376445
- if (currentConfig.lastReleaseNotesSeen === "1.31.0") {
376545
+ if (currentConfig.lastReleaseNotesSeen === "1.32.0") {
376446
376546
  return;
376447
376547
  }
376448
376548
  saveGlobalConfig(_temp326);
@@ -377127,12 +377227,12 @@ function LogoV2() {
377127
377227
  return t41;
377128
377228
  }
377129
377229
  function _temp326(current) {
377130
- if (current.lastReleaseNotesSeen === "1.31.0") {
377230
+ if (current.lastReleaseNotesSeen === "1.32.0") {
377131
377231
  return current;
377132
377232
  }
377133
377233
  return {
377134
377234
  ...current,
377135
- lastReleaseNotesSeen: "1.31.0"
377235
+ lastReleaseNotesSeen: "1.32.0"
377136
377236
  };
377137
377237
  }
377138
377238
  function _temp243(s_0) {
@@ -394365,8 +394465,10 @@ async function connectProvider(provider, keyFlag) {
394365
394465
  if (alias === "provider") {
394366
394466
  return `No official login is configured for ${provider}.`;
394367
394467
  }
394468
+ const enabled = enableExternalBridge(provider);
394368
394469
  const result = await launchProviderAuth(alias);
394369
- return result.message;
394470
+ return `${result.message}
394471
+ ${enabled.message} It will run via the official ${def2.displayName} CLI.`;
394370
394472
  }
394371
394473
  if (def2.envKey) {
394372
394474
  const key = keyFlag ?? await readStdinKey();
@@ -593026,7 +593128,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
593026
593128
  smapsRollup,
593027
593129
  platform: process.platform,
593028
593130
  nodeVersion: process.version,
593029
- ccVersion: "1.31.0"
593131
+ ccVersion: "1.32.0"
593030
593132
  };
593031
593133
  }
593032
593134
  async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
@@ -593612,7 +593714,7 @@ var init_bridge_kick = __esm(() => {
593612
593714
  var call137 = async () => {
593613
593715
  return {
593614
593716
  type: "text",
593615
- value: "1.31.0"
593717
+ value: "1.32.0"
593616
593718
  };
593617
593719
  }, version2, version_default;
593618
593720
  var init_version = __esm(() => {
@@ -596500,7 +596602,7 @@ function ProviderFirstModelPicker({
596500
596602
  import_react188.useEffect(() => {
596501
596603
  async function loadProviderStatus() {
596502
596604
  setLoadingProviders(true);
596503
- const providers = listProviders();
596605
+ const providers = listProviders({ includeExternalAppBridges: true });
596504
596606
  const settings = getSettingsForSource("userSettings");
596505
596607
  const options2 = await Promise.all(providers.map(async (provider) => {
596506
596608
  const status2 = await getProviderStatus(provider.id, {
@@ -603567,7 +603669,7 @@ function generateHtmlReport(data, insights) {
603567
603669
  </html>`;
603568
603670
  }
603569
603671
  function buildExportData(data, insights, facets, remoteStats) {
603570
- const version3 = typeof MACRO !== "undefined" ? "1.31.0" : "unknown";
603672
+ const version3 = typeof MACRO !== "undefined" ? "1.32.0" : "unknown";
603571
603673
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
603572
603674
  const facets_summary = {
603573
603675
  total: facets.size,
@@ -607847,7 +607949,7 @@ var init_sessionStorage = __esm(() => {
607847
607949
  init_settings2();
607848
607950
  init_slowOperations();
607849
607951
  init_uuid();
607850
- VERSION5 = typeof MACRO !== "undefined" ? "1.31.0" : "unknown";
607952
+ VERSION5 = typeof MACRO !== "undefined" ? "1.32.0" : "unknown";
607851
607953
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
607852
607954
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
607853
607955
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -609052,7 +609154,7 @@ var init_filesystem = __esm(() => {
609052
609154
  });
609053
609155
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
609054
609156
  const nonce = randomBytes18(16).toString("hex");
609055
- return join200(getURTempDir(), "bundled-skills", "1.31.0", nonce);
609157
+ return join200(getURTempDir(), "bundled-skills", "1.32.0", nonce);
609056
609158
  });
609057
609159
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
609058
609160
  });
@@ -615341,7 +615443,7 @@ function computeFingerprint(messageText2, version3) {
615341
615443
  }
615342
615444
  function computeFingerprintFromMessages(messages) {
615343
615445
  const firstMessageText = extractFirstMessageText(messages);
615344
- return computeFingerprint(firstMessageText, "1.31.0");
615446
+ return computeFingerprint(firstMessageText, "1.32.0");
615345
615447
  }
615346
615448
  var FINGERPRINT_SALT = "59cf53e54c78";
615347
615449
  var init_fingerprint = () => {};
@@ -617208,7 +617310,7 @@ async function sideQuery(opts) {
617208
617310
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
617209
617311
  }
617210
617312
  const messageText2 = extractFirstUserMessageText(messages);
617211
- const fingerprint = computeFingerprint(messageText2, "1.31.0");
617313
+ const fingerprint = computeFingerprint(messageText2, "1.32.0");
617212
617314
  const attributionHeader = getAttributionHeader(fingerprint);
617213
617315
  const systemBlocks = [
617214
617316
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -621945,7 +622047,7 @@ function buildSystemInitMessage(inputs) {
621945
622047
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
621946
622048
  apiKeySource: getURHQApiKeyWithSource().source,
621947
622049
  betas: getSdkBetas(),
621948
- ur_version: "1.31.0",
622050
+ ur_version: "1.32.0",
621949
622051
  output_style: outputStyle2,
621950
622052
  agents: inputs.agents.map((agent) => agent.agentType),
621951
622053
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
@@ -636573,7 +636675,7 @@ var init_useVoiceEnabled = __esm(() => {
636573
636675
  function getSemverPart(version3) {
636574
636676
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
636575
636677
  }
636576
- function useUpdateNotification(updatedVersion, initialVersion = "1.31.0") {
636678
+ function useUpdateNotification(updatedVersion, initialVersion = "1.32.0") {
636577
636679
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react226.useState(() => getSemverPart(initialVersion));
636578
636680
  if (!updatedVersion) {
636579
636681
  return null;
@@ -636622,7 +636724,7 @@ function AutoUpdater({
636622
636724
  return;
636623
636725
  }
636624
636726
  if (false) {}
636625
- const currentVersion = "1.31.0";
636727
+ const currentVersion = "1.32.0";
636626
636728
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
636627
636729
  let latestVersion = await getLatestVersion(channel);
636628
636730
  const isDisabled = isAutoUpdaterDisabled();
@@ -636851,12 +636953,12 @@ function NativeAutoUpdater({
636851
636953
  logEvent("tengu_native_auto_updater_start", {});
636852
636954
  try {
636853
636955
  const maxVersion = await getMaxVersion();
636854
- if (maxVersion && gt("1.31.0", maxVersion)) {
636956
+ if (maxVersion && gt("1.32.0", maxVersion)) {
636855
636957
  const msg = await getMaxVersionMessage();
636856
636958
  setMaxVersionIssue(msg ?? "affects your version");
636857
636959
  }
636858
636960
  const result = await installLatest(channel);
636859
- const currentVersion = "1.31.0";
636961
+ const currentVersion = "1.32.0";
636860
636962
  const latencyMs = Date.now() - startTime;
636861
636963
  if (result.lockFailed) {
636862
636964
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -636993,17 +637095,17 @@ function PackageManagerAutoUpdater(t0) {
636993
637095
  const maxVersion = await getMaxVersion();
636994
637096
  if (maxVersion && latest && gt(latest, maxVersion)) {
636995
637097
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
636996
- if (gte("1.31.0", maxVersion)) {
636997
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.31.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
637098
+ if (gte("1.32.0", maxVersion)) {
637099
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.32.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
636998
637100
  setUpdateAvailable(false);
636999
637101
  return;
637000
637102
  }
637001
637103
  latest = maxVersion;
637002
637104
  }
637003
- const hasUpdate = latest && !gte("1.31.0", latest) && !shouldSkipVersion(latest);
637105
+ const hasUpdate = latest && !gte("1.32.0", latest) && !shouldSkipVersion(latest);
637004
637106
  setUpdateAvailable(!!hasUpdate);
637005
637107
  if (hasUpdate) {
637006
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.31.0"} -> ${latest}`);
637108
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.32.0"} -> ${latest}`);
637007
637109
  }
637008
637110
  };
637009
637111
  $3[0] = t1;
@@ -637037,7 +637139,7 @@ function PackageManagerAutoUpdater(t0) {
637037
637139
  wrap: "truncate",
637038
637140
  children: [
637039
637141
  "currentVersion: ",
637040
- "1.31.0"
637142
+ "1.32.0"
637041
637143
  ]
637042
637144
  }, undefined, true, undefined, this);
637043
637145
  $3[3] = verbose;
@@ -649488,7 +649590,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
649488
649590
  project_dir: getOriginalCwd(),
649489
649591
  added_dirs: addedDirs
649490
649592
  },
649491
- version: "1.31.0",
649593
+ version: "1.32.0",
649492
649594
  output_style: {
649493
649595
  name: outputStyleName
649494
649596
  },
@@ -649571,7 +649673,7 @@ function StatusLineInner({
649571
649673
  const taskValues = Object.values(tasks2);
649572
649674
  const taskRunningCount = taskValues.filter((task2) => task2.status === "running" || task2.status === "pending").length;
649573
649675
  const defaultStatusLineText = buildDefaultStatusBar({
649574
- version: "1.31.0",
649676
+ version: "1.32.0",
649575
649677
  providerLabel: providerRuntime.providerLabel,
649576
649678
  authMode: providerRuntime.authLabel,
649577
649679
  model: providerRuntime.model ?? renderModelName(mainLoopModel),
@@ -661059,7 +661161,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
661059
661161
  } catch {}
661060
661162
  const data = {
661061
661163
  trigger: trigger2,
661062
- version: "1.31.0",
661164
+ version: "1.32.0",
661063
661165
  platform: process.platform,
661064
661166
  transcript,
661065
661167
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -672943,7 +673045,7 @@ function WelcomeV2() {
672943
673045
  dimColor: true,
672944
673046
  children: [
672945
673047
  "v",
672946
- "1.31.0"
673048
+ "1.32.0"
672947
673049
  ]
672948
673050
  }, undefined, true, undefined, this)
672949
673051
  ]
@@ -674203,7 +674305,7 @@ function completeOnboarding() {
674203
674305
  saveGlobalConfig((current) => ({
674204
674306
  ...current,
674205
674307
  hasCompletedOnboarding: true,
674206
- lastOnboardingVersion: "1.31.0"
674308
+ lastOnboardingVersion: "1.32.0"
674207
674309
  }));
674208
674310
  }
674209
674311
  function showDialog(root2, renderer) {
@@ -679240,7 +679342,7 @@ function appendToLog(path24, message) {
679240
679342
  cwd: getFsImplementation().cwd(),
679241
679343
  userType: process.env.USER_TYPE,
679242
679344
  sessionId: getSessionId(),
679243
- version: "1.31.0"
679345
+ version: "1.32.0"
679244
679346
  };
679245
679347
  getLogWriter(path24).write(messageWithTimestamp);
679246
679348
  }
@@ -683334,8 +683436,8 @@ async function getEnvLessBridgeConfig() {
683334
683436
  }
683335
683437
  async function checkEnvLessBridgeMinVersion() {
683336
683438
  const cfg = await getEnvLessBridgeConfig();
683337
- if (cfg.min_version && lt("1.31.0", cfg.min_version)) {
683338
- return `Your version of UR (${"1.31.0"}) is too old for Remote Control.
683439
+ if (cfg.min_version && lt("1.32.0", cfg.min_version)) {
683440
+ return `Your version of UR (${"1.32.0"}) is too old for Remote Control.
683339
683441
  Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
683340
683442
  }
683341
683443
  return null;
@@ -683809,7 +683911,7 @@ async function initBridgeCore(params) {
683809
683911
  const rawApi = createBridgeApiClient({
683810
683912
  baseUrl,
683811
683913
  getAccessToken,
683812
- runnerVersion: "1.31.0",
683914
+ runnerVersion: "1.32.0",
683813
683915
  onDebug: logForDebugging,
683814
683916
  onAuth401,
683815
683917
  getTrustedDeviceToken
@@ -689491,7 +689593,7 @@ async function startMCPServer(cwd3, debug2, verbose) {
689491
689593
  setCwd(cwd3);
689492
689594
  const server2 = new Server({
689493
689595
  name: "ur/tengu",
689494
- version: "1.31.0"
689596
+ version: "1.32.0"
689495
689597
  }, {
689496
689598
  capabilities: {
689497
689599
  tools: {}
@@ -691468,7 +691570,7 @@ async function update() {
691468
691570
  logEvent("tengu_update_check", {});
691469
691571
  const diagnostic = await getDoctorDiagnostic();
691470
691572
  const result = await checkUpgradeStatus({
691471
- currentVersion: "1.31.0",
691573
+ currentVersion: "1.32.0",
691472
691574
  packageName: UR_AGENT_PACKAGE_NAME,
691473
691575
  installationType: diagnostic.installationType,
691474
691576
  latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
@@ -692714,7 +692816,7 @@ ${customInstructions}` : customInstructions;
692714
692816
  }
692715
692817
  }
692716
692818
  logForDiagnosticsNoPII("info", "started", {
692717
- version: "1.31.0",
692819
+ version: "1.32.0",
692718
692820
  is_native_binary: isInBundledMode()
692719
692821
  });
692720
692822
  registerCleanup(async () => {
@@ -693500,7 +693602,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
693500
693602
  pendingHookMessages
693501
693603
  }, renderAndRun);
693502
693604
  }
693503
- }).version("1.31.0 (UR-AGENT)", "-v, --version", "Output the version number");
693605
+ }).version("1.32.0 (UR-AGENT)", "-v, --version", "Output the version number");
693504
693606
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
693505
693607
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
693506
693608
  if (canUserConfigureAdvisor()) {
@@ -694383,7 +694485,7 @@ if (false) {}
694383
694485
  async function main2() {
694384
694486
  const args = process.argv.slice(2);
694385
694487
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
694386
- console.log(`${"1.31.0"} (UR-AGENT)`);
694488
+ console.log(`${"1.32.0"} (UR-AGENT)`);
694387
694489
  return;
694388
694490
  }
694389
694491
  if (args[0] === "a2a" && args[1] === "serve" && !args.includes("--help") && !args.includes("-h")) {
package/docs/providers.md CHANGED
@@ -163,10 +163,10 @@ ur config set provider anthropic-api
163
163
 
164
164
  | Provider type | Model discovery | Source label |
165
165
  | --- | --- | --- |
166
- | API providers (openai-api, anthropic-api, gemini-api, openrouter) | Static list of provider-specific models | static |
166
+ | API providers (openai-api, anthropic-api, gemini-api, openrouter) | Live discovery from the provider's `/models` endpoint using your connected key (curated fallback until connected) | live |
167
167
  | Local/server providers (ollama, lmstudio, llama.cpp, vllm) | Dynamic discovery from the selected provider endpoint | live |
168
168
  | OpenAI-compatible | Dynamic discovery from configured endpoint | live |
169
- | External app bridges (codex-cli, claude-code-cli, gemini-cli, antigravity-cli) | Static bridge aliases; blocked by default for normal runtime | static |
169
+ | Subscription CLIs (codex-cli, claude-code-cli, gemini-cli, antigravity-cli) | Curated list (the official CLIs expose no models API); shown in `/model`, enabled once you `ur connect` them | static |
170
170
 
171
171
  ### API vs Subscription distinction
172
172
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ur-agent",
3
- "version": "1.31.0",
3
+ "version": "1.32.0",
4
4
  "description": "UR-AGENT — autonomous engineering workflow engine (plan, execute, test, verify, document, benchmark, reproduce)",
5
5
  "type": "module",
6
6
  "packageManager": "bun@1.3.14",