ur-agent 1.83.1 → 1.83.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.83.2
4
+
5
+ - Synchronized the public guides, static documentation site, examples, and
6
+ source-derived technical specifications with the shipped capability-backed
7
+ effort contract. The docs now cover the complete selector ladder, `/effort`
8
+ and `--effort`, Left/Right model-picker control, provider-neutral `max`, and
9
+ exact Ultra mappings such as `ultra→max`, while clearly excluding models that
10
+ top out at `high`, Boolean-thinking models, and unknown capabilities.
11
+ - Corrected adjacent provider documentation: provider-scoped `base_url`
12
+ persistence, Unsloth's provider-only inference boundary, LM Studio's enabled
13
+ status, and OpenRouter's five-minute endpoint cache and latency-oriented
14
+ request routing. Added regression coverage to keep public and technical
15
+ effort documentation synchronized. This release changes documentation and
16
+ source comments only; runtime behavior remains the 1.83.1 contract.
17
+
3
18
  ## 1.83.1
4
19
 
5
20
  - Made Ultra a capability-driven, visible ceiling selector without inventing a
package/README.md CHANGED
@@ -263,7 +263,8 @@ not fall back to Ollama unless `ollama` is the selected provider.
263
263
  ### Legal Provider Auth
264
264
 
265
265
  UR-Nexus stores only safe provider preferences: provider name, model name,
266
- base URL, fallback preference, and non-secret settings. API keys must stay in
266
+ base URL, fallback preference, and non-secret settings. API keys stay out of
267
+ plaintext settings and are read from the OS keychain after `ur connect` or from
267
268
  environment variables. API, local, and OpenAI-compatible server providers are
268
269
  UR-native runtimes and behave like Ollama: UR owns the conversation loop, tool
269
270
  loop, errors, and output.
@@ -290,7 +291,7 @@ ur config set provider openrouter
290
291
  ur config set provider unsloth
291
292
  ur config set model qwen2.5-coder:7b
292
293
  ur provider select-model ollama qwen2.5-coder:7b --json
293
- ur config set base_url http://localhost:11434
294
+ ur config set base_url ollama http://localhost:11434
294
295
  ur config set base_url llama.cpp http://localhost:9931/v1
295
296
  ur config set provider.fallback ollama
296
297
  ```
@@ -305,7 +306,8 @@ provider before the URL to configure it without switching first, for example
305
306
  provider's address independently, so switching among Ollama, LM Studio,
306
307
  llama.cpp, vLLM, Unsloth, or another compatible endpoint restores that
307
308
  provider's last URL automatically. Existing single-URL settings are migrated
308
- to the previously active provider on the first switch.
309
+ to the previously active provider on the first provider switch or scoped
310
+ base-URL write.
309
311
 
310
312
  OpenAI API traffic uses Chat Completions by default. The Responses transport is
311
313
  an explicit, provider-scoped opt-in with privacy-conscious defaults:
@@ -375,14 +377,14 @@ In the interactive app, `/model` is a two-step, provider-first picker:
375
377
  generic `subscription` entry is an internal placeholder hidden from listings.
376
378
 
377
379
  In the model catalog, use **Up/Down** to browse. The effort row updates to
378
- the focused model's exact provider-advertised levels; use **Left/Right** to
379
- cycle only those levels before pressing Enter. `ultra` is UR's visible
380
+ the focused model's capability-backed selectors; use **Left/Right** to cycle
381
+ only values UR can map to provider-native levels before pressing Enter. `ultra` is UR's visible
380
382
  beyond-high ceiling selector. It appears only when the provider/model
381
383
  advertises `ultra`, `max`, `xhigh`, or an explicit equivalent, and the row
382
- shows the exact mapping (for example, `ultra→max`). High-only and
383
- boolean-thinking models do not get Ultra. A generic `max` request is
384
- resolved visibly to that model's actual `max`, `xhigh`, or `high` ceiling,
385
- and the resolved value is the value sent to the provider. llama.cpp models
384
+ shows the exact mapping (for example, `ultra→max`). Models whose graded
385
+ ladder tops out at `high`, plus boolean-thinking models, do not get Ultra. A generic
386
+ `max` request resolves visibly to that model's highest supported non-Ultra tier
387
+ (commonly `max`, `xhigh`, or `high`), and that resolved value is sent to the provider. llama.cpp models
386
388
  are checked lazily through their model-scoped `/props` capability while the
387
389
  cursor moves. Ollama models are checked through `/api/show`; Kimi K3 exposes
388
390
  `low`, `high`, and `max`, and the chosen level is sent through Ollama's
package/dist/cli.js CHANGED
@@ -115449,7 +115449,7 @@ var init_auth = __esm(() => {
115449
115449
 
115450
115450
  // src/utils/userAgent.ts
115451
115451
  function getURCodeUserAgent() {
115452
- return `ur/${"1.83.1"}`;
115452
+ return `ur/${"1.83.2"}`;
115453
115453
  }
115454
115454
 
115455
115455
  // src/utils/workloadContext.ts
@@ -115471,7 +115471,7 @@ function getUserAgent() {
115471
115471
  const clientApp = process.env.UR_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}` : "";
115472
115472
  const workload = getWorkload();
115473
115473
  const workloadSuffix = workload ? `, workload/${workload}` : "";
115474
- return `ur-cli/${"1.83.1"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
115474
+ return `ur-cli/${"1.83.2"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
115475
115475
  }
115476
115476
  function getMCPUserAgent() {
115477
115477
  const parts = [];
@@ -115485,7 +115485,7 @@ function getMCPUserAgent() {
115485
115485
  parts.push(`client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}`);
115486
115486
  }
115487
115487
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
115488
- return `ur/${"1.83.1"}${suffix}`;
115488
+ return `ur/${"1.83.2"}${suffix}`;
115489
115489
  }
