ur-agent 1.81.3 → 1.81.5

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,29 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.81.5
4
+
5
+ - Matched the UR welcome wordmark to the house and frame's bright, theme-aware
6
+ accent by applying the brand color directly to each rendered row. Added a
7
+ restrained dim drop shadow around the large house without changing its
8
+ established geometry or screen-reader output.
9
+ - Made OpenRouter model discovery fresh-only whenever the model catalog opens.
10
+ UR now fetches the current catalog on every visit and reports refresh errors
11
+ instead of silently showing stale cached entries.
12
+ - Shortened OpenRouter model labels and startup model chrome to their useful
13
+ model names while preserving the complete provider/model ID for requests and
14
+ showing it on the focused catalog entry. Duplicate short names retain a clear
15
+ vendor suffix.
16
+ - Stabilized the production-shell recovery regression under concurrent test
17
+ execution while continuing to verify that reclaimed task-output directories
18
+ are recreated without restarting UR.
19
+
20
+ ## 1.81.4
21
+
22
+ - Unified the welcome-screen UR wordmark, outlined depth, decorative marks,
23
+ house, divider, and outer frame on the same theme-aware UR brand color. This
24
+ removes the muddy olive/brown appearance caused by mixing three palette
25
+ colors while preserving the wordmark geometry and screen-reader output.
26
+
3
27
  ## 1.81.3
4
28
 
5
29
  - Brightened the welcome-screen UR wordmark with a polished three-tone finish:
package/README.md CHANGED
@@ -355,9 +355,11 @@ In the interactive app, `/model` is a two-step, provider-first picker:
355
355
 
356
356
  In the model catalog, use **Up/Down** to browse and **Left/Right** to change
357
357
  the focused model's effort before pressing Enter. OpenRouter additionally
358
- shows FREE/PAID tier, context size, tool/reasoning support, and whether its
359
- catalog is live or cached. API-key entry is masked, aligned on one row, and
360
- stored through the OS keychain flow.
358
+ shows compact model names, FREE/PAID tier, context size, tool/reasoning
359
+ support, and the exact ID for the focused entry. Its catalog is fetched
360
+ fresh every time it opens and never falls back to a stale cached list.
361
+ API-key entry is masked, aligned on one row, and stored through the OS
362
+ keychain flow.
361
363
 
362
364
  Model lists never cross providers: OpenAI API, Claude API, Gemini API,
363
365
  OpenRouter, Ollama, and OpenAI-compatible local/server endpoints are separate
package/dist/cli.js CHANGED
@@ -55200,6 +55200,14 @@ async function listModelsForProviderWithSource(providerId, options = {}) {
55200
55200
  source: "live"
55201
55201
  };
55202
55202
  }
55203
+ if (options.freshOnly) {
55204
+ return {
55205
+ provider,
55206
+ models: [],
55207
+ source: "live",
55208
+ warning: `Live model discovery for "${provider}" returned no models. No cached catalog was shown.`
55209
+ };
55210
+ }
55203
55211
  const cachedModels = cachedModelsByProvider.get(cacheKey) ?? [];
