ur-agent 1.31.0 → 1.33.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,30 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.33.0
4
+
5
+ - Add API keys from inside UR while it is running: in `/model`, selecting an
6
+ API provider (OpenAI, Anthropic, Gemini, OpenRouter) that isn't connected now
7
+ shows a masked key-entry step. The key is stored in the OS keychain, then the
8
+ provider's models load live and you choose one — all without leaving the
9
+ session or setting an environment variable.
10
+ - Subscription login is unchanged: use `ur auth <provider>` (Codex, Claude,
11
+ Gemini, Antigravity).
12
+
13
+ ## 1.32.0
14
+
15
+ - `/model` now shows the subscription providers (Codex CLI, Claude Code, Gemini
16
+ CLI, Antigravity) again. They are enabled the moment you `ur connect` them
17
+ (persisted per-account opt-in) — no `UR_ENABLE_EXTERNAL_APP_PROVIDERS` env var
18
+ needed — and run via the official CLI. Not connected → clear connect prompt.
19
+ - API providers (OpenAI, Anthropic, Gemini, OpenRouter) now load their model
20
+ lists **live** from each provider's `/models` endpoint using your connected
21
+ key (OpenAI/Anthropic/OpenRouter `data[].id`; Gemini `models[]` filtered to
22
+ `generateContent`). No hardcoded model IDs; the curated list is only a
23
+ fallback shown before you connect. Subscription CLIs keep a curated list
24
+ because their official CLIs expose no models API.
25
+ - Live-discovered models validate against the discovered list (with cold-process
26
+ tolerance), so a saved API model keeps working across restarts.
27
+
3
28
  ## 1.31.0
4
29
 
5
30
  - 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.33.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.33.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.33.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.33.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.33.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.33.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.33.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.33.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.33.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.33.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.33.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.33.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.33.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.33.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.33.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.33.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.33.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.33.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.33.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.33.0", maxVersion)) {
241983
+ logForDebugging(`Native installer: current version ${"1.33.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.33.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.33.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.33.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.33.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.33.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.33.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.33.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.33.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.33.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.33.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.33.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.33.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.33.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.33.0") {
377131
377231
  return current;
377132
377232
  }
377133
377233
  return {
377134
377234
  ...current,
377135
- lastReleaseNotesSeen: "1.31.0"
377235
+ lastReleaseNotesSeen: "1.33.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.33.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.33.0"
593616
593718
  };
593617
593719
  }, version2, version_default;
593618
593720
  var init_version = __esm(() => {
@@ -596492,6 +596594,9 @@ function ProviderFirstModelPicker({
596492
596594
  const [modelSource, setModelSource] = import_react188.useState("static");
596493
596595
  const [modelWarning, setModelWarning] = import_react188.useState(null);
596494
596596
  const [providerWarning, setProviderWarning] = import_react188.useState(null);
596597
+ const [connectingProvider, setConnectingProvider] = import_react188.useState(null);
596598
+ const [apiKeyInput, setApiKeyInput] = import_react188.useState("");
596599
+ const [connectError, setConnectError] = import_react188.useState(null);
596495
596600
  const effortValue = useAppState(selectEffortValue2);
596496
596601
  const [effort] = import_react188.useState(effortValue !== undefined ? convertEffortValueToLevel(effortValue) : undefined);
596497
596602
  const appThinkingEnabled = useAppState(selectThinkingEnabled2);
@@ -596500,7 +596605,7 @@ function ProviderFirstModelPicker({
596500
596605
  import_react188.useEffect(() => {
596501
596606
  async function loadProviderStatus() {
596502
596607
  setLoadingProviders(true);
596503
- const providers = listProviders();
596608
+ const providers = listProviders({ includeExternalAppBridges: true });
596504
596609
  const settings = getSettingsForSource("userSettings");
596505
596610
  const options2 = await Promise.all(providers.map(async (provider) => {
596506
596611
  const status2 = await getProviderStatus(provider.id, {
@@ -596577,6 +596682,13 @@ function ProviderFirstModelPicker({
596577
596682
  return;
596578
596683
  }
596579
596684
  if (provider.status !== "connected") {
596685
+ if (provider.credentialType === "api-key") {
596686
+ setConnectingProvider(provider);
596687
+ setApiKeyInput("");
596688
+ setConnectError(null);
596689
+ setStep("connect");
596690
+ return;
596691
+ }
596580
596692
  setProviderWarning(`Provider "${provider.value}" is ${provider.status}: ${provider.statusLabel}. Run \`ur provider doctor ${provider.value}\`, or choose a connected API/local/server provider.`);