115490
115490
  function getWebFetchUserAgent() {
115491
115491
  return `UR-User (${getURCodeUserAgent()})`;
@@ -115623,7 +115623,7 @@ var init_user = __esm(() => {
115623
115623
  deviceId,
115624
115624
  sessionId: getSessionId(),
115625
115625
  email: getEmail(),
115626
- appVersion: "1.83.1",
115626
+ appVersion: "1.83.2",
115627
115627
  platform: getHostPlatformForAnalytics(),
115628
115628
  organizationUuid,
115629
115629
  accountUuid,
@@ -123510,7 +123510,7 @@ var init_metadata = __esm(() => {
123510
123510
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
123511
123511
  WHITESPACE_REGEX = /\s+/;
123512
123512
  getVersionBase = memoize_default(() => {
123513
- const match = "1.83.1".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
123513
+ const match = "1.83.2".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
123514
123514
  return match ? match[0] : undefined;
123515
123515
  });
123516
123516
  buildEnvContext = memoize_default(async () => {
@@ -123550,7 +123550,7 @@ var init_metadata = __esm(() => {
123550
123550
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
123551
123551
  isURCodeAction: isEnvTruthy(process.env.UR_CODE_ACTION),
123552
123552
  isURAiAuth: isURAISubscriber(),
123553
- version: "1.83.1",
123553
+ version: "1.83.2",
123554
123554
  versionBase: getVersionBase(),
123555
123555
  buildTime: "",
123556
123556
  deploymentEnvironment: env2.detectDeploymentEnvironment(),
@@ -124220,7 +124220,7 @@ function initialize1PEventLogging() {
124220
124220
  const platform2 = getPlatform();
124221
124221
  const attributes = {
124222
124222
  [import_semantic_conventions4.ATTR_SERVICE_NAME]: "ur",
124223
- [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.83.1"
124223
+ [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.83.2"
124224
124224
  };
124225
124225
  if (platform2 === "wsl") {
124226
124226
  const wslVersion = getWslVersion();
@@ -124248,7 +124248,7 @@ function initialize1PEventLogging() {
124248
124248
  })
124249
124249
  ]
124250
124250
  });
124251
- firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.83.1");
124251
+ firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.83.2");
124252
124252
  }
124253
124253
  async function reinitialize1PEventLoggingIfConfigChanged() {
124254
124254
  if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
@@ -140456,7 +140456,7 @@ function formatA2AV1AgentCard(options = {}, pretty = true) {
140456
140456
  var urVersion, researchSnapshotDate = "2026-08-10", coverage, priorityRoadmap;
140457
140457
  var init_trends = __esm(() => {
140458
140458
  init_a2aCardSignature();
140459
- urVersion = typeof MACRO !== "undefined" ? "1.83.1" : "1.83.1";
140459
+ urVersion = typeof MACRO !== "undefined" ? "1.83.2" : "1.83.2";
140460
140460
  coverage = [
140461
140461
  {
140462
140462
  id: "local-runtime",
@@ -156221,7 +156221,7 @@ function getAttributionHeader(fingerprint) {
156221
156221
  if (!isAttributionHeaderEnabled()) {
156222
156222
  return "";
156223
156223
  }
156224
- const version2 = `${"1.83.1"}.${fingerprint}`;
156224
+ const version2 = `${"1.83.2"}.${fingerprint}`;
156225
156225
  const entrypoint = process.env.UR_CODE_ENTRYPOINT ?? "unknown";
156226
156226
  const cch = "";
156227
156227
  const workload = getWorkload();
@@ -206603,7 +206603,7 @@ function getTelemetryAttributes() {
206603
206603
  attributes["session.id"] = sessionId;
206604
206604
  }
206605
206605
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
206606
- attributes["app.version"] = "1.83.1";
206606
+ attributes["app.version"] = "1.83.2";
206607
206607
  }
206608
206608
  const oauthAccount = getOauthAccountInfo();
206609
206609
  if (oauthAccount) {
@@ -206951,7 +206951,7 @@ var init_betaSessionTracing = __esm(() => {
206951
206951
  function getInstruments() {
206952
206952
  if (instruments)
206953
206953
  return instruments;
206954
- const meter = import_api9.metrics.getMeter("ur-agent.gen_ai", "1.83.1");
206954
+ const meter = import_api9.metrics.getMeter("ur-agent.gen_ai", "1.83.2");
206955
206955
  instruments = {
206956
206956
  operationDuration: meter.createHistogram("gen_ai.client.operation.duration", {
206957
206957
  description: "GenAI operation duration.",
@@ -207049,7 +207049,7 @@ function genAiAgentAttributes() {
207049
207049
  "gen_ai.operation.name": GEN_AI_OPERATION_INVOKE_AGENT,
207050
207050
  "gen_ai.provider.name": "ur",
207051
207051
  "gen_ai.agent.name": "UR-Nexus",
207052
- "gen_ai.agent.version": "1.83.1"
207052
+ "gen_ai.agent.version": "1.83.2"
207053
207053
  };
207054
207054
  }
207055
207055
  function genAiWorkflowAttributes(workflowName, workflowRunId) {
@@ -207070,7 +207070,7 @@ function genAiWorkflowAttributes(workflowName, workflowRunId) {
207070
207070
  function startGenAiWorkflowSpan(workflowName, workflowRunId) {
207071
207071
  const attributes = genAiWorkflowAttributes(workflowName, workflowRunId);
207072
207072
  const name = typeof attributes["gen_ai.workflow.name"] === "string" ? `invoke_workflow ${attributes["gen_ai.workflow.name"]}` : GEN_AI_OPERATION_INVOKE_WORKFLOW;
207073
- return import_api9.trace.getTracer("ur-agent.gen_ai", "1.83.1").startSpan(name, { kind: import_api9.SpanKind.INTERNAL, attributes });
207073
+ return import_api9.trace.getTracer("ur-agent.gen_ai", "1.83.2").startSpan(name, { kind: import_api9.SpanKind.INTERNAL, attributes });
207074
207074
  }
207075
207075
  function endGenAiWorkflowSpan(span, options2 = {}) {
207076
207076
  try {
@@ -207108,7 +207108,7 @@ function startGenAiMemorySpan(operation, options2 = {}) {
207108
207108
  if (options2.recordCount !== undefined && Number.isInteger(options2.recordCount) && options2.recordCount >= 0) {
207109
207109
  attributes["gen_ai.memory.record.count"] = options2.recordCount;
207110
207110
  }
207111
- return import_api9.trace.getTracer("ur-agent.gen_ai", "1.83.1").startSpan(operation, { kind: import_api9.SpanKind.INTERNAL, attributes });
207111
+ return import_api9.trace.getTracer("ur-agent.gen_ai", "1.83.2").startSpan(operation, { kind: import_api9.SpanKind.INTERNAL, attributes });
207112
207112
  }
207113
207113
  function endGenAiMemorySpan(span, options2 = {}) {
207114
207114
  try {
@@ -213376,7 +213376,7 @@ async function createRuntime() {
213376
213376
  bootstrapTelemetry();
213377
213377
  const resource = defaultResource().merge(detectResources({ detectors: [envDetector] })).merge(resourceFromAttributes({
213378
213378
  [import_semantic_conventions7.ATTR_SERVICE_NAME]: "ur-agent",
213379
- [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.83.1"
213379
+ [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.83.2"
213380
213380
  }));
213381
213381
  const tracerProvider = exporters.traces.length > 0 ? new BasicTracerProvider({
213382
213382
  resource,
@@ -213409,11 +213409,11 @@ async function createRuntime() {
213409
213409
  setMeterProvider(meterProvider);
213410
213410
  setLoggerProvider(loggerProvider);
213411
213411
  if (meterProvider) {
213412
- const meter = meterProvider.getMeter("ur-agent", "1.83.1");
213412
+ const meter = meterProvider.getMeter("ur-agent", "1.83.2");
213413
213413
  setMeter(meter, (name, options2) => meter.createCounter(name, options2));
213414
213414
  }
213415
213415
  if (loggerProvider) {
213416
- setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.83.1"));
213416
+ setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.83.2"));
213417
213417
  }
213418
213418
  if (!cleanupRegistered2) {
213419
213419
  cleanupRegistered2 = true;
@@ -213962,7 +213962,7 @@ function isAnyTracingEnabled() {
213962
213962
  return isTelemetryEnabled() || isEnhancedTelemetryEnabled() || isBetaTracingEnabled();
213963
213963
  }
213964
213964
  function getTracer() {
213965
- return import_api31.trace.getTracer("ur-agent.gen_ai", "1.83.1");
213965
+ return import_api31.trace.getTracer("ur-agent.gen_ai", "1.83.2");
213966
213966
  }
213967
213967
  function createSpanAttributes(spanType, customAttributes = {}) {
213968
213968
  const baseAttributes = getTelemetryAttributes();
@@ -356488,7 +356488,7 @@ function getInstallationEnv() {
356488
356488
  return;
356489
356489
  }
356490
356490
  function getURCodeVersion() {
356491
- return "1.83.1";
356491
+ return "1.83.2";
356492
356492
  }
356493
356493
  async function getInstalledVSCodeExtensionVersion(command) {
356494
356494
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -367559,7 +367559,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
367559
367559
  const client2 = new Client({
367560
367560
  name: "ur",
367561
367561
  title: "UR",
367562
- version: "1.83.1",
367562
+ version: "1.83.2",
367563
367563
  description: "UR-Nexus autonomous engineering workflow engine",
367564
367564
  websiteUrl: PRODUCT_URL
367565
367565
  }, {
@@ -367916,7 +367916,7 @@ var init_client3 = __esm(() => {
367916
367916
  const client2 = new Client({
367917
367917
  name: "ur",
367918
367918
  title: "UR",
367919
- version: "1.83.1",
367919
+ version: "1.83.2",
367920
367920
  description: "UR-Nexus autonomous engineering workflow engine",
367921
367921
  websiteUrl: PRODUCT_URL
367922
367922
  }, {
@@ -428711,9 +428711,9 @@ async function assertMinVersion() {
428711
428711
  if (false) {}
428712
428712
  try {
428713
428713
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
428714
- if (versionConfig.minVersion && lt("1.83.1", versionConfig.minVersion)) {
428714
+ if (versionConfig.minVersion && lt("1.83.2", versionConfig.minVersion)) {
428715
428715
  console.error(`
428716
- It looks like your version of UR (${"1.83.1"}) needs an update.
428716
+ It looks like your version of UR (${"1.83.2"}) needs an update.
428717
428717
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
428718
428718
 
428719
428719
  To update, please run:
@@ -428929,7 +428929,7 @@ async function installGlobalPackage(specificVersion) {
428929
428929
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
428930
428930
  logEvent("tengu_auto_updater_lock_contention", {
428931
428931
  pid: process.pid,
428932
- currentVersion: "1.83.1"
428932
+ currentVersion: "1.83.2"
428933
428933
  });
428934
428934
  return "in_progress";
428935
428935
  }
@@ -428938,7 +428938,7 @@ async function installGlobalPackage(specificVersion) {
428938
428938
  if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
428939
428939
  logError2(new Error("Windows NPM detected in WSL environment"));
428940
428940
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
428941
- currentVersion: "1.83.1"
428941
+ currentVersion: "1.83.2"
428942
428942
  });
428943
428943
  console.error(`
428944
428944
  Error: Windows NPM detected in WSL
@@ -429473,7 +429473,7 @@ function detectLinuxGlobPatternWarnings() {
429473
429473
  }
429474
429474
  async function getDoctorDiagnostic() {
429475
429475
  const installationType = await getCurrentInstallationType();
429476
- const version2 = typeof MACRO !== "undefined" ? "1.83.1" : "unknown";
429476
+ const version2 = typeof MACRO !== "undefined" ? "1.83.2" : "unknown";
429477
429477
  const installationPath = await getInstallationPath();
429478
429478
  const invokedBinary = getInvokedBinary();
429479
429479
  const multipleInstallations = await detectMultipleInstallations();
@@ -430408,8 +430408,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
430408
430408
  const maxVersion = await getMaxVersion();
430409
430409
  if (maxVersion && gt(version2, maxVersion)) {
430410
430410
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
430411
- if (gte("1.83.1", maxVersion)) {
430412
- logForDebugging(`Native installer: current version ${"1.83.1"} is already at or above maxVersion ${maxVersion}, skipping update`);
430411
+ if (gte("1.83.2", maxVersion)) {
430412
+ logForDebugging(`Native installer: current version ${"1.83.2"} is already at or above maxVersion ${maxVersion}, skipping update`);
430413
430413
  logEvent("tengu_native_update_skipped_max_version", {
430414
430414
  latency_ms: Date.now() - startTime,
430415
430415
  max_version: maxVersion,
@@ -430420,7 +430420,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
430420
430420
  version2 = maxVersion;
430421
430421
  }
430422
430422
  }
430423
- if (!forceReinstall && version2 === "1.83.1" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
430423
+ if (!forceReinstall && version2 === "1.83.2" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
430424
430424
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
430425
430425
  logEvent("tengu_native_update_complete", {
430426
430426
  latency_ms: Date.now() - startTime,
@@ -480844,7 +480844,7 @@ var init_filesystem = __esm(() => {
480844
480844
  });
480845
480845
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
480846
480846
  const nonce = randomBytes22(16).toString("hex");
480847
- return join143(getURTempDir(), "bundled-skills", "1.83.1", nonce);
480847
+ return join143(getURTempDir(), "bundled-skills", "1.83.2", nonce);
480848
480848
  });
480849
480849
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
480850
480850
  });
@@ -482866,7 +482866,7 @@ function Feedback({
482866
482866
  platform: env2.platform,
482867
482867
  gitRepo: envInfo.isGit,
482868
482868
  terminal: env2.terminal,
482869
- version: "1.83.1",
482869
+ version: "1.83.2",
482870
482870
  transcript: normalizeMessagesForAPI(messages),
482871
482871
  errors: sanitizedErrors,
482872
482872
  lastApiRequest: getLastAPIRequest(),
@@ -483058,7 +483058,7 @@ function Feedback({
483058
483058
  ", ",
483059
483059
  env2.terminal,
483060
483060
  ", v",
483061
- "1.83.1"
483061
+ "1.83.2"
483062
483062
  ]
483063
483063
  }, undefined, true, undefined, this)
483064
483064
  ]
@@ -483164,7 +483164,7 @@ ${sanitizedDescription}
483164
483164
  ` + `**Environment Info**
483165
483165
  ` + `- Platform: ${env2.platform}
483166
483166
  ` + `- Terminal: ${env2.terminal}
483167
- ` + `- Version: ${"1.83.1"}
483167
+ ` + `- Version: ${"1.83.2"}
483168
483168
  ` + `- Feedback ID: ${feedbackId}
483169
483169
  ` + `
483170
483170
  **Errors**
@@ -486274,7 +486274,7 @@ function buildPrimarySection() {
486274
486274
  }, undefined, false, undefined, this);
486275
486275
  return [{
486276
486276
  label: "Version",
486277
- value: "1.83.1"
486277
+ value: "1.83.2"
486278
486278
  }, {
486279
486279
  label: "Session name",
486280
486280
  value: nameValue
@@ -489790,7 +489790,7 @@ function Config({
489790
489790
  }
489791
489791
  }, undefined, false, undefined, this)
489792
489792
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime178.jsxDEV(ChannelDowngradeDialog, {
489793
- currentVersion: "1.83.1",
489793
+ currentVersion: "1.83.2",
489794
489794
  onChoice: (choice) => {
489795
489795
  setShowSubmenu(null);
489796
489796
  setTabsHidden(false);
@@ -489802,7 +489802,7 @@ function Config({
489802
489802
  autoUpdatesChannel: "stable"
489803
489803
  };
489804
489804
  if (choice === "stay") {
489805
- newSettings.minimumVersion = "1.83.1";
489805
+ newSettings.minimumVersion = "1.83.2";
489806
489806
  }
489807
489807
  updateSettingsForSource("userSettings", newSettings);
489808
489808
  setSettingsData((prev_27) => ({
@@ -498118,7 +498118,7 @@ function HelpV2(t0) {
498118
498118
  let t6;
498119
498119
  if ($2[31] !== tabs) {
498120
498120
  t6 = /* @__PURE__ */ jsx_dev_runtime205.jsxDEV(Tabs, {
498121
- title: `UR v${"1.83.1"}`,
498121
+ title: `UR v${"1.83.2"}`,
498122
498122
  color: "professionalBlue",
498123
498123
  defaultTab: "general",
498124
498124
  children: tabs
@@ -499051,7 +499051,7 @@ function buildToolUseContext(tools, readFileStateCache, toolPermissionContext, a
499051
499051
  async function handleInitialize(options2) {
499052
499052
  return {
499053
499053
  name: "UR",
499054
- version: "1.83.1",
499054
+ version: "1.83.2",
499055
499055
  protocolVersion: "0.1.0",
499056
499056
  workspaceRoot: options2.cwd,
499057
499057
  capabilities: {
@@ -516152,7 +516152,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
516152
516152
  return [];
516153
516153
  }
516154
516154
  }
516155
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.83.1") {
516155
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.83.2") {
516156
516156
  if (process.env.USER_TYPE === "ant") {
516157
516157
  const changelog = "";
516158
516158
  if (changelog) {
@@ -516179,7 +516179,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.83.1")
516179
516179
  releaseNotes
516180
516180
  };
516181
516181
  }
516182
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.83.1") {
516182
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.83.2") {
516183
516183
  if (process.env.USER_TYPE === "ant") {
516184
516184
  const changelog = "";
516185
516185
  if (changelog) {
@@ -519087,7 +519087,7 @@ function getRecentActivitySync() {
519087
519087
  return cachedActivity;
519088
519088
  }
519089
519089
  function getLogoDisplayData() {
519090
- const version2 = process.env.DEMO_VERSION ?? "1.83.1";
519090
+ const version2 = process.env.DEMO_VERSION ?? "1.83.2";
519091
519091
  const serverUrl = getDirectConnectServerUrl();
519092
519092
  const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd2());
519093
519093
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -519975,7 +519975,7 @@ function LogoV2() {
519975
519975
  if ($2[2] === Symbol.for("react.memo_cache_sentinel")) {
519976
519976
  t2 = () => {
519977
519977
  const currentConfig = getGlobalConfig();
519978
- if (currentConfig.lastReleaseNotesSeen === "1.83.1") {
519978
+ if (currentConfig.lastReleaseNotesSeen === "1.83.2") {
519979
519979
  return;
519980
519980
  }
519981
519981
  saveGlobalConfig(_temp325);
@@ -520663,12 +520663,12 @@ function LogoV2() {
520663
520663
  return t41;
520664
520664
  }
520665
520665
  function _temp325(current) {
520666
- if (current.lastReleaseNotesSeen === "1.83.1") {
520666
+ if (current.lastReleaseNotesSeen === "1.83.2") {
520667
520667
  return current;
520668
520668
  }
520669
520669
  return {
520670
520670
  ...current,
520671
- lastReleaseNotesSeen: "1.83.1"
520671
+ lastReleaseNotesSeen: "1.83.2"
520672
520672
  };
520673
520673
  }
520674
520674
  function _temp241(s_0) {
@@ -536618,7 +536618,7 @@ function compileAgenticCiWorkflow(specName = "default", options2 = {}) {
536618
536618
  if (spec.name !== specName) {
536619
536619
  throw new Error("Agentic CI workflow spec name does not match");
536620
536620
  }
536621
- const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.83.1" : "1.83.1");
536621
+ const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.83.2" : "1.83.2");
536622
536622
  if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(packageVersion)) {
536623
536623
  throw new Error("invalid ur-agent package version");
536624
536624
  }
@@ -537614,7 +537614,7 @@ runner; \`ur trigger\` is the inbound parser that decides what to run.
537614
537614
  path: ".github/workflows/ur.yml",
537615
537615
  root: "project",
537616
537616
  content: compileAgenticCiWorkflow("default", {
537617
- packageVersion: typeof MACRO !== "undefined" ? "1.83.1" : "1.83.1"
537617
+ packageVersion: typeof MACRO !== "undefined" ? "1.83.2" : "1.83.2"
537618
537618
  })
537619
537619
  },
537620
537620
  {
@@ -537677,7 +537677,7 @@ function value(tokens, flag) {
537677
537677
  return index2 >= 0 ? tokens[index2 + 1] : undefined;
537678
537678
  }
537679
537679
  function cliVersion() {
537680
- return typeof MACRO !== "undefined" ? "1.83.1" : "1.83.1";
537680
+ return typeof MACRO !== "undefined" ? "1.83.2" : "1.83.2";
537681
537681
  }
537682
537682
  function workflowPath(cwd2) {
537683
537683
  return join172(cwd2, ".github", "workflows", "ur-agentic-ci.yml");
@@ -543533,7 +543533,7 @@ function createAcpStdioApp(deps) {
543533
543533
  }
543534
543534
  },
543535
543535
  authMethods: [],
543536
- agentInfo: { name: "UR-Nexus", version: "1.83.1" }
543536
+ agentInfo: { name: "UR-Nexus", version: "1.83.2" }
543537
543537
  })).onRequest("authenticate", () => ({})).onRequest("session/new", async (context6) => {
543538
543538
  const result = runtime2.newSession(context6.params.cwd, context6.params.mcpServers, context6.params.additionalDirectories);
543539
543539
  await runtime2.announce({
@@ -543630,7 +543630,7 @@ function createAcpStdioAgent(deps) {
543630
543630
  }
543631
543631
  },
543632
543632
  authMethods: [],
543633
- agentInfo: { name: "UR-Nexus", version: "1.83.1" }
543633
+ agentInfo: { name: "UR-Nexus", version: "1.83.2" }
543634
543634
  });
543635
543635
  return;
543636
543636
  case "authenticate":
@@ -756169,7 +756169,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
756169
756169
  smapsRollup,
756170
756170
  platform: process.platform,
756171
756171
  nodeVersion: process.version,
756172
- ccVersion: "1.83.1"
756172
+ ccVersion: "1.83.2"
756173
756173
  };
756174
756174
  }
756175
756175
  async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
@@ -756758,7 +756758,7 @@ var init_bridge_kick = __esm(() => {
756758
756758
  var call154 = async () => {
756759
756759
  return {
756760
756760
  type: "text",
756761
- value: "1.83.1"
756761
+ value: "1.83.2"
756762
756762
  };
756763
756763
  }, version2, version_default;
756764
756764
  var init_version = __esm(() => {
@@ -768428,7 +768428,7 @@ function generateHtmlReport(data, insights) {
768428
768428
  </html>`;
768429
768429
  }
768430
768430
  function buildExportData(data, insights, facets, remoteStats) {
768431
- const version3 = typeof MACRO !== "undefined" ? "1.83.1" : "unknown";
768431
+ const version3 = typeof MACRO !== "undefined" ? "1.83.2" : "unknown";
768432
768432
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
768433
768433
  const facets_summary = {
768434
768434
  total: facets.size,
@@ -772741,7 +772741,7 @@ var init_sessionStorage = __esm(() => {
772741
772741
  init_settings2();
772742
772742
  init_slowOperations();
772743
772743
  init_uuid();
772744
- VERSION7 = typeof MACRO !== "undefined" ? "1.83.1" : "unknown";
772744
+ VERSION7 = typeof MACRO !== "undefined" ? "1.83.2" : "unknown";
772745
772745
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
772746
772746
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
772747
772747
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -774220,7 +774220,7 @@ function computeFingerprint(messageText2, version3) {
774220
774220
  }
774221
774221
  function computeFingerprintFromMessages(messages) {
774222
774222
  const firstMessageText = extractFirstMessageText(messages);
774223
- return computeFingerprint(firstMessageText, "1.83.1");
774223
+ return computeFingerprint(firstMessageText, "1.83.2");
774224
774224
  }
774225
774225
  var FINGERPRINT_SALT = "59cf53e54c78";
774226
774226
  var init_fingerprint = () => {};
@@ -776210,7 +776210,7 @@ async function sideQuery(opts) {
776210
776210
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
776211
776211
  }
776212
776212
  const messageText2 = extractFirstUserMessageText(messages);
776213
- const fingerprint2 = computeFingerprint(messageText2, "1.83.1");
776213
+ const fingerprint2 = computeFingerprint(messageText2, "1.83.2");
776214
776214
  const attributionHeader = getAttributionHeader(fingerprint2);
776215
776215
  const systemBlocks = [
776216
776216
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -781044,7 +781044,7 @@ function buildSystemInitMessage(inputs) {
781044
781044
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
781045
781045
  apiKeySource: getURHQApiKeyWithSource().source,
781046
781046
  betas: getSdkBetas(),
781047
- ur_version: "1.83.1",
781047
+ ur_version: "1.83.2",
781048
781048
  output_style: outputStyle,
781049
781049
  agents: inputs.agents.map((agent2) => agent2.agentType),
781050
781050
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
@@ -794872,7 +794872,7 @@ var init_useVoiceEnabled = __esm(() => {
794872
794872
  function getSemverPart(version3) {
794873
794873
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
794874
794874
  }
794875
- function useUpdateNotification(updatedVersion, initialVersion = "1.83.1") {
794875
+ function useUpdateNotification(updatedVersion, initialVersion = "1.83.2") {
794876
794876
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react225.useState(() => getSemverPart(initialVersion));
794877
794877
  if (!updatedVersion) {
794878
794878
  return null;
@@ -794921,7 +794921,7 @@ function AutoUpdater({
794921
794921
  return;
794922
794922
  }
794923
794923
  if (false) {}
794924
- const currentVersion = "1.83.1";
794924
+ const currentVersion = "1.83.2";
794925
794925
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
794926
794926
  let latestVersion = await getLatestVersion(channel);
794927
794927
  const isDisabled = isAutoUpdaterDisabled();
@@ -795150,12 +795150,12 @@ function NativeAutoUpdater({
795150
795150
  logEvent("tengu_native_auto_updater_start", {});
795151
795151
  try {
795152
795152
  const maxVersion = await getMaxVersion();
795153
- if (maxVersion && gt("1.83.1", maxVersion)) {
795153
+ if (maxVersion && gt("1.83.2", maxVersion)) {
795154
795154
  const msg = await getMaxVersionMessage();
795155
795155
  setMaxVersionIssue(msg ?? "affects your version");
795156
795156
  }
795157
795157
  const result = await installLatest(channel);
795158
- const currentVersion = "1.83.1";
795158
+ const currentVersion = "1.83.2";
795159
795159
  const latencyMs = Date.now() - startTime;
795160
795160
  if (result.lockFailed) {
795161
795161
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -795292,17 +795292,17 @@ function PackageManagerAutoUpdater(t0) {
795292
795292
  const maxVersion = await getMaxVersion();
795293
795293
  if (maxVersion && latest && gt(latest, maxVersion)) {
795294
795294
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
795295
- if (gte("1.83.1", maxVersion)) {
795296
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.83.1"} is already at or above maxVersion ${maxVersion}, skipping update`);
795295
+ if (gte("1.83.2", maxVersion)) {
795296
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.83.2"} is already at or above maxVersion ${maxVersion}, skipping update`);
795297
795297
  setUpdateAvailable(false);
795298
795298
  return;
795299
795299
  }
795300
795300
  latest = maxVersion;
795301
795301
  }
795302
- const hasUpdate = latest && !gte("1.83.1", latest) && !shouldSkipVersion(latest);
795302
+ const hasUpdate = latest && !gte("1.83.2", latest) && !shouldSkipVersion(latest);
795303
795303
  setUpdateAvailable(!!hasUpdate);
795304
795304
  if (hasUpdate) {
795305
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.83.1"} -> ${latest}`);
795305
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.83.2"} -> ${latest}`);
795306
795306
  }
795307
795307
  };
795308
795308
  $2[0] = t1;
@@ -795336,7 +795336,7 @@ function PackageManagerAutoUpdater(t0) {
795336
795336
  wrap: "truncate",
795337
795337
  children: [
795338
795338
  "currentVersion: ",
795339
- "1.83.1"
795339
+ "1.83.2"
795340
795340
  ]
795341
795341
  }, undefined, true, undefined, this);
795342
795342
  $2[3] = verbose;
@@ -806189,7 +806189,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
806189
806189
  project_dir: getOriginalCwd(),
806190
806190
  added_dirs: addedDirs
806191
806191
  },
806192
- version: "1.83.1",
806192
+ version: "1.83.2",
806193
806193
  output_style: {
806194
806194
  name: outputStyleName
806195
806195
  },
@@ -806324,7 +806324,7 @@ function StatusLineInner({
806324
806324
  const attention = customStatusError ?? taskAttention;
806325
806325
  const terminalSize = React135.useContext(TerminalSizeContext);
806326
806326
  const defaultStatusLineText = buildDefaultStatusBar({
806327
- version: "1.83.1",
806327
+ version: "1.83.2",
806328
806328
  providerLabel: providerRuntime.providerLabel,
806329
806329
  authMode: providerRuntime.authLabel,
806330
806330
  model: renderModelName(mainLoopModel) || providerRuntime.model || "",
@@ -818563,7 +818563,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
818563
818563
  } catch {}
818564
818564
  const data = {
818565
818565
  trigger: trigger2,
818566
- version: "1.83.1",
818566
+ version: "1.83.2",
818567
818567
  platform: process.platform,
818568
818568
  transcript,
818569
818569
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -830933,7 +830933,7 @@ function WelcomeV2() {
830933
830933
  dimColor: true,
830934
830934
  children: [
830935
830935
  "v",
830936
- "1.83.1"
830936
+ "1.83.2"
830937
830937
  ]
830938
830938
  }, undefined, true, undefined, this)
830939
830939
  ]
@@ -832179,7 +832179,7 @@ function completeOnboarding() {
832179
832179
  saveGlobalConfig((current) => ({
832180
832180
  ...current,
832181
832181
  hasCompletedOnboarding: true,
832182
- lastOnboardingVersion: "1.83.1"
832182
+ lastOnboardingVersion: "1.83.2"
832183
832183
  }));
832184
832184
  }
832185
832185
  function showDialog(root2, renderer) {
@@ -837325,7 +837325,7 @@ function appendToLog(path28, message) {
837325
837325
  cwd: getFsImplementation().cwd(),
837326
837326
  userType: process.env.USER_TYPE,
837327
837327
  sessionId: getSessionId(),
837328
- version: "1.83.1"
837328
+ version: "1.83.2"
837329
837329
  };
837330
837330
  getLogWriter(path28).write(messageWithTimestamp);
837331
837331
  }
@@ -841489,8 +841489,8 @@ async function getEnvLessBridgeConfig() {
841489
841489
  }
841490
841490
  async function checkEnvLessBridgeMinVersion() {
841491
841491
  const cfg = await getEnvLessBridgeConfig();
841492
- if (cfg.min_version && lt("1.83.1", cfg.min_version)) {
841493
- return `Your version of UR (${"1.83.1"}) is too old for Remote Control.
841492
+ if (cfg.min_version && lt("1.83.2", cfg.min_version)) {
841493
+ return `Your version of UR (${"1.83.2"}) is too old for Remote Control.
841494
841494
  Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
841495
841495
  }
841496
841496
  return null;
@@ -841964,7 +841964,7 @@ async function initBridgeCore(params) {
841964
841964
  const rawApi = createBridgeApiClient({
841965
841965
  baseUrl,
841966
841966
  getAccessToken,
841967
- runnerVersion: "1.83.1",
841967
+ runnerVersion: "1.83.2",
841968
841968
  onDebug: logForDebugging,
841969
841969
  onAuth401,
841970
841970
  getTrustedDeviceToken
@@ -855406,7 +855406,7 @@ function getAgUiCapabilities() {
855406
855406
  name: "UR-Nexus",
855407
855407
  type: "ur-nexus",
855408
855408
  description: "Provider-flexible, local-first autonomous engineering workflow agent.",
855409
- version: "1.83.1",
855409
+ version: "1.83.2",
855410
855410
  provider: "UR",
855411
855411
  documentationUrl: "https://github.com/Maitham16/UR/blob/master/docs/AG_UI.md"
855412
855412
  },
@@ -856227,7 +856227,7 @@ function createMCPServer(cwd4, debug2, verbose) {
856227
856227
  };
856228
856228
  const server2 = new Server({
856229
856229
  name: "ur-nexus",
856230
- version: "1.83.1"
856230
+ version: "1.83.2"
856231
856231
  }, {
856232
856232
  capabilities: {
856233
856233
  tools: {}
@@ -857430,7 +857430,7 @@ function thrownResponse(error61) {
857430
857430
  }
857431
857431
  async function createUrMcp2026Runtime(options5) {
857432
857432
  const server2 = createMCPServer(options5.cwd, options5.debug === true, options5.verbose === true);
857433
- const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.83.1" }, { capabilities: {} });
857433
+ const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.83.2" }, { capabilities: {} });
857434
857434
  const [clientTransport, serverTransport] = createLinkedTransportPair();
857435
857435
  try {
857436
857436
  await server2.connect(serverTransport);
@@ -857441,7 +857441,7 @@ async function createUrMcp2026Runtime(options5) {
857441
857441
  }
857442
857442
  const runtime2 = new Mcp2026Runtime({
857443
857443
  cwd: options5.cwd,
857444
- version: "1.83.1",
857444
+ version: "1.83.2",
857445
857445
  backend: {
857446
857446
  listTools: async () => {
857447
857447
  const listed = await client2.listTools();
@@ -860277,7 +860277,7 @@ async function update() {
860277
860277
  logEvent("tengu_update_check", {});
860278
860278
  const diagnostic2 = await getDoctorDiagnostic();
860279
860279
  const result = await checkUpgradeStatus({
860280
- currentVersion: "1.83.1",
860280
+ currentVersion: "1.83.2",
860281
860281
  packageName: UR_AGENT_PACKAGE_NAME,
860282
860282
  installationType: diagnostic2.installationType,
860283
860283
  latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
@@ -861605,7 +861605,7 @@ ${customInstructions}` : customInstructions;
861605
861605
  }
861606
861606
  }
861607
861607
  logForDiagnosticsNoPII("info", "started", {
861608
- version: "1.83.1",
861608
+ version: "1.83.2",
861609
861609
  is_native_binary: isInBundledMode()
861610
861610
  });
861611
861611
  registerCleanup(async () => {
@@ -862392,7 +862392,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
862392
862392
  pendingHookMessages
862393
862393
  }, renderAndRun);
862394
862394
  }
862395
- }).version("1.83.1 (UR-Nexus)", "-v, --version", "Output the version number");
862395
+ }).version("1.83.2 (UR-Nexus)", "-v, --version", "Output the version number");
862396
862396
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
862397
862397
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
862398
862398
  if (canUserConfigureAdvisor()) {
@@ -863519,7 +863519,7 @@ if (false) {}
863519
863519
  async function main2() {
863520
863520
  const args = process.argv.slice(2);
863521
863521
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
863522
- console.log(`${"1.83.1"} (UR-Nexus)`);
863522
+ console.log(`${"1.83.2"} (UR-Nexus)`);
863523
863523
  return;
863524
863524
  }
863525
863525
  if (args[0] === "a2a" && args[1] === "serve" && !args.includes("--help") && !args.includes("-h")) {
@@ -314,7 +314,7 @@ ur auth antigravity
314
314
  ur config set provider ollama
315
315
  ur config set provider openai-compatible
316
316
  ur config set model qwen2.5-coder:7b
317
- ur config set base_url http://localhost:11434/v1
317
+ ur config set base_url openai-compatible http://localhost:11434/v1
318
318
  ur config set provider.fallback ollama
319
319
  ur upgrade
320
320
  ```
@@ -164,7 +164,8 @@ request; Ollama is only used when `ollama` is the selected provider.
164
164
  The configured `base_url` is provider-scoped. Setting an address while vLLM is
165
165
  active does not replace the saved Ollama, llama.cpp, or Unsloth address;
166
166
  returning to any provider restores its own URL. Legacy `provider.baseUrl`
167
- settings are migrated to the old active provider when the first switch occurs.
167
+ settings are migrated to the old active provider on the first provider switch
168
+ or scoped base-URL write.
168
169
  To configure a provider that is not active, use
169
170
  `ur config set base_url <provider> <url>`; the success message names the target
170
171
  provider. This applies to direct API providers and gateways (OpenAI, Anthropic,
@@ -185,6 +186,12 @@ Ollama and llama.cpp capabilities are loaded lazily for the focused model from
185
186
  `/api/show` and `/props`, respectively, so the arrow selector reflects the
186
187
  actual model rather than a provider-wide guess.
187
188
 
189
+ The effort row contains only capability-backed selectors UR can map to native
190
+ provider values. Ultra appears only when metadata advertises `ultra`, `max`,
191
+ `xhigh`, or an explicit alias; mappings such as `ultra→max` are shown and sent
192
+ exactly. Models that top out at `high`, boolean-thinking models, and unknown
193
+ capabilities omit Ultra. See [Reasoning effort](providers.md#reasoning-effort).
194
+
188
195
  The same provider-first picker is mandatory on the first interactive run in a
189
196
  workspace with no model in `.ur/settings.json` or `.ur/settings.local.json`.
190
197
  The result is validated and written to the gitignored local settings file.
@@ -223,7 +230,7 @@ UNSLOTH_API_KEY=...
223
230
  Unsloth is an inference-provider integration only. Start Unsloth Studio and
224
231
  load the model outside UR, connect its generated key with `ur connect unsloth`,
225
232
  then select a model discovered from `http://localhost:8888/v1` (or your
226
- configured `base_url`). UR always sends `enable_tools: false`; standard model
233
+ configured `base_url`). UR sends `enable_tools: false` on every inference request; standard model
227
234
  function calls continue through UR's normal native tool flow, while Unsloth's
228
235
  server-side tools remain disabled so the integration stays provider-only.
229
236
 
@@ -228,8 +228,8 @@ tool loop.
228
228
  - Fix: point UR at the right endpoint.
229
229
 
230
230
  ```sh
231
- ur config set base_url http://localhost:11434
232
- ur provider doctor
231
+ ur config set base_url ollama http://localhost:11434
232
+ ur provider doctor ollama
233
233
  ```
234
234
 
235
235
  Addresses are saved per provider. If the doctor probes an unexpected URL,
package/docs/USAGE.md CHANGED
@@ -214,7 +214,7 @@ and `antigravity-cli` (`agy`) are subscription CLI providers.
214
214
 
215
215
  API modes are explicit. Keys are read from a key stored via
216
216
  `ur connect <provider>` (OS keychain) or from the environment variables
217
- `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `GEMINI_API_KEY`, and
217
+ `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `GEMINI_API_KEY`,
218
218
  `OPENROUTER_API_KEY`, and `UNSLOTH_API_KEY`. Subscription CLIs are optional, never required
219
219
  dependencies, and never used as a silent fallback. UR-Nexus never scrapes
220
220
  browser sessions, extracts OAuth tokens, or bypasses provider restrictions.
@@ -224,9 +224,10 @@ and is inference-only: UR does not manage Unsloth and disables its server-side
224
224
  tools while retaining standard function calls inside UR's guarded tool loop.
225
225
 
226
226
  UR stores `base_url` per provider. You can set different addresses for
227
- Ollama, llama.cpp, vLLM, and Unsloth once, then switch providers without
228
- re-entering any of them. `ur config get base_url` always reports the address
229
- for the currently active provider.
227
+ Ollama, LM Studio, llama.cpp, vLLM, and Unsloth once, then switch providers without
228
+ re-entering any of them. `ur config get base_url` reports the active provider's
229
+ saved scoped override when one exists; use `ur provider status` or
230
+ `ur provider doctor <provider>` to inspect the effective endpoint.
230
231
  Use `ur config set base_url <provider> <url>` to change one provider's address
231
232
  without making it active first. The `/model` picker offers the same endpoint
232
233
  entry flow for a disconnected local/server provider.
@@ -19,7 +19,7 @@ You need:
19
19
 
20
20
  ```sh
21
21
  ur --version
22
- # expected for this release: "1.83.1 (UR-Nexus)"
22
+ # expected for this release: "1.83.2 (UR-Nexus)"
23
23
  ```
24
24
 
25
25
  ### 0.0 Redteam mode and Reverse Skills (1.81.0)
@@ -72,14 +72,14 @@ changes must remain blocked. The deterministic regressions are:
72
72
  bun test test/taskListGate.test.ts test/toolExecutionFinalInput.test.ts
73
73
  ```
74
74
 
75
- ### 0.0.0 OpenRouter research routing and provider UI (1.81.3)
75
+ ### 0.0.0 OpenRouter research routing and provider UI (1.81.3; Ultra mapping updated 1.83.1)
76
76
 
77
77
  Connect OpenRouter, run `/model`, select OpenRouter, and verify that its model
78
78
  step shows catalog freshness plus pricing/context/tool/reasoning details. Focus
79
79
  a reasoning model and press Left/Right; the displayed effort must change and
80
- the row must list only that model's provider-advertised levels. Move Up/Down
81
- between high-only, xhigh, max, and native-ultra models; the level list and
82
- selected ceiling must update immediately. High-only must omit Ultra, while
80
+ the row must list only capability-backed selectors that map to that model's native levels. Move Up/Down
81
+ between models that top out at high, xhigh, max, and native-ultra models; the level list and
82
+ selected ceiling must update immediately. Models that top out at high must omit Ultra, while
83
83
  xhigh/max entries must show `ultra→xhigh` or `ultra→max`, and the
84
84
  confirmation must match `/effort status` and the request wire value. For
85
85
  llama.cpp, verify focus requests
package/docs/providers.md CHANGED
@@ -21,8 +21,9 @@ UR-Nexus never:
21
21
  - claims provider support unless the official CLI/API path works
22
22
 
23
23
  UR-Nexus stores only safe config: provider name, model name, base URL, fallback
24
- preference, and non-secret preferences. API keys are read from environment
25
- variables only when the user explicitly selects API mode.
24
+ preference, and non-secret preferences. API keys stay out of plaintext settings
25
+ and are read from the OS keychain after `ur connect` or from environment
26
+ variables when the user explicitly selects API mode.
26
27
 
27
28
  ## Provider matrix
28
29
 
@@ -144,7 +145,8 @@ form `ur config set base_url <provider> <url>` configures a named provider
144
145
  without switching first, and the confirmation names that provider. Each
145
146
  provider retains its own address across `/provider`, `/model`, and CLI
146
147
  switches. The legacy single `provider.baseUrl` field remains readable and is
147
- migrated to the previously active provider on the first switch.
148
+ migrated to the previously active provider on the first provider switch or
149
+ scoped base-URL write.
148
150
 
149
151
  The override is not limited to local runtimes. OpenAI API, Anthropic API,
150
152
  Gemini API, and OpenRouter can each target a separate compatible gateway using
@@ -171,10 +173,11 @@ the previous provider.
171
173
 
172
174
  ### Reasoning effort
173
175
 
174
- Use `/effort minimal|low|medium|high|xhigh|max|ultra|auto` inside UR. UR normalizes
175
- the exact graded levels advertised for the active provider/model pair. `max`
176
- is provider-neutral and means the selected model's real ceiling: it therefore
177
- displays and sends `max`, `xhigh`, or `high` according to that model's contract.
176
+ Use `/effort minimal|low|medium|high|xhigh|max|ultra|auto` inside UR. UR builds a
177
+ capability-backed selector set from the native graded levels advertised for the active
178
+ provider/model pair. `max` is provider-neutral and means the selected model's
179
+ highest supported non-Ultra tier: it displays and sends the matching native
180
+ value (commonly `max`, `xhigh`, or `high`) according to that model's contract.
178
181
  For OpenRouter, UR preserves the live `/models` reasoning metadata and sends
179
182
  the unified `reasoning.effort` request. OpenAI-compatible servers receive the
180
183
  resolved value as `reasoning_effort`. The command confirmation, status
@@ -184,8 +187,8 @@ UR does not invent a graded effort selector.
184
187
  `ultra` is UR's visible beyond-high ceiling selector. It is selectable only
185
188
  when the provider/model advertises `ultra`, `max`, `xhigh`, or an explicit
186
189
  provider-authored equivalent. UR shows the native mapping (for example,
187
- `ultra→max`) and sends that exact wire value; it never enables Ultra for a
188
- high-only model, boolean thinking, or unknown capability metadata. Arbitrary
190
+ `ultra→max`) and sends that exact wire value; it never enables Ultra for a model
191
+ whose graded ladder tops out at `high`, boolean thinking, or unknown capability metadata. Arbitrary
189
192
  labels such as `deep` still require an explicit provider alias because UR
190
193
  cannot infer their rank.
191
194
 
@@ -202,7 +205,7 @@ See [Ollama thinking](https://docs.ollama.com/capabilities/thinking),
202
205
  and [Gemini thinking](https://ai.google.dev/gemini-api/docs/thinking).
203
206
 
204
207
  The provider-first `/model` picker supports the same control directly: use
205
- Left/Right to move through the effort levels advertised by the focused model,
208
+ Left/Right to move through the capability-backed selectors UR can map to the focused model's native levels,
206
209
  then Enter to apply the model and effort together. OpenRouter's live catalog
207
210
  shows pricing tier, context size, tool capability, reasoning capability, and
208
211
  the full, untruncated model ID immediately below the focused entry. Opening the
@@ -283,12 +286,12 @@ After selecting a provider:
283
286
  - Each model shows its concise capabilities; OpenRouter includes pricing,
284
287
  context size, tool support, and reasoning support. Its list uses compact
285
288
  model names; focus an entry to see the exact provider/model ID
286
- - Model source is displayed: `live` (dynamic discovery), `cache` (fallback), or `static` (predefined)
287
- - OpenRouter is fresh-only in this picker: every opening fetches `/models`, and
288
- a failed refresh is reported instead of showing stale cached entries
289
+ - Model source is displayed: `live` (dynamic discovery), `cache` (recent endpoint result), or `static` (predefined)
290
+ - OpenRouter reuses an endpoint-scoped `/models` result for five minutes; Ctrl+R
291
+ forces a live refresh, and a failed forced refresh never substitutes stale data
289
292
  - Up/Down changes the focused model and immediately switches to that model's
290
- provider-advertised effort list; Left/Right cycles only those exact levels;
291
- Enter confirms both
293
+ capability-backed effort selectors; Left/Right cycles only values UR can map
294
+ to provider-native levels, and Enter confirms both
292
295
  - Press Esc to go back and change provider
293
296
 
294
297
  **Confirmation**
@@ -591,7 +594,7 @@ ur provider models unsloth --json
591
594
 
592
595
  The default endpoint is `http://localhost:8888/v1`; override it with
593
596
  `ur config set base_url unsloth <url>`. Authentication is mandatory. Every Unsloth
594
- request sets `enable_tools: false`, including streaming requests. The model may
597
+ inference request sets `enable_tools: false`, including streaming requests. The model may
595
598
  still return standard OpenAI function calls; UR handles those through the same
596
599
  native tool flow used by its other providers. This keeps Unsloth provider-only
597
600
  and avoids running a second tool loop inside Studio. See the official
@@ -621,6 +624,7 @@ Required variables:
621
624
  | Provider | Required env vars | Optional env vars |
622
625
  | --- | --- | --- |
623
626
  | OpenAI-compatible | `OPENAI_COMPATIBLE_BASE_URL`, `OPENAI_COMPATIBLE_MODEL` | `OPENAI_COMPATIBLE_API_KEY` |
627
+ | Unsloth | `UNSLOTH_API_KEY`, `UNSLOTH_MODEL` | `UNSLOTH_BASE_URL` (defaults to `http://localhost:8888/v1`) |
624
628
  | OpenAI | `OPENAI_API_KEY`, `OPENAI_MODEL` | `OPENAI_BASE_URL` |
625
629
  | OpenRouter | `OPENROUTER_API_KEY`, `OPENROUTER_MODEL` | `OPENROUTER_BASE_URL` |
626
630
  | Anthropic | `ANTHROPIC_API_KEY`, `ANTHROPIC_MODEL` | `ANTHROPIC_BASE_URL` |
@@ -67,9 +67,9 @@ const featureGroups = [
67
67
  },
68
68
  {
69
69
  title: 'Providers and auth',
70
- tags: ['subscription', 'API', 'local', 'status bar'],
71
- text: 'UR-native API/local/OpenAI-compatible runtimes, first-class subscription CLI providers dispatched through the official vendor CLIs, provider doctor checks, secure API-key connect, non-secret config, fallback hints, and provider-aware status-bar output.',
72
- commands: ['ur provider list', 'ur provider status', 'ur provider doctor agy', 'ur connect status', 'ur config set provider openai-api', 'ur config set provider ollama'],
70
+ tags: ['subscription', 'API', 'local', 'effort', 'status bar'],
71
+ text: 'UR-native API/local/OpenAI-compatible runtimes, provider-scoped endpoints, provider-only Unsloth inference, capability-driven reasoning effort, responsive OpenRouter routing, first-class subscription CLI providers dispatched through the official vendor CLIs, provider doctor checks, secure API-key connect, non-secret config, fallback hints, and provider-aware status-bar output.',
72
+ commands: ['ur provider list', 'ur provider status', 'ur provider doctor agy', 'ur connect status', 'ur config set provider openai-api', 'ur config set provider ollama', 'ur config set base_url llama.cpp http://localhost:9931/v1', '/effort ultra'],
73
73
  },
74
74
  {
75
75
  title: 'Security and operations',
@@ -85,7 +85,7 @@ const commands = [
85
85
  category: 'Core',
86
86
  aliases: [],
87
87
  summary: 'Start an interactive session; a fresh workspace must choose and locally persist a validated provider/model pair first.',
88
- examples: ['ur', 'ur --model qwen3-coder:480b-cloud', 'ur --continue', 'ur --resume'],
88
+ examples: ['ur', 'ur --model kimi-k3:cloud --effort ultra', 'ur --continue', 'ur --resume'],
89
89
  },
90
90
  {
91
91
  name: 'ur -p',
@@ -225,7 +225,7 @@ const commands = [
225
225
  category: 'Ops',
226
226
  aliases: ['settings'],
227
227
  summary: 'Open the config panel or persist safe non-secret provider settings.',
228
- examples: ['ur config', 'ur config set provider ollama', 'ur config set provider openai-api', 'ur config set provider anthropic-api', 'ur config set model qwen3-coder:480b-cloud', 'ur config set base_url http://localhost:11434/v1', 'ur config set provider.fallback ollama'],
228
+ examples: ['ur config', 'ur config set provider ollama', 'ur config set provider openai-api', 'ur config set provider anthropic-api', 'ur config set model qwen3-coder:480b-cloud', 'ur config set base_url ollama http://localhost:11434', 'ur config set base_url llama.cpp http://localhost:9931/v1', 'ur config set provider.fallback ollama'],
229
229
  },
230
230
  {
231
231
  name: 'test-first',
@@ -547,8 +547,8 @@ const slashGroups = [
547
547
  },
548
548
  {
549
549
  title: 'Models, tools, and interop',
550
- items: ['/model', '/model-doctor', '/model-route', '/escalate', '/mcp', '/plugin', '/skills', '/skill', '/sdk', '/a2a-card'],
551
- text: 'Pick models, inspect capabilities, manage MCP/plugin extensions, browse prompt skills with /skills, run executable workflows with /skill, and expose interop surfaces.',
550
+ items: ['/model', '/provider', '/effort', '/fast', '/model-doctor', '/model-route', '/escalate', '/mcp', '/plugin', '/skills', '/skill', '/sdk', '/a2a-card'],
551
+ text: 'Pick providers and models, cycle only capability-backed effort selectors that map to provider-native values, inspect capabilities, manage MCP/plugin extensions, browse prompt skills with /skills, run executable workflows with /skill, and expose interop surfaces.',
552
552
  },
553
553
  {
554
554
  title: 'Security operations',
@@ -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.83.1</p>
48
+ <p class="eyebrow">Version 1.83.2</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>
@@ -165,16 +165,31 @@ ur provider doctor agy</code></pre>
165
165
  <h3>API and local providers</h3>
166
166
  <pre><code>ur config set provider openai-compatible
167
167
  ur config set provider openai-api
168
- ur config set base_url http://localhost:11434/v1
168
+ ur config set base_url ollama http://localhost:11434
169
+ ur config set base_url llama.cpp http://localhost:9931/v1
170
+ ur config set provider unsloth
169
171
  ur config set model qwen3-coder:480b-cloud
170
172
  ur config set provider.fallback ollama
171
173
  ur config set openai_transport responses
172
174
  ur config set responses.store false</code></pre>
173
- <p>API providers require explicit selection and read keys from a key stored via <code>ur connect</code> (OS keychain) or from environment variables. OpenAI Responses is opt-in and privacy-first; Chat Completions remains the default. Local providers include Ollama, LM Studio, llama.cpp, and vLLM.</p>
175
+ <p>API providers require explicit selection and read keys from a key stored via <code>ur connect</code> (OS keychain) or from environment variables. Each configurable provider keeps its own <code>base_url</code>, so switching among Ollama, LM Studio, llama.cpp, vLLM, Unsloth, and API gateways restores the matching address. OpenAI Responses is opt-in and privacy-first; Chat Completions remains the default. Unsloth is an authenticated inference provider only.</p>
176
+ </article>
177
+ <article>
178
+ <h3>Capability-driven reasoning effort</h3>
179
+ <pre><code>/effort ultra
180
+ ur --model kimi-k3:cloud --effort high
181
+ /model # Up/Down model · Left/Right effort · Enter apply</code></pre>
182
+ <p>The normalized vocabulary is <code>minimal</code>, <code>low</code>, <code>medium</code>, <code>high</code>, <code>xhigh</code>, <code>max</code>, and <code>ultra</code>; <code>/effort auto</code> clears an explicit choice. UR lists only capability-backed selectors it can map to the focused model's provider-native levels. <code>max</code> resolves to the highest supported non-Ultra tier. Ultra appears only for native <code>ultra</code>, advertised <code>max</code>/<code>xhigh</code>, or an explicit provider alias; the picker shows translations such as <code>ultra→max</code> and sends that exact provider value. Models that top out at <code>high</code>, boolean-thinking models, and unknown capabilities do not get Ultra.</p>
183
+ </article>
184
+ <article>
185
+ <h3>OpenRouter responsive routing</h3>
186
+ <pre><code>ur config set provider openrouter
187
+ /model # cached catalog; Ctrl+R forces live refresh</code></pre>
188
+ <p>The endpoint-scoped model catalog is reused for five minutes, while forced refresh never substitutes stale data. Interactive requests prefer OpenRouter latency routing, a stable session ID, and provider-authored prompt-cache markers; explicit routing preferences and model variants still win.</p>
174
189
  </article>
175
190
  <article>
176
191
  <h3>Status bar and updates</h3>
177
- <pre><code>Ollama | llama3 | ask | main | update 1.48.0 available</code></pre>
192
+ <pre><code>Ollama | llama3 | ask | main | update 1.83.2 available</code></pre>
178
193
  <p>The interactive status bar shows only important runtime state: provider, model, mode, branch, active tasks, checks status when known, and update availability. It is hidden in CI, dumb terminals, and print mode.</p>
179
194
  </article>
180
195
  <article>
@@ -38,7 +38,11 @@ ur config set provider codex-cli
38
38
  ```
39
39
 
40
40
  Inside a session, `/model` gives the same flow interactively: provider first,
41
- then only that provider's models. Verify the active pair any time:
41
+ then only that provider's models. Use Up/Down to focus a model and Left/Right to
42
+ cycle its capability-backed effort selectors before pressing Enter. Ultra is
43
+ shown only when UR can map it to an advertised native `ultra`, `max`, `xhigh`,
44
+ or explicit alias; the picker displays the exact mapping, such as
45
+ `ultra→max`. Verify the active pair any time:
42
46
 
43
47
  ```sh
44
48
  ur provider status
@@ -7,7 +7,7 @@ plugins {
7
7
  }
8
8
 
9
9
  group = "dev.urnexus"
10
- version = "1.83.1"
10
+ version = "1.83.2"
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.83.1",
5
+ "version": "1.83.2",
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.83.1",
3
+ "version": "1.83.2",
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",