55204
55212
  if (cachedModels.length > 0) {
55205
55213
  const age = describeCacheAge(cachedModelsAgeMs(cacheKey) ?? 0);
@@ -55218,6 +55226,14 @@ async function listModelsForProviderWithSource(providerId, options = {}) {
55218
55226
  warning: `Live model discovery for "${provider}" returned no models.`
55219
55227
  };
55220
55228
  } catch (error40) {
55229
+ if (options.freshOnly) {
55230
+ return {
55231
+ provider,
55232
+ models: [],
55233
+ source: "live",
55234
+ warning: `Live model discovery for "${provider}" failed: ${error40 instanceof Error ? error40.message : String(error40)}. No cached catalog was shown.`
55235
+ };
55236
+ }
55221
55237
  const cachedModels = cachedModelsByProvider.get(cacheKey) ?? [];
55222
55238
  if (cachedModels.length > 0) {
55223
55239
  const age = describeCacheAge(cachedModelsAgeMs(cacheKey) ?? 0);
@@ -108236,7 +108252,7 @@ var init_auth = __esm(() => {
108236
108252
 
108237
108253
  // src/utils/userAgent.ts
108238
108254
  function getURCodeUserAgent() {
108239
- return `ur/${"1.81.3"}`;
108255
+ return `ur/${"1.81.5"}`;
108240
108256
  }
108241
108257
 
108242
108258
  // src/utils/workloadContext.ts
@@ -108258,7 +108274,7 @@ function getUserAgent() {
108258
108274
  const clientApp = process.env.UR_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}` : "";
108259
108275
  const workload = getWorkload();
108260
108276
  const workloadSuffix = workload ? `, workload/${workload}` : "";
108261
- return `ur-cli/${"1.81.3"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
108277
+ return `ur-cli/${"1.81.5"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
108262
108278
  }
108263
108279
  function getMCPUserAgent() {
108264
108280
  const parts = [];
@@ -108272,7 +108288,7 @@ function getMCPUserAgent() {
108272
108288
  parts.push(`client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}`);
108273
108289
  }
108274
108290
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
108275
- return `ur/${"1.81.3"}${suffix}`;
108291
+ return `ur/${"1.81.5"}${suffix}`;
108276
108292
  }
108277
108293
  function getWebFetchUserAgent() {
108278
108294
  return `UR-User (${getURCodeUserAgent()})`;
@@ -108410,7 +108426,7 @@ var init_user = __esm(() => {
108410
108426
  deviceId,
108411
108427
  sessionId: getSessionId(),
108412
108428
  email: getEmail(),
108413
- appVersion: "1.81.3",
108429
+ appVersion: "1.81.5",
108414
108430
  platform: getHostPlatformForAnalytics(),
108415
108431
  organizationUuid,
108416
108432
  accountUuid,
@@ -116297,7 +116313,7 @@ var init_metadata = __esm(() => {
116297
116313
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
116298
116314
  WHITESPACE_REGEX = /\s+/;
116299
116315
  getVersionBase = memoize_default(() => {
116300
- const match = "1.81.3".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
116316
+ const match = "1.81.5".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
116301
116317
  return match ? match[0] : undefined;
116302
116318
  });
116303
116319
  buildEnvContext = memoize_default(async () => {
@@ -116337,7 +116353,7 @@ var init_metadata = __esm(() => {
116337
116353
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
116338
116354
  isURCodeAction: isEnvTruthy(process.env.UR_CODE_ACTION),
116339
116355
  isURAiAuth: isURAISubscriber(),
116340
- version: "1.81.3",
116356
+ version: "1.81.5",
116341
116357
  versionBase: getVersionBase(),
116342
116358
  buildTime: "",
116343
116359
  deploymentEnvironment: env2.detectDeploymentEnvironment(),
@@ -117007,7 +117023,7 @@ function initialize1PEventLogging() {
117007
117023
  const platform2 = getPlatform();
117008
117024
  const attributes = {
117009
117025
  [import_semantic_conventions4.ATTR_SERVICE_NAME]: "ur",
117010
- [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.81.3"
117026
+ [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.81.5"
117011
117027
  };
117012
117028
  if (platform2 === "wsl") {
117013
117029
  const wslVersion = getWslVersion();
@@ -117035,7 +117051,7 @@ function initialize1PEventLogging() {
117035
117051
  })
117036
117052
  ]
117037
117053
  });
117038
- firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.81.3");
117054
+ firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.81.5");
117039
117055
  }
117040
117056
  async function reinitialize1PEventLoggingIfConfigChanged() {
117041
117057
  if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
@@ -127001,7 +127017,7 @@ function formatA2AAgentCard(options = {}, pretty = true) {
127001
127017
  function formatA2AV1AgentCard(options = {}, pretty = true) {
127002
127018
  return JSON.stringify(buildA2AV1AgentCard(options), null, pretty ? 2 : 0);
127003
127019
  }
127004
- var urVersion = "1.81.3", researchSnapshotDate = "2026-08-10", coverage, priorityRoadmap;
127020
+ var urVersion = "1.81.5", researchSnapshotDate = "2026-08-10", coverage, priorityRoadmap;
127005
127021
  var init_trends = __esm(() => {
127006
127022
  init_a2aCardSignature();
127007
127023
  coverage = [
@@ -129891,7 +129907,7 @@ function getAttributionHeader(fingerprint) {
129891
129907
  if (!isAttributionHeaderEnabled()) {
129892
129908
  return "";
129893
129909
  }
129894
- const version2 = `${"1.81.3"}.${fingerprint}`;
129910
+ const version2 = `${"1.81.5"}.${fingerprint}`;
129895
129911
  const entrypoint = process.env.UR_CODE_ENTRYPOINT ?? "unknown";
129896
129912
  const cch = "";
129897
129913
  const workload = getWorkload();
@@ -184812,7 +184828,7 @@ var init_projectSafety = __esm(() => {
184812
184828
  function getInstruments() {
184813
184829
  if (instruments)
184814
184830
  return instruments;
184815
- const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.81.3");
184831
+ const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.81.5");
184816
184832
  instruments = {
184817
184833
  operationDuration: meter.createHistogram("gen_ai.client.operation.duration", {
184818
184834
  description: "GenAI operation duration.",
@@ -184910,7 +184926,7 @@ function genAiAgentAttributes() {
184910
184926
  "gen_ai.operation.name": GEN_AI_OPERATION_INVOKE_AGENT,
184911
184927
  "gen_ai.provider.name": "ur",
184912
184928
  "gen_ai.agent.name": "UR-Nexus",
184913
- "gen_ai.agent.version": "1.81.3"
184929
+ "gen_ai.agent.version": "1.81.5"
184914
184930
  };
184915
184931
  }
184916
184932
  function genAiWorkflowAttributes(workflowName, workflowRunId) {
@@ -184931,7 +184947,7 @@ function genAiWorkflowAttributes(workflowName, workflowRunId) {
184931
184947
  function startGenAiWorkflowSpan(workflowName, workflowRunId) {
184932
184948
  const attributes = genAiWorkflowAttributes(workflowName, workflowRunId);
184933
184949
  const name = typeof attributes["gen_ai.workflow.name"] === "string" ? `invoke_workflow ${attributes["gen_ai.workflow.name"]}` : GEN_AI_OPERATION_INVOKE_WORKFLOW;
184934
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.81.3").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
184950
+ return import_api10.trace.getTracer("ur-agent.gen_ai", "1.81.5").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
184935
184951
  }
184936
184952
  function endGenAiWorkflowSpan(span, options2 = {}) {
184937
184953
  try {
@@ -184969,7 +184985,7 @@ function startGenAiMemorySpan(operation, options2 = {}) {
184969
184985
  if (options2.recordCount !== undefined && Number.isInteger(options2.recordCount) && options2.recordCount >= 0) {
184970
184986
  attributes["gen_ai.memory.record.count"] = options2.recordCount;
184971
184987
  }
184972
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.81.3").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
184988
+ return import_api10.trace.getTracer("ur-agent.gen_ai", "1.81.5").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
184973
184989
  }
184974
184990
  function endGenAiMemorySpan(span, options2 = {}) {
184975
184991
  try {
@@ -278684,7 +278700,7 @@ function getTelemetryAttributes() {
278684
278700
  attributes["session.id"] = sessionId;
278685
278701
  }
278686
278702
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
278687
- attributes["app.version"] = "1.81.3";
278703
+ attributes["app.version"] = "1.81.5";
278688
278704
  }
278689
278705
  const oauthAccount = getOauthAccountInfo();
278690
278706
  if (oauthAccount) {
@@ -320088,7 +320104,7 @@ function getInstallationEnv() {
320088
320104
  return;
320089
320105
  }
320090
320106
  function getURCodeVersion() {
320091
- return "1.81.3";
320107
+ return "1.81.5";
320092
320108
  }
320093
320109
  async function getInstalledVSCodeExtensionVersion(command) {
320094
320110
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -327458,7 +327474,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
327458
327474
  const client2 = new Client({
327459
327475
  name: "ur",
327460
327476
  title: "UR",
327461
- version: "1.81.3",
327477
+ version: "1.81.5",
327462
327478
  description: "UR-Nexus autonomous engineering workflow engine",
327463
327479
  websiteUrl: PRODUCT_URL
327464
327480
  }, {
@@ -327819,7 +327835,7 @@ var init_client5 = __esm(() => {
327819
327835
  const client2 = new Client({
327820
327836
  name: "ur",
327821
327837
  title: "UR",
327822
- version: "1.81.3",
327838
+ version: "1.81.5",
327823
327839
  description: "UR-Nexus autonomous engineering workflow engine",
327824
327840
  websiteUrl: PRODUCT_URL
327825
327841
  }, {
@@ -340592,7 +340608,7 @@ async function createRuntime() {
340592
340608
  bootstrapTelemetry();
340593
340609
  const resource = defaultResource().merge(detectResources({ detectors: [envDetector] })).merge(resourceFromAttributes({
340594
340610
  [import_semantic_conventions7.ATTR_SERVICE_NAME]: "ur-agent",
340595
- [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.81.3"
340611
+ [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.81.5"
340596
340612
  }));
340597
340613
  const tracerProvider = exporters.traces.length > 0 ? new BasicTracerProvider({
340598
340614
  resource,
@@ -340625,11 +340641,11 @@ async function createRuntime() {
340625
340641
  setMeterProvider(meterProvider);
340626
340642
  setLoggerProvider(loggerProvider);
340627
340643
  if (meterProvider) {
340628
- const meter = meterProvider.getMeter("ur-agent", "1.81.3");
340644
+ const meter = meterProvider.getMeter("ur-agent", "1.81.5");
340629
340645
  setMeter(meter, (name, options2) => meter.createCounter(name, options2));
340630
340646
  }
340631
340647
  if (loggerProvider) {
340632
- setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.81.3"));
340648
+ setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.81.5"));
340633
340649
  }
340634
340650
  if (!cleanupRegistered3) {
340635
340651
  cleanupRegistered3 = true;
@@ -341291,9 +341307,9 @@ async function assertMinVersion() {
341291
341307
  if (false) {}
341292
341308
  try {
341293
341309
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
341294
- if (versionConfig.minVersion && lt("1.81.3", versionConfig.minVersion)) {
341310
+ if (versionConfig.minVersion && lt("1.81.5", versionConfig.minVersion)) {
341295
341311
  console.error(`
341296
- It looks like your version of UR (${"1.81.3"}) needs an update.
341312
+ It looks like your version of UR (${"1.81.5"}) needs an update.
341297
341313
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
341298
341314
 
341299
341315
  To update, please run:
@@ -341509,7 +341525,7 @@ async function installGlobalPackage(specificVersion) {
341509
341525
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
341510
341526
  logEvent("tengu_auto_updater_lock_contention", {
341511
341527
  pid: process.pid,
341512
- currentVersion: "1.81.3"
341528
+ currentVersion: "1.81.5"
341513
341529
  });
341514
341530
  return "in_progress";
341515
341531
  }
@@ -341518,7 +341534,7 @@ async function installGlobalPackage(specificVersion) {
341518
341534
  if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
341519
341535
  logError2(new Error("Windows NPM detected in WSL environment"));
341520
341536
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
341521
- currentVersion: "1.81.3"
341537
+ currentVersion: "1.81.5"
341522
341538
  });
341523
341539
  console.error(`
341524
341540
  Error: Windows NPM detected in WSL
@@ -342053,7 +342069,7 @@ function detectLinuxGlobPatternWarnings() {
342053
342069
  }
342054
342070
  async function getDoctorDiagnostic() {
342055
342071
  const installationType = await getCurrentInstallationType();
342056
- const version2 = typeof MACRO !== "undefined" ? "1.81.3" : "unknown";
342072
+ const version2 = typeof MACRO !== "undefined" ? "1.81.5" : "unknown";
342057
342073
  const installationPath = await getInstallationPath();
342058
342074
  const invokedBinary = getInvokedBinary();
342059
342075
  const multipleInstallations = await detectMultipleInstallations();
@@ -342988,8 +343004,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
342988
343004
  const maxVersion = await getMaxVersion();
342989
343005
  if (maxVersion && gt(version2, maxVersion)) {
342990
343006
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
342991
- if (gte("1.81.3", maxVersion)) {
342992
- logForDebugging(`Native installer: current version ${"1.81.3"} is already at or above maxVersion ${maxVersion}, skipping update`);
343007
+ if (gte("1.81.5", maxVersion)) {
343008
+ logForDebugging(`Native installer: current version ${"1.81.5"} is already at or above maxVersion ${maxVersion}, skipping update`);
342993
343009
  logEvent("tengu_native_update_skipped_max_version", {
342994
343010
  latency_ms: Date.now() - startTime,
342995
343011
  max_version: maxVersion,
@@ -343000,7 +343016,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
343000
343016
  version2 = maxVersion;
343001
343017
  }
343002
343018
  }
343003
- if (!forceReinstall && version2 === "1.81.3" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
343019
+ if (!forceReinstall && version2 === "1.81.5" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
343004
343020
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
343005
343021
  logEvent("tengu_native_update_complete", {
343006
343022
  latency_ms: Date.now() - startTime,
@@ -413687,7 +413703,7 @@ function isAnyTracingEnabled() {
413687
413703
  return isTelemetryEnabled() || isEnhancedTelemetryEnabled() || isBetaTracingEnabled();
413688
413704
  }
413689
413705
  function getTracer() {
413690
- return import_api39.trace.getTracer("ur-agent.gen_ai", "1.81.3");
413706
+ return import_api39.trace.getTracer("ur-agent.gen_ai", "1.81.5");
413691
413707
  }
413692
413708
  function createSpanAttributes(spanType, customAttributes = {}) {
413693
413709
  const baseAttributes = getTelemetryAttributes();
@@ -443846,7 +443862,7 @@ function Feedback({
443846
443862
  platform: env2.platform,
443847
443863
  gitRepo: envInfo.isGit,
443848
443864
  terminal: env2.terminal,
443849
- version: "1.81.3",
443865
+ version: "1.81.5",
443850
443866
  transcript: normalizeMessagesForAPI(messages),
443851
443867
  errors: sanitizedErrors,
443852
443868
  lastApiRequest: getLastAPIRequest(),
@@ -444038,7 +444054,7 @@ function Feedback({
444038
444054
  ", ",
444039
444055
  env2.terminal,
444040
444056
  ", v",
444041
- "1.81.3"
444057
+ "1.81.5"
444042
444058
  ]
444043
444059
  }, undefined, true, undefined, this)
444044
444060
  ]
@@ -444144,7 +444160,7 @@ ${sanitizedDescription}
444144
444160
  ` + `**Environment Info**
444145
444161
  ` + `- Platform: ${env2.platform}
444146
444162
  ` + `- Terminal: ${env2.terminal}
444147
- ` + `- Version: ${"1.81.3"}
444163
+ ` + `- Version: ${"1.81.5"}
444148
444164
  ` + `- Feedback ID: ${feedbackId}
444149
444165
  ` + `
444150
444166
  **Errors**
@@ -447254,7 +447270,7 @@ function buildPrimarySection() {
447254
447270
  }, undefined, false, undefined, this);
447255
447271
  return [{
447256
447272
  label: "Version",
447257
- value: "1.81.3"
447273
+ value: "1.81.5"
447258
447274
  }, {
447259
447275
  label: "Session name",
447260
447276
  value: nameValue
@@ -448046,6 +448062,36 @@ var init_EffortIndicator = __esm(() => {
448046
448062
  init_effort();
448047
448063
  });
448048
448064
 
448065
+ // src/utils/model/modelPresentation.ts
448066
+ function compactModelDisplayName(modelId, maxLength = DEFAULT_COMPACT_MODEL_LENGTH) {
448067
+ const trimmed = modelId.trim();
448068
+ const leaf2 = trimmed.split("/").filter(Boolean).at(-1) ?? trimmed;
448069
+ const limit = Number.isFinite(maxLength) ? Math.max(2, Math.floor(maxLength)) : DEFAULT_COMPACT_MODEL_LENGTH;
448070
+ if (leaf2.length <= limit)
448071
+ return leaf2;
448072
+ return `${leaf2.slice(0, limit - 1)}\u2026`;
448073
+ }
448074
+ function buildProviderModelLabels(providerId, models) {
448075
+ if (providerId !== "openrouter") {
448076
+ return new Map(models.map((model) => [model.id, model.displayName]));
448077
+ }
448078
+ const baseLabels = models.map((model) => compactModelDisplayName(model.id));
448079
+ const counts = new Map;
448080
+ for (const label of baseLabels) {
448081
+ const key = label.toLowerCase();
448082
+ counts.set(key, (counts.get(key) ?? 0) + 1);
448083
+ }
448084
+ return new Map(models.map((model, index2) => {
448085
+ const label = baseLabels[index2];
448086
+ if ((counts.get(label.toLowerCase()) ?? 0) === 1) {
448087
+ return [model.id, label];
448088
+ }
448089
+ const vendor = model.id.includes("/") ? model.id.split("/")[0] : "model";
448090
+ return [model.id, `${label} \xB7 ${vendor}`];
448091
+ }));
448092
+ }
448093
+ var DEFAULT_COMPACT_MODEL_LENGTH = 30;
448094
+
448049
448095
  // src/components/ModelPicker.tsx
448050
448096
  function ModelPicker({
448051
448097
  initial,
@@ -448081,13 +448127,15 @@ function ModelPicker({
448081
448127
  setPickerError(null);
448082
448128
  listModelsForProviderWithSource(currentProvider, {
448083
448129
  settings: effectiveSettings,
448084
- signal: controller.signal
448130
+ signal: controller.signal,
448131
+ freshOnly: currentProvider === "openrouter"
448085
448132
  }).then((result) => {
448086
448133
  if (controller.signal.aborted)
448087
448134
  return;
448135
+ const modelLabels = buildProviderModelLabels(currentProvider, result.models);
448088
448136
  setProviderModelOptions(result.models.map((model) => ({
448089
448137
  value: model.id,
448090
- label: model.displayName,
448138
+ label: modelLabels.get(model.id) ?? model.displayName,
448091
448139
  description: `${model.description} \xB7 ${result.source}`,
448092
448140
  ...model.supportedParameters !== undefined && !model.supportedParameters.includes("tools") ? { disabled: true } : {}
448093
448141
  })));
@@ -450636,7 +450684,7 @@ function Config({
450636
450684
  }
450637
450685
  }, undefined, false, undefined, this)
450638
450686
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime179.jsxDEV(ChannelDowngradeDialog, {
450639
- currentVersion: "1.81.3",
450687
+ currentVersion: "1.81.5",
450640
450688
  onChoice: (choice) => {
450641
450689
  setShowSubmenu(null);
450642
450690
  setTabsHidden(false);
@@ -450648,7 +450696,7 @@ function Config({
450648
450696
  autoUpdatesChannel: "stable"
450649
450697
  };
450650
450698
  if (choice === "stay") {
450651
- newSettings.minimumVersion = "1.81.3";
450699
+ newSettings.minimumVersion = "1.81.5";
450652
450700
  }
450653
450701
  updateSettingsForSource("userSettings", newSettings);
450654
450702
  setSettingsData((prev_27) => ({
@@ -458957,7 +459005,7 @@ function HelpV2(t0) {
458957
459005
  let t6;
458958
459006
  if ($2[31] !== tabs) {
458959
459007
  t6 = /* @__PURE__ */ jsx_dev_runtime206.jsxDEV(Tabs, {
458960
- title: `UR v${"1.81.3"}`,
459008
+ title: `UR v${"1.81.5"}`,
458961
459009
  color: "professionalBlue",
458962
459010
  defaultTab: "general",
458963
459011
  children: tabs
@@ -459890,7 +459938,7 @@ function buildToolUseContext(tools, readFileStateCache, toolPermissionContext, a
459890
459938
  async function handleInitialize(options2) {
459891
459939
  return {
459892
459940
  name: "UR",
459893
- version: "1.81.3",
459941
+ version: "1.81.5",
459894
459942
  protocolVersion: "0.1.0",
459895
459943
  workspaceRoot: options2.cwd,
459896
459944
  capabilities: {
@@ -476998,7 +477046,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
476998
477046
  return [];
476999
477047
  }
477000
477048
  }
477001
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.81.3") {
477049
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.81.5") {
477002
477050
  if (process.env.USER_TYPE === "ant") {
477003
477051
  const changelog = "";
477004
477052
  if (changelog) {
@@ -477025,7 +477073,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.81.3")
477025
477073
  releaseNotes
477026
477074
  };
477027
477075
  }
477028
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.81.3") {
477076
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.81.5") {
477029
477077
  if (process.env.USER_TYPE === "ant") {
477030
477078
  const changelog = "";
477031
477079
  if (changelog) {
@@ -479930,7 +479978,7 @@ function getRecentActivitySync() {
479930
479978
  return cachedActivity;
479931
479979
  }
479932
479980
  function getLogoDisplayData() {
479933
- const version2 = process.env.DEMO_VERSION ?? "1.81.3";
479981
+ const version2 = process.env.DEMO_VERSION ?? "1.81.5";
479934
479982
  const serverUrl = getDirectConnectServerUrl();
479935
479983
  const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd());
479936
479984
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -480004,14 +480052,6 @@ var init_logoV2Utils = __esm(() => {
480004
480052
  });
480005
480053
 
480006
480054
  // src/components/LogoV2/URBanner.tsx
480007
- function getURWordmarkGlyphTone(glyph, row, column) {
480008
- if (glyph === "\u2588") {
480009
- return SPECULAR_GLYPHS.has(`${row}:${column}`) ? "warningShimmer" : "urShimmer";
480010
- }
480011
- if ("\u2557\u2551\u2554\u255D\u255A\u2550".includes(glyph))
480012
- return "ur";
480013
- return;
480014
- }
480015
480055
  function URBanner() {
480016
480056
  if (isScreenReaderMode()) {
480017
480057
  return /* @__PURE__ */ jsx_dev_runtime233.jsxDEV(ThemedText, {
@@ -480023,37 +480063,21 @@ function URBanner() {
480023
480063
  alignItems: "center",
480024
480064
  children: [
480025
480065
  UR_WORDMARK_ROWS.map((row, i3) => /* @__PURE__ */ jsx_dev_runtime233.jsxDEV(ThemedText, {
480026
- bold: true,
480027
- children: [...row].map((glyph, column) => /* @__PURE__ */ jsx_dev_runtime233.jsxDEV(ThemedText, {
480028
- color: getURWordmarkGlyphTone(glyph, i3, column),
480029
- children: glyph
480030
- }, `${i3}:${column}`, false, undefined, this))
480066
+ color: "ur",
480067
+ children: row
480031
480068
  }, i3, false, undefined, this)),
480032
480069
  /* @__PURE__ */ jsx_dev_runtime233.jsxDEV(ThemedText, {
480033
- bold: true,
480070
+ color: "ur",
480034
480071
  children: [
480035
- /* @__PURE__ */ jsx_dev_runtime233.jsxDEV(ThemedText, {
480036
- color: "warningShimmer",
480037
- children: "\u2726"
480038
- }, undefined, false, undefined, this),
480039
- /* @__PURE__ */ jsx_dev_runtime233.jsxDEV(ThemedText, {
480040
- color: "urShimmer",
480041
- children: [
480042
- " ",
480043
- UR_WORDMARK_TAGLINE,
480044
- " "
480045
- ]
480046
- }, undefined, true, undefined, this),
480047
- /* @__PURE__ */ jsx_dev_runtime233.jsxDEV(ThemedText, {
480048
- color: "warningShimmer",
480049
- children: "\u2726"
480050
- }, undefined, false, undefined, this)
480072
+ "\u2726 ",
480073
+ UR_WORDMARK_TAGLINE,
480074
+ " \u2726"
480051
480075
  ]
480052
480076
  }, undefined, true, undefined, this)
480053
480077
  ]
480054
480078
  }, undefined, true, undefined, this);
480055
480079
  }
480056
- var jsx_dev_runtime233, UR_WORDMARK_ROWS, UR_WORDMARK_TAGLINE = "THE AUTONOMOUS AGENT", SPECULAR_GLYPHS;
480080
+ var jsx_dev_runtime233, UR_WORDMARK_ROWS, UR_WORDMARK_TAGLINE = "THE AUTONOMOUS AGENT";
480057
480081
  var init_URBanner = __esm(() => {
480058
480082
  init_ink2();
480059
480083
  init_screenReader();
@@ -480066,25 +480090,6 @@ var init_URBanner = __esm(() => {
480066
480090
  "\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551 \u2588\u2588\u2551",
480067
480091
  " \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D"
480068
480092
  ];
480069
- SPECULAR_GLYPHS = new Set([
480070
- "0:0",
480071
- "0:1",
480072
- "0:6",
480073
- "0:7",
480074
- "0:11",
480075
- "0:12",
480076
- "0:13",
480077
- "0:14",
480078
- "0:15",
480079
- "0:16",
480080
- "1:0",
480081
- "1:6",
480082
- "1:11",
480083
- "1:15",
480084
- "2:0",
480085
- "2:6",
480086
- "2:11"
480087
- ]);
480088
480093
  });
480089
480094
 
480090
480095
  // src/components/LogoV2/UrHouse.tsx
@@ -480093,13 +480098,30 @@ function UrHouse({ size = "large" }) {
480093
480098
  return /* @__PURE__ */ jsx_dev_runtime234.jsxDEV(ThemedBox_default, {
480094
480099
  flexDirection: "column",
480095
480100
  alignItems: "center",
480096
- children: rows.map((row, i3) => /* @__PURE__ */ jsx_dev_runtime234.jsxDEV(ThemedText, {
480097
- color: "ur",
480098
- children: row
480099
- }, i3, false, undefined, this))
480100
- }, undefined, false, undefined, this);
480101
+ children: [
480102
+ rows.map((row, i3) => /* @__PURE__ */ jsx_dev_runtime234.jsxDEV(ThemedBox_default, {
480103
+ flexDirection: "row",
480104
+ children: [
480105
+ /* @__PURE__ */ jsx_dev_runtime234.jsxDEV(ThemedText, {
480106
+ color: "ur",
480107
+ children: row
480108
+ }, undefined, false, undefined, this),
480109
+ size === "large" && /* @__PURE__ */ jsx_dev_runtime234.jsxDEV(ThemedText, {
480110
+ color: "ur",
480111
+ dimColor: true,
480112
+ children: i3 >= LARGE_SHADOW_START_ROW ? "\u2591" : " "
480113
+ }, undefined, false, undefined, this)
480114
+ ]
480115
+ }, i3, true, undefined, this)),
480116
+ size === "large" && /* @__PURE__ */ jsx_dev_runtime234.jsxDEV(ThemedText, {
480117
+ color: "ur",
480118
+ dimColor: true,
480119
+ children: LARGE_HOUSE_BOTTOM_SHADOW
480120
+ }, undefined, false, undefined, this)
480121
+ ]
480122
+ }, undefined, true, undefined, this);
480101
480123
  }
480102
- var jsx_dev_runtime234, LARGE, SMALL;
480124
+ var jsx_dev_runtime234, LARGE, SMALL, LARGE_SHADOW_START_ROW = 3, LARGE_HOUSE_BOTTOM_SHADOW = " \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 ";
480103
480125
  var init_UrHouse = __esm(() => {
480104
480126
  init_ink2();
480105
480127
  jsx_dev_runtime234 = __toESM(require_jsx_dev_runtime(), 1);
@@ -480403,7 +480425,7 @@ function CondensedLogo() {
480403
480425
  const effortValue = useAppState(_temp240);
480404
480426
  const effortProvider = useAppState((s) => s.provider.active);
480405
480427
  const model = useMainLoopModel();
480406
- const modelDisplayName = renderModelSetting(model);
480428
+ const modelDisplayName = compactModelDisplayName(renderModelSetting(model));
480407
480429
  const {
480408
480430
  version: version2,
480409
480431
  cwd: cwd2,
@@ -480852,7 +480874,7 @@ function LogoV2() {
480852
480874
  if ($2[2] === Symbol.for("react.memo_cache_sentinel")) {
480853
480875
  t2 = () => {
480854
480876
  const currentConfig = getGlobalConfig();
480855
- if (currentConfig.lastReleaseNotesSeen === "1.81.3") {
480877
+ if (currentConfig.lastReleaseNotesSeen === "1.81.5") {
480856
480878
  return;
480857
480879
  }
480858
480880
  saveGlobalConfig(_temp325);
@@ -480917,7 +480939,7 @@ function LogoV2() {
480917
480939
  }
480918
480940
  import_react144.useEffect(t7, t8);
480919
480941
  const model = useMainLoopModel();
480920
- const fullModelDisplayName = renderModelSetting(model);
480942
+ const fullModelDisplayName = compactModelDisplayName(renderModelSetting(model));
480921
480943
  const {
480922
480944
  version: version2,
480923
480945
  cwd: cwd2,
@@ -481537,12 +481559,12 @@ function LogoV2() {
481537
481559
  return t41;
481538
481560
  }
481539
481561
  function _temp325(current) {
481540
- if (current.lastReleaseNotesSeen === "1.81.3") {
481562
+ if (current.lastReleaseNotesSeen === "1.81.5") {
481541
481563
  return current;
481542
481564
  }
481543
481565
  return {
481544
481566
  ...current,
481545
- lastReleaseNotesSeen: "1.81.3"
481567
+ lastReleaseNotesSeen: "1.81.5"
481546
481568
  };
481547
481569
  }
481548
481570
  function _temp241(s_0) {
@@ -497492,7 +497514,7 @@ function compileAgenticCiWorkflow(specName = "default", options2 = {}) {
497492
497514
  if (spec.name !== specName) {
497493
497515
  throw new Error("Agentic CI workflow spec name does not match");
497494
497516
  }
497495
- const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.81.3" : "1.81.3");
497517
+ const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.81.5" : "1.81.5");
497496
497518
  if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(packageVersion)) {
497497
497519
  throw new Error("invalid ur-agent package version");
497498
497520
  }
@@ -498485,7 +498507,7 @@ runner; \`ur trigger\` is the inbound parser that decides what to run.
498485
498507
  path: ".github/workflows/ur.yml",
498486
498508
  root: "project",
498487
498509
  content: compileAgenticCiWorkflow("default", {
498488
- packageVersion: typeof MACRO !== "undefined" ? "1.81.3" : "1.81.3"
498510
+ packageVersion: typeof MACRO !== "undefined" ? "1.81.5" : "1.81.5"
498489
498511
  })
498490
498512
  },
498491
498513
  {
@@ -498548,7 +498570,7 @@ function value(tokens, flag) {
498548
498570
  return index2 >= 0 ? tokens[index2 + 1] : undefined;
498549
498571
  }
498550
498572
  function cliVersion() {
498551
- return typeof MACRO !== "undefined" ? "1.81.3" : "1.81.3";
498573
+ return typeof MACRO !== "undefined" ? "1.81.5" : "1.81.5";
498552
498574
  }
498553
498575
  function workflowPath(cwd2) {
498554
498576
  return join168(cwd2, ".github", "workflows", "ur-agentic-ci.yml");
@@ -504404,7 +504426,7 @@ function createAcpStdioApp(deps) {
504404
504426
  }
504405
504427
  },
504406
504428
  authMethods: [],
504407
- agentInfo: { name: "UR-Nexus", version: "1.81.3" }
504429
+ agentInfo: { name: "UR-Nexus", version: "1.81.5" }
504408
504430
  })).onRequest("authenticate", () => ({})).onRequest("session/new", async (context6) => {
504409
504431
  const result = runtime2.newSession(context6.params.cwd, context6.params.mcpServers, context6.params.additionalDirectories);
504410
504432
  await runtime2.announce({
@@ -504501,7 +504523,7 @@ function createAcpStdioAgent(deps) {
504501
504523
  }
504502
504524
  },
504503
504525
  authMethods: [],
504504
- agentInfo: { name: "UR-Nexus", version: "1.81.3" }
504526
+ agentInfo: { name: "UR-Nexus", version: "1.81.5" }
504505
504527
  });
504506
504528
  return;
504507
504529
  case "authenticate":
@@ -715753,7 +715775,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
715753
715775
  smapsRollup,
715754
715776
  platform: process.platform,
715755
715777
  nodeVersion: process.version,
715756
- ccVersion: "1.81.3"
715778
+ ccVersion: "1.81.5"
715757
715779
  };
715758
715780
  }
715759
715781
  async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
@@ -716342,7 +716364,7 @@ var init_bridge_kick = __esm(() => {
716342
716364
  var call154 = async () => {
716343
716365
  return {
716344
716366
  type: "text",
716345
- value: "1.81.3"
716367
+ value: "1.81.5"
716346
716368
  };
716347
716369
  }, version2, version_default;
716348
716370
  var init_version = __esm(() => {
@@ -719402,13 +719424,15 @@ function ProviderFirstModelPicker({
719402
719424
  try {
719403
719425
  const result = await listModelsForProviderWithSource(providerId, {
719404
719426
  settings: getSettingsForSource("userSettings") ?? undefined,
719405
- signal: controller.signal
719427
+ signal: controller.signal,
719428
+ freshOnly: providerId === "openrouter"
719406
719429
  });
719407
719430
  if (cancelled)
719408
719431
  return;
719432
+ const modelLabels = buildProviderModelLabels(providerId, result.models);
719409
719433
  const options5 = result.models.map((model) => ({
719410
719434
  value: model.id,
719411
- label: model.displayName,
719435
+ label: modelLabels.get(model.id) ?? model.displayName,
719412
719436
  description: formatProviderModelDescription(model, result.source, providerId),
719413
719437
  pricing: model.pricing,
719414
719438
  contextLength: model.contextLength,
@@ -719976,7 +720000,7 @@ function ProviderFirstModelPicker({
719976
720000
  }, undefined, false, undefined, this),
719977
720001
  /* @__PURE__ */ jsx_dev_runtime336.jsxDEV(ThemedText, {
719978
720002
  dimColor: true,
719979
- children: selectedProvider?.value === "openrouter" ? `${modelOptions.length} current models from your OpenRouter account` : `Showing models for ${selectedProvider?.label} (${selectedProvider?.accessType})`
720003
+ children: selectedProvider?.value === "openrouter" ? `${modelOptions.length} models \xB7 fetched fresh whenever this catalog opens` : `Showing models for ${selectedProvider?.label} (${selectedProvider?.accessType})`
719980
720004
  }, undefined, false, undefined, this),
719981
720005
  /* @__PURE__ */ jsx_dev_runtime336.jsxDEV(ThemedText, {
719982
720006
  color: modelSource === "live" ? "success" : "subtle",
@@ -720032,6 +720056,14 @@ function ProviderFirstModelPicker({
720032
720056
  color: "text",
720033
720057
  children: focusedModel.label
720034
720058
  }, undefined, false, undefined, this),
720059
+ selectedProvider?.value === "openrouter" && /* @__PURE__ */ jsx_dev_runtime336.jsxDEV(ThemedText, {
720060
+ dimColor: true,
720061
+ color: "subtle",
720062
+ children: [
720063
+ "ID: ",
720064
+ focusedModel.value
720065
+ ]
720066
+ }, undefined, true, undefined, this),
720035
720067
  /* @__PURE__ */ jsx_dev_runtime336.jsxDEV(ThemedText, {
720036
720068
  dimColor: true,
720037
720069
  children: focusedModel.description
@@ -727701,7 +727733,7 @@ function generateHtmlReport(data, insights) {
727701
727733
  </html>`;
727702
727734
  }
727703
727735
  function buildExportData(data, insights, facets, remoteStats) {
727704
- const version3 = typeof MACRO !== "undefined" ? "1.81.3" : "unknown";
727736
+ const version3 = typeof MACRO !== "undefined" ? "1.81.5" : "unknown";
727705
727737
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
727706
727738
  const facets_summary = {
727707
727739
  total: facets.size,
@@ -732014,7 +732046,7 @@ var init_sessionStorage = __esm(() => {
732014
732046
  init_settings2();
732015
732047
  init_slowOperations();
732016
732048
  init_uuid();
732017
- VERSION7 = typeof MACRO !== "undefined" ? "1.81.3" : "unknown";
732049
+ VERSION7 = typeof MACRO !== "undefined" ? "1.81.5" : "unknown";
732018
732050
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
732019
732051
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
732020
732052
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -733229,7 +733261,7 @@ var init_filesystem = __esm(() => {
733229
733261
  });
733230
733262
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
733231
733263
  const nonce = randomBytes24(16).toString("hex");
733232
- return join243(getURTempDir(), "bundled-skills", "1.81.3", nonce);
733264
+ return join243(getURTempDir(), "bundled-skills", "1.81.5", nonce);
733233
733265
  });
733234
733266
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
733235
733267
  });
@@ -739629,7 +739661,7 @@ function computeFingerprint(messageText2, version3) {
739629
739661
  }
739630
739662
  function computeFingerprintFromMessages(messages) {
739631
739663
  const firstMessageText = extractFirstMessageText(messages);
739632
- return computeFingerprint(firstMessageText, "1.81.3");
739664
+ return computeFingerprint(firstMessageText, "1.81.5");
739633
739665
  }
739634
739666
  var FINGERPRINT_SALT = "59cf53e54c78";
739635
739667
  var init_fingerprint = () => {};
@@ -741564,7 +741596,7 @@ async function sideQuery(opts) {
741564
741596
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
741565
741597
  }
741566
741598
  const messageText2 = extractFirstUserMessageText(messages);
741567
- const fingerprint2 = computeFingerprint(messageText2, "1.81.3");
741599
+ const fingerprint2 = computeFingerprint(messageText2, "1.81.5");
741568
741600
  const attributionHeader = getAttributionHeader(fingerprint2);
741569
741601
  const systemBlocks = [
741570
741602
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -746398,7 +746430,7 @@ function buildSystemInitMessage(inputs) {
746398
746430
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
746399
746431
  apiKeySource: getURHQApiKeyWithSource().source,
746400
746432
  betas: getSdkBetas(),
746401
- ur_version: "1.81.3",
746433
+ ur_version: "1.81.5",
746402
746434
  output_style: outputStyle,
746403
746435
  agents: inputs.agents.map((agent2) => agent2.agentType),
746404
746436
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
@@ -760234,7 +760266,7 @@ var init_useVoiceEnabled = __esm(() => {
760234
760266
  function getSemverPart(version3) {
760235
760267
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
760236
760268
  }
760237
- function useUpdateNotification(updatedVersion, initialVersion = "1.81.3") {
760269
+ function useUpdateNotification(updatedVersion, initialVersion = "1.81.5") {
760238
760270
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react225.useState(() => getSemverPart(initialVersion));
760239
760271
  if (!updatedVersion) {
760240
760272
  return null;
@@ -760283,7 +760315,7 @@ function AutoUpdater({
760283
760315
  return;
760284
760316
  }
760285
760317
  if (false) {}
760286
- const currentVersion = "1.81.3";
760318
+ const currentVersion = "1.81.5";
760287
760319
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
760288
760320
  let latestVersion = await getLatestVersion(channel);
760289
760321
  const isDisabled = isAutoUpdaterDisabled();
@@ -760512,12 +760544,12 @@ function NativeAutoUpdater({
760512
760544
  logEvent("tengu_native_auto_updater_start", {});
760513
760545
  try {
760514
760546
  const maxVersion = await getMaxVersion();
760515
- if (maxVersion && gt("1.81.3", maxVersion)) {
760547
+ if (maxVersion && gt("1.81.5", maxVersion)) {
760516
760548
  const msg = await getMaxVersionMessage();
760517
760549
  setMaxVersionIssue(msg ?? "affects your version");
760518
760550
  }
760519
760551
  const result = await installLatest(channel);
760520
- const currentVersion = "1.81.3";
760552
+ const currentVersion = "1.81.5";
760521
760553
  const latencyMs = Date.now() - startTime;
760522
760554
  if (result.lockFailed) {
760523
760555
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -760654,17 +760686,17 @@ function PackageManagerAutoUpdater(t0) {
760654
760686
  const maxVersion = await getMaxVersion();
760655
760687
  if (maxVersion && latest && gt(latest, maxVersion)) {
760656
760688
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
760657
- if (gte("1.81.3", maxVersion)) {
760658
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.81.3"} is already at or above maxVersion ${maxVersion}, skipping update`);
760689
+ if (gte("1.81.5", maxVersion)) {
760690
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.81.5"} is already at or above maxVersion ${maxVersion}, skipping update`);
760659
760691
  setUpdateAvailable(false);
760660
760692
  return;
760661
760693
  }
760662
760694
  latest = maxVersion;
760663
760695
  }
760664
- const hasUpdate = latest && !gte("1.81.3", latest) && !shouldSkipVersion(latest);
760696
+ const hasUpdate = latest && !gte("1.81.5", latest) && !shouldSkipVersion(latest);
760665
760697
  setUpdateAvailable(!!hasUpdate);
760666
760698
  if (hasUpdate) {
760667
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.81.3"} -> ${latest}`);
760699
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.81.5"} -> ${latest}`);
760668
760700
  }
760669
760701
  };
760670
760702
  $2[0] = t1;
@@ -760698,7 +760730,7 @@ function PackageManagerAutoUpdater(t0) {
760698
760730
  wrap: "truncate",
760699
760731
  children: [
760700
760732
  "currentVersion: ",
760701
- "1.81.3"
760733
+ "1.81.5"
760702
760734
  ]
760703
760735
  }, undefined, true, undefined, this);
760704
760736
  $2[3] = verbose;
@@ -771551,7 +771583,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
771551
771583
  project_dir: getOriginalCwd(),
771552
771584
  added_dirs: addedDirs
771553
771585
  },
771554
- version: "1.81.3",
771586
+ version: "1.81.5",
771555
771587
  output_style: {
771556
771588
  name: outputStyleName
771557
771589
  },
@@ -771686,7 +771718,7 @@ function StatusLineInner({
771686
771718
  const attention = customStatusError ?? taskAttention;
771687
771719
  const terminalSize = React133.useContext(TerminalSizeContext);
771688
771720
  const defaultStatusLineText = buildDefaultStatusBar({
771689
- version: "1.81.3",
771721
+ version: "1.81.5",
771690
771722
  providerLabel: providerRuntime.providerLabel,
771691
771723
  authMode: providerRuntime.authLabel,
771692
771724
  model: renderModelName(mainLoopModel) || providerRuntime.model || "",
@@ -783942,7 +783974,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
783942
783974
  } catch {}
783943
783975
  const data = {
783944
783976
  trigger: trigger2,
783945
- version: "1.81.3",
783977
+ version: "1.81.5",
783946
783978
  platform: process.platform,
783947
783979
  transcript,
783948
783980
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -796311,7 +796343,7 @@ function WelcomeV2() {
796311
796343
  dimColor: true,
796312
796344
  children: [
796313
796345
  "v",
796314
- "1.81.3"
796346
+ "1.81.5"
796315
796347
  ]
796316
796348
  }, undefined, true, undefined, this)
796317
796349
  ]
@@ -797571,7 +797603,7 @@ function completeOnboarding() {
797571
797603
  saveGlobalConfig((current) => ({
797572
797604
  ...current,
797573
797605
  hasCompletedOnboarding: true,
797574
- lastOnboardingVersion: "1.81.3"
797606
+ lastOnboardingVersion: "1.81.5"
797575
797607
  }));
797576
797608
  }
797577
797609
  function showDialog(root2, renderer) {
@@ -802717,7 +802749,7 @@ function appendToLog(path28, message) {
802717
802749
  cwd: getFsImplementation().cwd(),
802718
802750
  userType: process.env.USER_TYPE,
802719
802751
  sessionId: getSessionId(),
802720
- version: "1.81.3"
802752
+ version: "1.81.5"
802721
802753
  };
802722
802754
  getLogWriter(path28).write(messageWithTimestamp);
802723
802755
  }
@@ -806881,8 +806913,8 @@ async function getEnvLessBridgeConfig() {
806881
806913
  }
806882
806914
  async function checkEnvLessBridgeMinVersion() {
806883
806915
  const cfg = await getEnvLessBridgeConfig();
806884
- if (cfg.min_version && lt("1.81.3", cfg.min_version)) {
806885
- return `Your version of UR (${"1.81.3"}) is too old for Remote Control.
806916
+ if (cfg.min_version && lt("1.81.5", cfg.min_version)) {
806917
+ return `Your version of UR (${"1.81.5"}) is too old for Remote Control.
806886
806918
  Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
806887
806919
  }
806888
806920
  return null;
@@ -807356,7 +807388,7 @@ async function initBridgeCore(params) {
807356
807388
  const rawApi = createBridgeApiClient({
807357
807389
  baseUrl,
807358
807390
  getAccessToken,
807359
- runnerVersion: "1.81.3",
807391
+ runnerVersion: "1.81.5",
807360
807392
  onDebug: logForDebugging,
807361
807393
  onAuth401,
807362
807394
  getTrustedDeviceToken
@@ -816829,7 +816861,7 @@ function getAgUiCapabilities() {
816829
816861
  name: "UR-Nexus",
816830
816862
  type: "ur-nexus",
816831
816863
  description: "Provider-flexible, local-first autonomous engineering workflow agent.",
816832
- version: "1.81.3",
816864
+ version: "1.81.5",
816833
816865
  provider: "UR",
816834
816866
  documentationUrl: "https://github.com/Maitham16/UR/blob/master/docs/AG_UI.md"
816835
816867
  },
@@ -818056,7 +818088,7 @@ function createMCPServer(cwd4, debug2, verbose) {
818056
818088
  };
818057
818089
  const server2 = new Server({
818058
818090
  name: "ur-nexus",
818059
- version: "1.81.3"
818091
+ version: "1.81.5"
818060
818092
  }, {
818061
818093
  capabilities: {
818062
818094
  tools: {}
@@ -819260,7 +819292,7 @@ function thrownResponse(error40) {
819260
819292
  }
819261
819293
  async function createUrMcp2026Runtime(options5) {
819262
819294
  const server2 = createMCPServer(options5.cwd, options5.debug === true, options5.verbose === true);
819263
- const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.81.3" }, { capabilities: {} });
819295
+ const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.81.5" }, { capabilities: {} });
819264
819296
  const [clientTransport, serverTransport] = createLinkedTransportPair();
819265
819297
  try {
819266
819298
  await server2.connect(serverTransport);
@@ -819271,7 +819303,7 @@ async function createUrMcp2026Runtime(options5) {
819271
819303
  }
819272
819304
  const runtime2 = new Mcp2026Runtime({
819273
819305
  cwd: options5.cwd,
819274
- version: "1.81.3",
819306
+ version: "1.81.5",
819275
819307
  backend: {
819276
819308
  listTools: async () => {
819277
819309
  const listed = await client2.listTools();
@@ -822006,7 +822038,7 @@ async function update() {
822006
822038
  logEvent("tengu_update_check", {});
822007
822039
  const diagnostic2 = await getDoctorDiagnostic();
822008
822040
  const result = await checkUpgradeStatus({
822009
- currentVersion: "1.81.3",
822041
+ currentVersion: "1.81.5",
822010
822042
  packageName: UR_AGENT_PACKAGE_NAME,
822011
822043
  installationType: diagnostic2.installationType,
822012
822044
  latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
@@ -823334,7 +823366,7 @@ ${customInstructions}` : customInstructions;
823334
823366
  }
823335
823367
  }
823336
823368
  logForDiagnosticsNoPII("info", "started", {
823337
- version: "1.81.3",
823369
+ version: "1.81.5",
823338
823370
  is_native_binary: isInBundledMode()
823339
823371
  });
823340
823372
  registerCleanup(async () => {
@@ -824121,7 +824153,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
824121
824153
  pendingHookMessages
824122
824154
  }, renderAndRun);
824123
824155
  }
824124
- }).version("1.81.3 (UR-Nexus)", "-v, --version", "Output the version number");
824156
+ }).version("1.81.5 (UR-Nexus)", "-v, --version", "Output the version number");
824125
824157
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
824126
824158
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
824127
824159
  if (canUserConfigureAdvisor()) {
@@ -825248,7 +825280,7 @@ if (false) {}
825248
825280
  async function main2() {
825249
825281
  const args = process.argv.slice(2);
825250
825282
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
825251
- console.log(`${"1.81.3"} (UR-Nexus)`);
825283
+ console.log(`${"1.81.5"} (UR-Nexus)`);
825252
825284
  return;
825253
825285
  }
825254
825286
  if (args[0] === "a2a" && args[1] === "serve" && !args.includes("--help") && !args.includes("-h")) {
@@ -146,7 +146,9 @@ request; Ollama is only used when `ollama` is the selected provider.
146
146
  In the model step, Up/Down browses, Left/Right changes the focused model's
147
147
  supported effort level, Enter confirms, Ctrl+R refreshes the catalog, and Esc
148
148
  returns to providers. OpenRouter entries show pricing tier, context size,
149
- tool/reasoning capability, and live/cache catalog status. API-provider secret
149
+ tool/reasoning capability, compact names, and the exact ID for the focused
150
+ entry. Its catalog is fetched fresh whenever opened; a failed refresh never
151
+ silently displays cached entries. API-provider secret
150
152
  entry stays on one masked row and stores the value through the keychain flow.
151
153
 
152
154
  The same provider-first picker is mandatory on the first interactive run in a
@@ -19,7 +19,7 @@ You need:
19
19
 
20
20
  ```sh
21
21
  ur --version
22
- # expected for this release: "1.81.3 (UR-Nexus)"
22
+ # expected for this release: "1.81.5 (UR-Nexus)"
23
23
  ```
24
24
 
25
25
  ### 0.0 Redteam mode and Reverse Skills (1.81.0)
package/docs/providers.md CHANGED
@@ -167,7 +167,9 @@ The provider-first `/model` picker supports the same control directly: use
167
167
  Left/Right to move through the effort levels advertised by the focused model,
168
168
  then Enter to apply the model and effort together. OpenRouter's live catalog
169
169
  shows pricing tier, context size, tool capability, reasoning capability, and
170
- whether the list came from the live endpoint or cache. API-key entry for
170
+ the exact model ID for the focused entry. Opening the OpenRouter catalog always
171
+ fetches the current `/models` endpoint and never substitutes a cached list when
172
+ that refresh fails. API-key entry for
171
173
  OpenAI, Claude, Gemini, and OpenRouter is a single aligned masked row; the key
172
174
  is stored in the OS keychain flow and is never written to settings.
173
175
 
@@ -229,8 +231,11 @@ You see all configured providers with:
229
231
  After selecting a provider:
230
232
  - Only models from that provider are shown
231
233
  - Each model shows its concise capabilities; OpenRouter includes pricing,
232
- context size, tool support, and reasoning support
234
+ context size, tool support, and reasoning support. Its list uses compact
235
+ model names; focus an entry to see the exact provider/model ID
233
236
  - Model source is displayed: `live` (dynamic discovery), `cache` (fallback), or `static` (predefined)
237
+ - OpenRouter is fresh-only in this picker: every opening fetches `/models`, and
238
+ a failed refresh is reported instead of showing stale cached entries
234
239
  - Left/Right changes effort for the focused model; Up/Down browses and Enter confirms
235
240
  - Press Esc to go back and change provider
236
241
 
@@ -290,7 +295,8 @@ ur config set provider anthropic-api
290
295
 
291
296
  | Provider type | Model discovery | Source label |
292
297
  | --- | --- | --- |
293
- | 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 |
298
+ | API providers (openai-api, anthropic-api, gemini-api) | Live discovery from the provider's `/models` endpoint using your connected key (curated fallback until connected) | live |
299
+ | OpenRouter | Fresh `/models` discovery every time its picker opens; no cached-list fallback in the picker | live |
294
300
  | Local/server providers (ollama, lmstudio, llama.cpp, vllm) | Dynamic discovery from the selected provider endpoint | live |
295
301
  | OpenAI-compatible | Dynamic discovery from configured endpoint | live |
296
302
  | Subscription CLIs (codex-cli, claude-code-cli, gemini-cli, antigravity-cli) | Curated list (the official CLIs expose no models API); first-class in `/model`, dispatched via the official CLI. External CLI behavior depends on the vendor CLI. Log in with `ur auth <provider>` | static |
@@ -45,7 +45,7 @@
45
45
  <main id="content" class="content">
46
46
  <header class="topbar">
47
47
  <div>
48
- <p class="eyebrow">Version 1.81.3</p>
48
+ <p class="eyebrow">Version 1.81.5</p>
49
49
  <h1>UR-Nexus Documentation</h1>
50
50
  <p class="lead">A practical, tutorial-style reference for installing, configuring, automating, extending, and operating UR-Nexus.</p>
51
51
  </div>
@@ -7,7 +7,7 @@ plugins {
7
7
  }
8
8
 
9
9
  group = "dev.urnexus"
10
- version = "1.81.3"
10
+ version = "1.81.5"
11
11
 
12
12
  repositories {
13
13
  mavenCentral()
@@ -2,7 +2,7 @@
2
2
  "name": "ur-inline-diffs",
3
3
  "displayName": "UR Inline Diffs",
4
4
  "description": "Review, apply, and reject UR inline diff bundles from .ur/ide/diffs inside VS Code.",
5
- "version": "1.81.3",
5
+ "version": "1.81.5",
6
6
  "publisher": "ur-nexus",
7
7
  "engines": {
8
8
  "vscode": "^1.92.0"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ur-agent",
3
- "version": "1.81.3",
3
+ "version": "1.81.5",
4
4
  "description": "UR-Nexus — autonomous engineering workflow engine (plan, execute, test, verify, document, benchmark, reproduce)",
5
5
  "type": "module",
6
6
  "packageManager": "bun@1.3.14",