596581
596693
  return;
596582
596694
  }
@@ -596653,6 +596765,105 @@ function ProviderFirstModelPicker({
596653
596765
  setModelOptions([]);
596654
596766
  setModelWarning(null);
596655
596767
  }
596768
+ function handleKeySubmit() {
596769
+ if (!connectingProvider)
596770
+ return;
596771
+ const key = apiKeyInput.trim();
596772
+ if (!key) {
596773
+ setConnectError("Enter your API key (or press Esc to go back).");
596774
+ return;
596775
+ }
596776
+ const saved = setProviderApiKey(connectingProvider.value, key);
596777
+ if (!saved.ok) {
596778
+ setConnectError(saved.message);
596779
+ return;
596780
+ }
596781
+ setApiKeyInput("");
596782
+ setConnectError(null);
596783
+ setSelectedProvider(connectingProvider);
596784
+ setStep("model");
596785
+ }
596786
+ function handleKeyCancel() {
596787
+ setApiKeyInput("");
596788
+ setConnectingProvider(null);
596789
+ setConnectError(null);
596790
+ setStep("provider");
596791
+ }
596792
+ if (step === "connect" && connectingProvider) {
596793
+ const envKey = connectingProvider.provider.envKey;
596794
+ const content2 = /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(ThemedBox_default, {
596795
+ flexDirection: "column",
596796
+ children: [
596797
+ /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(ThemedBox_default, {
596798
+ marginBottom: 1,
596799
+ flexDirection: "column",
596800
+ children: [
596801
+ /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(ThemedText, {
596802
+ color: "remember",
596803
+ bold: true,
596804
+ children: [
596805
+ "Connect ",
596806
+ connectingProvider.label
596807
+ ]
596808
+ }, undefined, true, undefined, this),
596809
+ /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(ThemedText, {
596810
+ dimColor: true,
596811
+ children: "Paste your API key to use your own account. It is stored securely in your OS keychain and reused automatically \u2014 you only do this once."
596812
+ }, undefined, false, undefined, this),
596813
+ envKey && /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(ThemedText, {
596814
+ dimColor: true,
596815
+ color: "subtle",
596816
+ children: [
596817
+ "Equivalent to setting ",
596818
+ envKey,
596819
+ ". Get a key from the provider's dashboard."
596820
+ ]
596821
+ }, undefined, true, undefined, this)
596822
+ ]
596823
+ }, undefined, true, undefined, this),
596824
+ /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(ThemedBox_default, {
596825
+ children: [
596826
+ /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(ThemedText, {
596827
+ children: "API key: "
596828
+ }, undefined, false, undefined, this),
596829
+ /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(TextInput, {
596830
+ value: apiKeyInput,
596831
+ onChange: setApiKeyInput,
596832
+ onSubmit: handleKeySubmit,
596833
+ mask: "*",
596834
+ placeholder: "paste key, then Enter"
596835
+ }, undefined, false, undefined, this)
596836
+ ]
596837
+ }, undefined, true, undefined, this),
596838
+ connectError && /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(ThemedBox_default, {
596839
+ marginTop: 1,
596840
+ children: /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(ThemedText, {
596841
+ color: "error",
596842
+ children: connectError
596843
+ }, undefined, false, undefined, this)
596844
+ }, undefined, false, undefined, this),
596845
+ /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(ThemedBox_default, {
596846
+ marginTop: 1,
596847
+ children: /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(Byline, {
596848
+ children: [
596849
+ /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(KeyboardShortcutHint, {
596850
+ shortcut: "Enter",
596851
+ action: "store key & load models"
596852
+ }, undefined, false, undefined, this),
596853
+ /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(KeyboardShortcutHint, {
596854
+ shortcut: "Esc",
596855
+ action: "back"
596856
+ }, undefined, false, undefined, this)
596857
+ ]
596858
+ }, undefined, true, undefined, this)
596859
+ }, undefined, false, undefined, this)
596860
+ ]
596861
+ }, undefined, true, undefined, this);
596862
+ return isStandaloneCommand ? /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(Pane, {
596863
+ color: "permission",
596864
+ children: content2
596865
+ }, undefined, false, undefined, this) : content2;
596866
+ }
596656
596867
  if (step === "provider") {
596657
596868
  const content2 = /* @__PURE__ */ jsx_dev_runtime346.jsxDEV(ThemedBox_default, {
596658
596869
  flexDirection: "column",
@@ -596954,12 +597165,14 @@ var import_react188, jsx_dev_runtime346, selectCurrentProvider = (s) => s.provid
596954
597165
  var init_ProviderFirstModelPicker = __esm(() => {
596955
597166
  init_analytics();
596956
597167
  init_providerRegistry();
597168
+ init_providerCredentials();
596957
597169
  init_AppState();
596958
597170
  init_settings2();
596959
597171
  init_ink2();
596960
597172
  init_AppState();
596961
597173
  init_ConfigurableShortcutHint();
596962
597174
  init_CustomSelect();
597175
+ init_TextInput();
596963
597176
  init_Byline();
596964
597177
  init_KeyboardShortcutHint();
596965
597178
  init_Pane();
@@ -603567,7 +603780,7 @@ function generateHtmlReport(data, insights) {
603567
603780
  </html>`;
603568
603781
  }
603569
603782
  function buildExportData(data, insights, facets, remoteStats) {
603570
- const version3 = typeof MACRO !== "undefined" ? "1.31.0" : "unknown";
603783
+ const version3 = typeof MACRO !== "undefined" ? "1.33.0" : "unknown";
603571
603784
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
603572
603785
  const facets_summary = {
603573
603786
  total: facets.size,
@@ -607847,7 +608060,7 @@ var init_sessionStorage = __esm(() => {
607847
608060
  init_settings2();
607848
608061
  init_slowOperations();
607849
608062
  init_uuid();
607850
- VERSION5 = typeof MACRO !== "undefined" ? "1.31.0" : "unknown";
608063
+ VERSION5 = typeof MACRO !== "undefined" ? "1.33.0" : "unknown";
607851
608064
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
607852
608065
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
607853
608066
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -609052,7 +609265,7 @@ var init_filesystem = __esm(() => {
609052
609265
  });
609053
609266
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
609054
609267
  const nonce = randomBytes18(16).toString("hex");
609055
- return join200(getURTempDir(), "bundled-skills", "1.31.0", nonce);
609268
+ return join200(getURTempDir(), "bundled-skills", "1.33.0", nonce);
609056
609269
  });
609057
609270
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
609058
609271
  });
@@ -615341,7 +615554,7 @@ function computeFingerprint(messageText2, version3) {
615341
615554
  }
615342
615555
  function computeFingerprintFromMessages(messages) {
615343
615556
  const firstMessageText = extractFirstMessageText(messages);
615344
- return computeFingerprint(firstMessageText, "1.31.0");
615557
+ return computeFingerprint(firstMessageText, "1.33.0");
615345
615558
  }
615346
615559
  var FINGERPRINT_SALT = "59cf53e54c78";
615347
615560
  var init_fingerprint = () => {};
@@ -617208,7 +617421,7 @@ async function sideQuery(opts) {
617208
617421
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
617209
617422
  }
617210
617423
  const messageText2 = extractFirstUserMessageText(messages);
617211
- const fingerprint = computeFingerprint(messageText2, "1.31.0");
617424
+ const fingerprint = computeFingerprint(messageText2, "1.33.0");
617212
617425
  const attributionHeader = getAttributionHeader(fingerprint);
617213
617426
  const systemBlocks = [
617214
617427
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -621945,7 +622158,7 @@ function buildSystemInitMessage(inputs) {
621945
622158
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
621946
622159
  apiKeySource: getURHQApiKeyWithSource().source,
621947
622160
  betas: getSdkBetas(),
621948
- ur_version: "1.31.0",
622161
+ ur_version: "1.33.0",
621949
622162
  output_style: outputStyle2,
621950
622163
  agents: inputs.agents.map((agent) => agent.agentType),
621951
622164
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
@@ -636573,7 +636786,7 @@ var init_useVoiceEnabled = __esm(() => {
636573
636786
  function getSemverPart(version3) {
636574
636787
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
636575
636788
  }
636576
- function useUpdateNotification(updatedVersion, initialVersion = "1.31.0") {
636789
+ function useUpdateNotification(updatedVersion, initialVersion = "1.33.0") {
636577
636790
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react226.useState(() => getSemverPart(initialVersion));
636578
636791
  if (!updatedVersion) {
636579
636792
  return null;
@@ -636622,7 +636835,7 @@ function AutoUpdater({
636622
636835
  return;
636623
636836
  }
636624
636837
  if (false) {}
636625
- const currentVersion = "1.31.0";
636838
+ const currentVersion = "1.33.0";
636626
636839
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
636627
636840
  let latestVersion = await getLatestVersion(channel);
636628
636841
  const isDisabled = isAutoUpdaterDisabled();
@@ -636851,12 +637064,12 @@ function NativeAutoUpdater({
636851
637064
  logEvent("tengu_native_auto_updater_start", {});
636852
637065
  try {
636853
637066
  const maxVersion = await getMaxVersion();
636854
- if (maxVersion && gt("1.31.0", maxVersion)) {
637067
+ if (maxVersion && gt("1.33.0", maxVersion)) {
636855
637068
  const msg = await getMaxVersionMessage();
636856
637069
  setMaxVersionIssue(msg ?? "affects your version");
636857
637070
  }
636858
637071
  const result = await installLatest(channel);
636859
- const currentVersion = "1.31.0";
637072
+ const currentVersion = "1.33.0";
636860
637073
  const latencyMs = Date.now() - startTime;
636861
637074
  if (result.lockFailed) {
636862
637075
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -636993,17 +637206,17 @@ function PackageManagerAutoUpdater(t0) {
636993
637206
  const maxVersion = await getMaxVersion();
636994
637207
  if (maxVersion && latest && gt(latest, maxVersion)) {
636995
637208
  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`);
637209
+ if (gte("1.33.0", maxVersion)) {
637210
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.33.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
636998
637211
  setUpdateAvailable(false);
636999
637212
  return;
637000
637213
  }
637001
637214
  latest = maxVersion;
637002
637215
  }
637003
- const hasUpdate = latest && !gte("1.31.0", latest) && !shouldSkipVersion(latest);
637216
+ const hasUpdate = latest && !gte("1.33.0", latest) && !shouldSkipVersion(latest);
637004
637217
  setUpdateAvailable(!!hasUpdate);
637005
637218
  if (hasUpdate) {
637006
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.31.0"} -> ${latest}`);
637219
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.33.0"} -> ${latest}`);
637007
637220
  }
637008
637221
  };
637009
637222
  $3[0] = t1;
@@ -637037,7 +637250,7 @@ function PackageManagerAutoUpdater(t0) {
637037
637250
  wrap: "truncate",
637038
637251
  children: [
637039
637252
  "currentVersion: ",
637040
- "1.31.0"
637253
+ "1.33.0"
637041
637254
  ]
637042
637255
  }, undefined, true, undefined, this);
637043
637256
  $3[3] = verbose;
@@ -649488,7 +649701,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
649488
649701
  project_dir: getOriginalCwd(),
649489
649702
  added_dirs: addedDirs
649490
649703
  },
649491
- version: "1.31.0",
649704
+ version: "1.33.0",
649492
649705
  output_style: {
649493
649706
  name: outputStyleName
649494
649707
  },
@@ -649571,7 +649784,7 @@ function StatusLineInner({
649571
649784
  const taskValues = Object.values(tasks2);
649572
649785
  const taskRunningCount = taskValues.filter((task2) => task2.status === "running" || task2.status === "pending").length;
649573
649786
  const defaultStatusLineText = buildDefaultStatusBar({
649574
- version: "1.31.0",
649787
+ version: "1.33.0",
649575
649788
  providerLabel: providerRuntime.providerLabel,
649576
649789
  authMode: providerRuntime.authLabel,
649577
649790
  model: providerRuntime.model ?? renderModelName(mainLoopModel),
@@ -661059,7 +661272,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
661059
661272
  } catch {}
661060
661273
  const data = {
661061
661274
  trigger: trigger2,
661062
- version: "1.31.0",
661275
+ version: "1.33.0",
661063
661276
  platform: process.platform,
661064
661277
  transcript,
661065
661278
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -672943,7 +673156,7 @@ function WelcomeV2() {
672943
673156
  dimColor: true,
672944
673157
  children: [
672945
673158
  "v",
672946
- "1.31.0"
673159
+ "1.33.0"
672947
673160
  ]
672948
673161
  }, undefined, true, undefined, this)
672949
673162
  ]
@@ -674203,7 +674416,7 @@ function completeOnboarding() {
674203
674416
  saveGlobalConfig((current) => ({
674204
674417
  ...current,
674205
674418
  hasCompletedOnboarding: true,
674206
- lastOnboardingVersion: "1.31.0"
674419
+ lastOnboardingVersion: "1.33.0"
674207
674420
  }));
674208
674421
  }
674209
674422
  function showDialog(root2, renderer) {
@@ -679240,7 +679453,7 @@ function appendToLog(path24, message) {
679240
679453
  cwd: getFsImplementation().cwd(),
679241
679454
  userType: process.env.USER_TYPE,
679242
679455
  sessionId: getSessionId(),
679243
- version: "1.31.0"
679456
+ version: "1.33.0"
679244
679457
  };
679245
679458
  getLogWriter(path24).write(messageWithTimestamp);
679246
679459
  }
@@ -683334,8 +683547,8 @@ async function getEnvLessBridgeConfig() {
683334
683547
  }
683335
683548
  async function checkEnvLessBridgeMinVersion() {
683336
683549
  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.
683550
+ if (cfg.min_version && lt("1.33.0", cfg.min_version)) {
683551
+ return `Your version of UR (${"1.33.0"}) is too old for Remote Control.
683339
683552
  Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
683340
683553
  }
683341
683554
  return null;
@@ -683809,7 +684022,7 @@ async function initBridgeCore(params) {
683809
684022
  const rawApi = createBridgeApiClient({
683810
684023
  baseUrl,
683811
684024
  getAccessToken,
683812
- runnerVersion: "1.31.0",
684025
+ runnerVersion: "1.33.0",
683813
684026
  onDebug: logForDebugging,
683814
684027
  onAuth401,
683815
684028
  getTrustedDeviceToken
@@ -689491,7 +689704,7 @@ async function startMCPServer(cwd3, debug2, verbose) {
689491
689704
  setCwd(cwd3);
689492
689705
  const server2 = new Server({
689493
689706
  name: "ur/tengu",
689494
- version: "1.31.0"
689707
+ version: "1.33.0"
689495
689708
  }, {
689496
689709
  capabilities: {
689497
689710
  tools: {}
@@ -691468,7 +691681,7 @@ async function update() {
691468
691681
  logEvent("tengu_update_check", {});
691469
691682
  const diagnostic = await getDoctorDiagnostic();
691470
691683
  const result = await checkUpgradeStatus({
691471
- currentVersion: "1.31.0",
691684
+ currentVersion: "1.33.0",
691472
691685
  packageName: UR_AGENT_PACKAGE_NAME,
691473
691686
  installationType: diagnostic.installationType,
691474
691687
  latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
@@ -692714,7 +692927,7 @@ ${customInstructions}` : customInstructions;
692714
692927
  }
692715
692928
  }
692716
692929
  logForDiagnosticsNoPII("info", "started", {
692717
- version: "1.31.0",
692930
+ version: "1.33.0",
692718
692931
  is_native_binary: isInBundledMode()
692719
692932
  });
692720
692933
  registerCleanup(async () => {
@@ -693500,7 +693713,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
693500
693713
  pendingHookMessages
693501
693714
  }, renderAndRun);
693502
693715
  }
693503
- }).version("1.31.0 (UR-AGENT)", "-v, --version", "Output the version number");
693716
+ }).version("1.33.0 (UR-AGENT)", "-v, --version", "Output the version number");
693504
693717
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
693505
693718
  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
693719
  if (canUserConfigureAdvisor()) {
@@ -694383,7 +694596,7 @@ if (false) {}
694383
694596
  async function main2() {
694384
694597
  const args = process.argv.slice(2);
694385
694598
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
694386
- console.log(`${"1.31.0"} (UR-AGENT)`);
694599
+ console.log(`${"1.33.0"} (UR-AGENT)`);
694387
694600
  return;
694388
694601
  }
694389
694602
  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.33.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",