ur-agent 1.84.0 → 1.84.1

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,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.84.1
4
+
5
+ - Made dynamic reasoning discovery capability-truthful across local and
6
+ OpenAI-compatible providers. vLLM now uses its non-generating server-info
7
+ contract to expose `minimal→none|low|medium|high` only when a reasoning
8
+ parser is configured, and the adapter serializes all provider-authored effort
9
+ aliases rather than translating Ultra alone. llama.cpp records its template
10
+ support flag without fabricating a finite level set that the endpoint does
11
+ not publish.
12
+ - Refined Ollama's thinking presentation: a generic `thinking` capability now
13
+ reports thinking support and UR's verified native on/off control without
14
+ claiming the model supports only booleans. Exact graded levels and Ultra
15
+ remain model-scoped and provider-advertised. Added provider-matrix, discovery,
16
+ picker, command-message, and request-wire regression coverage and synchronized
17
+ the public site, user guides, validation guide, and technical specification.
18
+
3
19
  ## 1.84.0
4
20
 
5
21
  - Added production npm marketplace sources with scoped-package and version
package/README.md CHANGED
@@ -379,7 +379,8 @@ In the interactive app, `/model` is a two-step, provider-first picker:
379
379
  In the model catalog, use **Up/Down** to browse. For graded models, the effort row updates to
380
380
  the focused model's capability-backed selectors; use **Left/Right** to cycle
381
381
  only values UR can map to provider-native levels before pressing Enter. For
382
- boolean-thinking models on runtimes with a native two-state mapping (currently
382
+ models with thinking but no advertised graded ladder on runtimes with a native
383
+ two-state mapping (currently
383
384
  Ollama and direct Anthropic), Left selects off, Right selects on, and `t`
384
385
  toggles. The same state is available directly through `/thinking on|off`.
385
386
  Generic OpenAI-compatible runtimes never receive an invented boolean field.
@@ -387,14 +388,21 @@ In the interactive app, `/model` is a two-step, provider-first picker:
387
388
  beyond-high ceiling selector. It appears only when the provider/model
388
389
  advertises `ultra`, `max`, `xhigh`, or an explicit equivalent, and the row
389
390
  shows the exact mapping (for example, `ultra→max`). Models whose graded
390
- ladder tops out at `high`, plus boolean-thinking models, do not get Ultra. A generic
391
+ ladder tops out at `high`, plus models without an advertised beyond-high
392
+ value, do not get Ultra. A generic
391
393
  `max` request resolves visibly to that model's highest supported non-Ultra tier
392
394
  (commonly `max`, `xhigh`, or `high`), and that resolved value is sent to the provider. llama.cpp models
393
395
  are checked lazily through their model-scoped `/props` capability while the
394
- cursor moves. Ollama models are checked through `/api/show`; its `thinking`
395
- capability enables boolean thinking without inventing a graded ladder.
396
- If `/effort max` or another graded request is used for a boolean-only model,
397
- UR enables thinking but reports that no graded level was sent.
396
+ cursor moves. Because current llama.cpp reports support but not the accepted
397
+ level names, that flag alone does not create a graded selector. vLLM is
398
+ checked lazily through `/server_info?config_format=json`; a configured
399
+ reasoning parser enables its documented `none|low|medium|high` Chat
400
+ Completions contract (`minimal→none`) without inventing Ultra. Ollama models
401
+ are checked through `/api/show`; a generic `thinking` capability establishes
402
+ thinking support but not a model-specific ladder, so UR uses Ollama's native
403
+ on/off control unless the endpoint supplies exact levels.
404
+ If `/effort max` or another graded request is used for such a model, UR
405
+ enables thinking but reports that no graded level was sent.
398
406
  GPT-OSS uses its documented `low|medium|high` values, while any other graded
399
407
  values or Ultra aliases must be explicitly present in provider metadata.
400
408
  The resolved value is sent through Ollama's native `think` field. OpenRouter additionally
package/dist/cli.js CHANGED
@@ -60524,9 +60524,9 @@ function isRecord(value) {
60524
60524
  function parseModelReasoningCapabilities(value) {
60525
60525
  if (!isRecord(value))
60526
60526
  return;
60527
- const rawSupportedEfforts = value.supported_efforts !== undefined ? value.supported_efforts : value.supportedEfforts;
60527
+ const rawSupportedEfforts = value.supported_efforts !== undefined ? value.supported_efforts : value.supportedEfforts ?? value.allowed_options;
60528
60528
  const supportedEfforts = rawSupportedEfforts === null ? null : Array.isArray(rawSupportedEfforts) ? Array.from(new Set(rawSupportedEfforts.filter((entry) => typeof entry === "string").map((entry) => entry.trim().toLowerCase()).filter(Boolean))) : undefined;
60529
- const defaultEffort = asString(value.default_effort !== undefined ? value.default_effort : value.defaultEffort)?.toLowerCase();
60529
+ const defaultEffort = asString(value.default_effort !== undefined ? value.default_effort : value.defaultEffort ?? (rawSupportedEfforts !== undefined ? value.default : undefined))?.toLowerCase();
60530
60530
  const rawAliases = isRecord(value.effort_aliases) ? value.effort_aliases : isRecord(value.effortAliases) ? value.effortAliases : undefined;
60531
60531
  const effortAliases = rawAliases ? Object.fromEntries(Object.entries(rawAliases).flatMap(([selector, wireValue]) => {
60532
60532
  const normalizedSelector = selector.trim().toLowerCase();
@@ -60621,7 +60621,7 @@ function toDiscoveredModel(entry, providerLabel) {
60621
60621
  const humanName = asString(raw.display_name) ?? asString(raw.displayName) ?? asString(raw.name);
60622
60622
  const supportedParameters = Array.isArray(raw.supported_parameters) ? raw.supported_parameters.filter((value) => typeof value === "string") : Array.isArray(raw.supportedGenerationMethods) ? raw.supportedGenerationMethods.filter((value) => typeof value === "string") : undefined;
60623
60623
  const capabilities = isRecord(raw.capabilities) ? raw.capabilities : undefined;
60624
- const parsedReasoning = parseModelReasoningCapabilities(raw.reasoning);
60624
+ const parsedReasoning = parseModelReasoningCapabilities(raw.reasoning) ?? parseModelReasoningCapabilities(capabilities && isRecord(capabilities.reasoning) ? capabilities.reasoning : undefined) ?? parseModelReasoningCapabilities(raw);
60625
60625
  const advertisesReasoning = supportedParameters?.some((parameter) => /^(?:reasoning|reasoning_effort|thinking)$/iu.test(parameter.trim()));
60626
60626
  const reasoning = parsedReasoning ?? (advertisesReasoning ? { supportsThinking: true } : undefined);
60627
60627
  const expirationDate = asEpochSeconds(raw.expiration_date);
@@ -62040,7 +62040,7 @@ function modelDefinitionsFromDiscovered(models, provider) {
62040
62040
  function providerModelCacheKey(provider, settings = getInitialSettings()) {
62041
62041
  const definition = getProviderDefinition(provider);
62042
62042
  let endpoint = providerBaseUrl(provider, definition, settings);
62043
- if (definition.accessType === "api" && definition.modelDiscoveryType === "live") {
62043
+ if (definition.accessType === "api" && definition.modelDiscoveryType === "live" && !definition.endpointKind) {
62044
62044
  endpoint = apiModelsRequest(provider, "", settings).url;
62045
62045
  }
62046
62046
  if (!endpoint)
@@ -62110,12 +62110,58 @@ function providerPropsUrl(baseUrl, model) {
62110
62110
  url3.hash = "";
62111
62111
  url3.search = "";
62112
62112
  let path8 = url3.pathname.replace(/\/+$/, "");
62113
+ path8 = path8.replace(/\/(?:v\d+(?:beta)?|api\/v\d+)\/(?:chat\/completions|models|responses|props)$/i, "");
62113
62114
  path8 = path8.replace(/\/(?:v\d+(?:beta)?|api\/v\d+)$/i, "");
62114
62115
  path8 = path8.replace(/\/(?:chat\/completions|models|props)$/i, "");
62115
62116
  url3.pathname = `${path8}/props`;
62116
62117
  url3.searchParams.set("model", model);
62117
62118
  return url3.toString();
62118
62119
  }
62120
+ function vllmServerInfoUrl(baseUrl) {
62121
+ const url3 = new URL(normalizeBaseUrl(baseUrl));
62122
+ url3.hash = "";
62123
+ url3.search = "";
62124
+ let path8 = url3.pathname.replace(/\/+$/, "");
62125
+ path8 = path8.replace(/\/(?:v\d+(?:beta)?|api\/v\d+)\/(?:chat\/completions|models|responses)$/i, "");
62126
+ path8 = path8.replace(/\/(?:v\d+(?:beta)?|api\/v\d+)$/i, "");
62127
+ path8 = path8.replace(/\/(?:chat\/completions|models|responses)$/i, "");
62128
+ url3.pathname = `${path8}/server_info`;
62129
+ url3.searchParams.set("config_format", "json");
62130
+ return url3.toString();
62131
+ }
62132
+ function vllmServerAdvertisesReasoning(value) {
62133
+ if (!value || typeof value !== "object")
62134
+ return false;
62135
+ const pending = [value];
62136
+ const seen = new Set;
62137
+ while (pending.length > 0) {
62138
+ const current = pending.pop();
62139
+ if (!current || typeof current !== "object" || seen.has(current))
62140
+ continue;
62141
+ seen.add(current);
62142
+ for (const [key, nested] of Object.entries(current)) {
62143
+ const normalizedKey = key.replace(/-/g, "_").toLowerCase();
62144
+ if (normalizedKey === "reasoning_parser" && typeof nested === "string" && nested.trim() && !/^(?:none|null|false)$/i.test(nested.trim())) {
62145
+ return true;
62146
+ }
62147
+ if (normalizedKey === "enable_reasoning" && nested === true) {
62148
+ return true;
62149
+ }
62150
+ if (nested && typeof nested === "object")
62151
+ pending.push(nested);
62152
+ }
62153
+ }
62154
+ return false;
62155
+ }
62156
+ function reasoningCapabilitiesFromVllmServerInfo(value) {
62157
+ if (!vllmServerAdvertisesReasoning(value))
62158
+ return;
62159
+ return {
62160
+ supportsThinking: true,
62161
+ supportedEfforts: ["none", "low", "medium", "high"],
62162
+ effortAliases: { minimal: "none" }
62163
+ };
62164
+ }
62119
62165
  function ollamaShowUrl(baseUrl) {
62120
62166
  const url3 = new URL(endpointUrl(baseUrl, "ollama"));
62121
62167
  url3.pathname = url3.pathname.replace(/\/tags\/?$/i, "/show");
@@ -62164,10 +62210,11 @@ function reasoningCapabilitiesFromProps(value) {
62164
62210
  return explicit;
62165
62211
  const caps = root2.chat_template_caps && typeof root2.chat_template_caps === "object" ? root2.chat_template_caps : undefined;
62166
62212
  if (caps?.supports_reasoning_effort === true) {
62167
- return { supportedEfforts: null };
62213
+ return { supportsThinking: true };
62168
62214
  }
62169
62215
  if (caps?.supports_reasoning_effort === false) {
62170
- return { supportedEfforts: [] };
62216
+ const supportsThinking = caps.supports_reasoning === true || caps.supports_thinking === true || caps.supports_preserve_reasoning === true;
62217
+ return supportsThinking ? { supportsThinking: true, supportedEfforts: [] } : { supportedEfforts: [] };
62171
62218
  }
62172
62219
  return;
62173
62220
  }
@@ -62200,7 +62247,7 @@ async function ensureProviderReasoningCapabilitiesForModel(providerId, model, op
62200
62247
  const cached2 = getProviderReasoningCapabilitiesForModel(model, provider, settings);
62201
62248
  if (cached2 !== undefined)
62202
62249
  return cached2;
62203
- if (provider !== "llama.cpp" && provider !== "ollama") {
62250
+ if (provider !== "llama.cpp" && provider !== "ollama" && provider !== "vllm") {
62204
62251
  await ensureProviderModelsFresh(provider, options);
62205
62252
  return getProviderReasoningCapabilitiesForModel(model, provider, settings);
62206
62253
  }
@@ -62214,7 +62261,8 @@ async function ensureProviderReasoningCapabilitiesForModel(providerId, model, op
62214
62261
  if (!apiKey) {
62215
62262
  apiKey = await storedProviderApiKey(provider, env4, options.adapters);
62216
62263
  }
62217
- const response = await fetchImpl(provider === "ollama" ? ollamaShowUrl(baseUrl) : providerPropsUrl(baseUrl, model), {
62264
+ const capabilityUrl = provider === "ollama" ? ollamaShowUrl(baseUrl) : provider === "vllm" ? vllmServerInfoUrl(baseUrl) : providerPropsUrl(baseUrl, model);
62265
+ const response = await fetchImpl(capabilityUrl, {
62218
62266
  method: provider === "ollama" ? "POST" : "GET",
62219
62267
  signal: options.signal,
62220
62268
  ...provider === "ollama" ? {
@@ -62226,10 +62274,10 @@ async function ensureProviderReasoningCapabilitiesForModel(providerId, model, op
62226
62274
  } : apiKey ? { headers: { Authorization: `Bearer ${apiKey}` } } : {}
62227
62275
  });
62228
62276
  if (!response.ok) {
62229
- throw new Error(`${provider === "ollama" ? "Ollama /api/show" : "llama.cpp /props"} returned HTTP ${response.status}.`);
62277
+ throw new Error(`${provider === "ollama" ? "Ollama /api/show" : provider === "vllm" ? "vLLM /server_info" : "llama.cpp /props"} returned HTTP ${response.status}.`);
62230
62278
  }
62231
62279
  const body = await response.json().catch(() => null);
62232
- const reasoning = provider === "ollama" ? reasoningCapabilitiesFromOllamaShow(model, body) : reasoningCapabilitiesFromProps(body);
62280
+ const reasoning = provider === "ollama" ? reasoningCapabilitiesFromOllamaShow(model, body) : provider === "vllm" ? reasoningCapabilitiesFromVllmServerInfo(body) : reasoningCapabilitiesFromProps(body);
62233
62281
  if (reasoning) {
62234
62282
  rememberProviderModelReasoning(provider, model, reasoning, settings);
62235
62283
  }
@@ -231035,7 +231083,7 @@ var init_metadata = __esm(() => {
231035
231083
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
231036
231084
  WHITESPACE_REGEX2 = /\s+/;
231037
231085
  getVersionBase = memoize_default(() => {
231038
- const match = "1.84.0".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
231086
+ const match = "1.84.1".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
231039
231087
  return match ? match[0] : undefined;
231040
231088
  });
231041
231089
  buildEnvContext = memoize_default(async () => {
@@ -231075,7 +231123,7 @@ var init_metadata = __esm(() => {
231075
231123
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
231076
231124
  isURCodeAction: isEnvTruthy(process.env.UR_CODE_ACTION),
231077
231125
  isURAiAuth: isURAISubscriber(),
231078
- version: "1.84.0",
231126
+ version: "1.84.1",
231079
231127
  versionBase: getVersionBase(),
231080
231128
  buildTime: "",
231081
231129
  deploymentEnvironment: env2.detectDeploymentEnvironment(),
@@ -238514,7 +238562,7 @@ function getAttributionHeader(fingerprint) {
238514
238562
  if (!isAttributionHeaderEnabled()) {
238515
238563
  return "";
238516
238564
  }
238517
- const version2 = `${"1.84.0"}.${fingerprint}`;
238565
+ const version2 = `${"1.84.1"}.${fingerprint}`;
238518
238566
  const entrypoint = process.env.UR_CODE_ENTRYPOINT ?? "unknown";
238519
238567
  const cch = "";
238520
238568
  const workload = getWorkload();
@@ -261861,10 +261909,11 @@ function toOpenAICompatibleRequest(params, providerName = "openai-compatible") {
261861
261909
  const reasoningEffort = toOpenAIReasoningEffort(params, providerName);
261862
261910
  const openRouterWireEffort = providerName === "openrouter" && reasoningEffort ? toOpenRouterReasoningEffort(String(params.model ?? ""), reasoningEffort) : undefined;
261863
261911
  const openRouterReasoning = providerName === "openrouter" ? toOpenRouterReasoning(params, openRouterWireEffort) : undefined;
261864
- const compatibleReasoningEffort = reasoningEffort === "ultra" ? (() => {
261912
+ const compatibleReasoningEffort = reasoningEffort && providerName !== "openrouter" ? (() => {
261865
261913
  const provider = resolveProviderId(providerName);
261866
- return provider ? getProviderEffortWireValue(String(params.model ?? ""), reasoningEffort, provider) : undefined;
261867
- })() : reasoningEffort;
261914
+ const advertisedWireValue = provider ? getProviderEffortWireValue(String(params.model ?? ""), reasoningEffort, provider) : undefined;
261915
+ return advertisedWireValue ?? (reasoningEffort === "ultra" ? undefined : reasoningEffort);
261916
+ })() : undefined;
261868
261917
  const openRouterServerSearch = providerName === "openrouter" && tools.some((tool) => tool?.type === "openrouter:web_search");
261869
261918
  const toolChoice = openRouterServerSearch ? undefined : mapOpenAIToolChoice(params.tool_choice);
261870
261919
  const openRouterProviderPreferences = providerName === "openrouter" ? openRouterRoutingPreferences(params) : undefined;
@@ -304518,7 +304567,7 @@ function getTelemetryAttributes() {
304518
304567
  attributes["session.id"] = sessionId;
304519
304568
  }
304520
304569
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
304521
- attributes["app.version"] = "1.84.0";
304570
+ attributes["app.version"] = "1.84.1";
304522
304571
  }
304523
304572
  const oauthAccount = getOauthAccountInfo();
304524
304573
  if (oauthAccount) {
@@ -307549,7 +307598,7 @@ var require_src3 = __commonJS((exports) => {
307549
307598
  function getInstruments() {
307550
307599
  if (instruments)
307551
307600
  return instruments;
307552
- const meter = import_api2.metrics.getMeter("ur-agent.gen_ai", "1.84.0");
307601
+ const meter = import_api2.metrics.getMeter("ur-agent.gen_ai", "1.84.1");
307553
307602
  instruments = {
307554
307603
  operationDuration: meter.createHistogram("gen_ai.client.operation.duration", {
307555
307604
  description: "GenAI operation duration.",
@@ -307647,7 +307696,7 @@ function genAiAgentAttributes() {
307647
307696
  "gen_ai.operation.name": GEN_AI_OPERATION_INVOKE_AGENT,
307648
307697
  "gen_ai.provider.name": "ur",
307649
307698
  "gen_ai.agent.name": "UR-Nexus",
307650
- "gen_ai.agent.version": "1.84.0"
307699
+ "gen_ai.agent.version": "1.84.1"
307651
307700
  };
307652
307701
  }
307653
307702
  function genAiWorkflowAttributes(workflowName, workflowRunId) {
@@ -307668,7 +307717,7 @@ function genAiWorkflowAttributes(workflowName, workflowRunId) {
307668
307717
  function startGenAiWorkflowSpan(workflowName, workflowRunId) {
307669
307718
  const attributes = genAiWorkflowAttributes(workflowName, workflowRunId);
307670
307719
  const name = typeof attributes["gen_ai.workflow.name"] === "string" ? `invoke_workflow ${attributes["gen_ai.workflow.name"]}` : GEN_AI_OPERATION_INVOKE_WORKFLOW;
307671
- return import_api2.trace.getTracer("ur-agent.gen_ai", "1.84.0").startSpan(name, { kind: import_api2.SpanKind.INTERNAL, attributes });
307720
+ return import_api2.trace.getTracer("ur-agent.gen_ai", "1.84.1").startSpan(name, { kind: import_api2.SpanKind.INTERNAL, attributes });
307672
307721
  }
307673
307722
  function endGenAiWorkflowSpan(span, options2 = {}) {
307674
307723
  try {
@@ -307706,7 +307755,7 @@ function startGenAiMemorySpan(operation, options2 = {}) {
307706
307755
  if (options2.recordCount !== undefined && Number.isInteger(options2.recordCount) && options2.recordCount >= 0) {
307707
307756
  attributes["gen_ai.memory.record.count"] = options2.recordCount;
307708
307757
  }
307709
- return import_api2.trace.getTracer("ur-agent.gen_ai", "1.84.0").startSpan(operation, { kind: import_api2.SpanKind.INTERNAL, attributes });
307758
+ return import_api2.trace.getTracer("ur-agent.gen_ai", "1.84.1").startSpan(operation, { kind: import_api2.SpanKind.INTERNAL, attributes });
307710
307759
  }
307711
307760
  function endGenAiMemorySpan(span, options2 = {}) {
307712
307761
  try {
@@ -322113,7 +322162,7 @@ async function createRuntime() {
322113
322162
  bootstrapTelemetry();
322114
322163
  const resource = defaultResource().merge(detectResources({ detectors: [envDetector] })).merge(resourceFromAttributes({
322115
322164
  [import_semantic_conventions6.ATTR_SERVICE_NAME]: "ur-agent",
322116
- [import_semantic_conventions6.ATTR_SERVICE_VERSION]: "1.84.0"
322165
+ [import_semantic_conventions6.ATTR_SERVICE_VERSION]: "1.84.1"
322117
322166
  }));
322118
322167
  const tracerProvider = exporters.traces.length > 0 ? new BasicTracerProvider({
322119
322168
  resource,
@@ -322146,11 +322195,11 @@ async function createRuntime() {
322146
322195
  setMeterProvider(meterProvider);
322147
322196
  setLoggerProvider(loggerProvider);
322148
322197
  if (meterProvider) {
322149
- const meter = meterProvider.getMeter("ur-agent", "1.84.0");
322198
+ const meter = meterProvider.getMeter("ur-agent", "1.84.1");
322150
322199
  setMeter(meter, (name, options2) => meter.createCounter(name, options2));
322151
322200
  }
322152
322201
  if (loggerProvider) {
322153
- setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.84.0"));
322202
+ setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.84.1"));
322154
322203
  }
322155
322204
  if (!cleanupRegistered4) {
322156
322205
  cleanupRegistered4 = true;
@@ -322699,7 +322748,7 @@ function isAnyTracingEnabled() {
322699
322748
  return isTelemetryEnabled() || isEnhancedTelemetryEnabled() || isBetaTracingEnabled();
322700
322749
  }
322701
322750
  function getTracer() {
322702
- return import_api32.trace.getTracer("ur-agent.gen_ai", "1.84.0");
322751
+ return import_api32.trace.getTracer("ur-agent.gen_ai", "1.84.1");
322703
322752
  }
322704
322753
  function createSpanAttributes(spanType, customAttributes = {}) {
322705
322754
  const baseAttributes = getTelemetryAttributes();
@@ -334650,7 +334699,7 @@ function computeFingerprint(messageText2, version2) {
334650
334699
  }
334651
334700
  function computeFingerprintFromMessages(messages) {
334652
334701
  const firstMessageText = extractFirstMessageText(messages);
334653
- return computeFingerprint(firstMessageText, "1.84.0");
334702
+ return computeFingerprint(firstMessageText, "1.84.1");
334654
334703
  }
334655
334704
  var FINGERPRINT_SALT = "59cf53e54c78";
334656
334705
  var init_fingerprint = () => {};
@@ -334692,7 +334741,7 @@ async function sideQuery(opts) {
334692
334741
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
334693
334742
  }
334694
334743
  const messageText2 = extractFirstUserMessageText(messages);
334695
- const fingerprint = computeFingerprint(messageText2, "1.84.0");
334744
+ const fingerprint = computeFingerprint(messageText2, "1.84.1");
334696
334745
  const attributionHeader = getAttributionHeader(fingerprint);
334697
334746
  const systemBlocks = [
334698
334747
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -336799,7 +336848,7 @@ var init_user = __esm(() => {
336799
336848
  deviceId,
336800
336849
  sessionId: getSessionId(),
336801
336850
  email: getEmail(),
336802
- appVersion: "1.84.0",
336851
+ appVersion: "1.84.1",
336803
336852
  platform: getHostPlatformForAnalytics(),
336804
336853
  organizationUuid,
336805
336854
  accountUuid,
@@ -337559,7 +337608,7 @@ var init_growthbook_experiment_event = __esm(() => {
337559
337608
 
337560
337609
  // src/utils/userAgent.ts
337561
337610
  function getURCodeUserAgent() {
337562
- return `ur/${"1.84.0"}`;
337611
+ return `ur/${"1.84.1"}`;
337563
337612
  }
337564
337613
 
337565
337614
  // src/services/analytics/firstPartyEventLoggingExporter.ts
@@ -338215,7 +338264,7 @@ function initialize1PEventLogging() {
338215
338264
  const platform4 = getPlatform();
338216
338265
  const attributes = {
338217
338266
  [import_semantic_conventions7.ATTR_SERVICE_NAME]: "ur",
338218
- [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.84.0"
338267
+ [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.84.1"
338219
338268
  };
338220
338269
  if (platform4 === "wsl") {
338221
338270
  const wslVersion = getWslVersion();
@@ -338243,7 +338292,7 @@ function initialize1PEventLogging() {
338243
338292
  })
338244
338293
  ]
338245
338294
  });
338246
- firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.84.0");
338295
+ firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.84.1");
338247
338296
  }
338248
338297
  async function reinitialize1PEventLoggingIfConfigChanged() {
338249
338298
  if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
@@ -341544,9 +341593,9 @@ async function assertMinVersion() {
341544
341593
  if (false) {}
341545
341594
  try {
341546
341595
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
341547
- if (versionConfig.minVersion && lt("1.84.0", versionConfig.minVersion)) {
341596
+ if (versionConfig.minVersion && lt("1.84.1", versionConfig.minVersion)) {
341548
341597
  console.error(`
341549
- It looks like your version of UR (${"1.84.0"}) needs an update.
341598
+ It looks like your version of UR (${"1.84.1"}) needs an update.
341550
341599
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
341551
341600
 
341552
341601
  To update, please run:
@@ -341762,7 +341811,7 @@ async function installGlobalPackage(specificVersion) {
341762
341811
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
341763
341812
  logEvent("tengu_auto_updater_lock_contention", {
341764
341813
  pid: process.pid,
341765
- currentVersion: "1.84.0"
341814
+ currentVersion: "1.84.1"
341766
341815
  });
341767
341816
  return "in_progress";
341768
341817
  }
@@ -341771,7 +341820,7 @@ async function installGlobalPackage(specificVersion) {
341771
341820
  if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
341772
341821
  logError2(new Error("Windows NPM detected in WSL environment"));
341773
341822
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
341774
- currentVersion: "1.84.0"
341823
+ currentVersion: "1.84.1"
341775
341824
  });
341776
341825
  console.error(`
341777
341826
  Error: Windows NPM detected in WSL
@@ -342306,7 +342355,7 @@ function detectLinuxGlobPatternWarnings() {
342306
342355
  }
342307
342356
  async function getDoctorDiagnostic() {
342308
342357
  const installationType = await getCurrentInstallationType();
342309
- const version2 = typeof MACRO !== "undefined" ? "1.84.0" : "unknown";
342358
+ const version2 = typeof MACRO !== "undefined" ? "1.84.1" : "unknown";
342310
342359
  const installationPath = await getInstallationPath();
342311
342360
  const invokedBinary = getInvokedBinary();
342312
342361
  const multipleInstallations = await detectMultipleInstallations();
@@ -343373,7 +343422,7 @@ function getInstallationEnv() {
343373
343422
  return;
343374
343423
  }
343375
343424
  function getURCodeVersion() {
343376
- return "1.84.0";
343425
+ return "1.84.1";
343377
343426
  }
343378
343427
  async function getInstalledVSCodeExtensionVersion(command) {
343379
343428
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -344854,8 +344903,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
344854
344903
  const maxVersion = await getMaxVersion();
344855
344904
  if (maxVersion && gt(version2, maxVersion)) {
344856
344905
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
344857
- if (gte("1.84.0", maxVersion)) {
344858
- logForDebugging(`Native installer: current version ${"1.84.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
344906
+ if (gte("1.84.1", maxVersion)) {
344907
+ logForDebugging(`Native installer: current version ${"1.84.1"} is already at or above maxVersion ${maxVersion}, skipping update`);
344859
344908
  logEvent("tengu_native_update_skipped_max_version", {
344860
344909
  latency_ms: Date.now() - startTime,
344861
344910
  max_version: maxVersion,
@@ -344866,7 +344915,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
344866
344915
  version2 = maxVersion;
344867
344916
  }
344868
344917
  }
344869
- if (!forceReinstall && version2 === "1.84.0" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
344918
+ if (!forceReinstall && version2 === "1.84.1" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
344870
344919
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
344871
344920
  logEvent("tengu_native_update_complete", {
344872
344921
  latency_ms: Date.now() - startTime,
@@ -438621,7 +438670,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
438621
438670
  const client = new Client({
438622
438671
  name: "ur",
438623
438672
  title: "UR",
438624
- version: "1.84.0",
438673
+ version: "1.84.1",
438625
438674
  description: "UR-Nexus autonomous engineering workflow engine",
438626
438675
  websiteUrl: PRODUCT_URL
438627
438676
  }, {
@@ -438978,7 +439027,7 @@ var init_client2 = __esm(() => {
438978
439027
  const client = new Client({
438979
439028
  name: "ur",
438980
439029
  title: "UR",
438981
- version: "1.84.0",
439030
+ version: "1.84.1",
438982
439031
  description: "UR-Nexus autonomous engineering workflow engine",
438983
439032
  websiteUrl: PRODUCT_URL
438984
439033
  }, {
@@ -449849,7 +449898,7 @@ function Feedback({
449849
449898
  platform: env2.platform,
449850
449899
  gitRepo: envInfo.isGit,
449851
449900
  terminal: env2.terminal,
449852
- version: "1.84.0",
449901
+ version: "1.84.1",
449853
449902
  transcript: normalizeMessagesForAPI(messages),
449854
449903
  errors: sanitizedErrors,
449855
449904
  lastApiRequest: getLastAPIRequest(),
@@ -450039,7 +450088,7 @@ function Feedback({
450039
450088
  ", ",
450040
450089
  env2.terminal,
450041
450090
  ", v",
450042
- "1.84.0"
450091
+ "1.84.1"
450043
450092
  ]
450044
450093
  }, undefined, true, undefined, this)
450045
450094
  ]
@@ -450145,7 +450194,7 @@ ${sanitizedDescription}
450145
450194
  ` + `**Environment Info**
450146
450195
  ` + `- Platform: ${env2.platform}
450147
450196
  ` + `- Terminal: ${env2.terminal}
450148
- ` + `- Version: ${"1.84.0"}
450197
+ ` + `- Version: ${"1.84.1"}
450149
450198
  ` + `- Feedback ID: ${feedbackId}
450150
450199
  ` + `
450151
450200
  **Errors**
@@ -453255,7 +453304,7 @@ function buildPrimarySection() {
453255
453304
  }, undefined, false, undefined, this);
453256
453305
  return [{
453257
453306
  label: "Version",
453258
- value: "1.84.0"
453307
+ value: "1.84.1"
453259
453308
  }, {
453260
453309
  label: "Session name",
453261
453310
  value: nameValue
@@ -454219,7 +454268,8 @@ function ModelPicker({
454219
454268
  const focusedEffortLevels = focusedModel ? getSupportedEffortLevelsForModel(focusedModel, currentProvider) : [];
454220
454269
  const focusedEffortLevelLabels = focusedModel ? getSupportedEffortLevelLabelsForModel(focusedModel, currentProvider) : [];
454221
454270
  const focusedSupportsEffort = focusedModel ? modelSupportsEffort(focusedModel, currentProvider) : false;
454222
- const focusedSupportsThinking = focusedModel ? modelSupportsThinking(focusedModel, currentProvider) && providerSupportsThinkingToggle(currentProvider) : false;
454271
+ const focusedAdvertisesThinking = focusedModel ? modelSupportsThinking(focusedModel, currentProvider) : false;
454272
+ const focusedSupportsThinking = focusedModel ? focusedAdvertisesThinking && providerSupportsThinkingToggle(currentProvider) : false;
454223
454273
  const focusedDefaultEffort = getDefaultEffortLevelForOption(focusedValue, currentProvider);
454224
454274
  const displayEffort = focusedModel ? resolveProviderEffortLevel(focusedModel, effort ?? focusedDefaultEffort, currentProvider) ?? focusedDefaultEffort : focusedDefaultEffort;
454225
454275
  const handleFocus = (value) => {
@@ -454471,7 +454521,7 @@ function ModelPicker({
454471
454521
  effort: undefined
454472
454522
  }, undefined, false, undefined, this),
454473
454523
  " ",
454474
- focusedSupportsThinking ? "No graded effort \xB7 provider offers on/off thinking" : "Effort not supported",
454524
+ focusedSupportsThinking ? "Thinking supported \xB7 no model-specific graded ladder advertised \xB7 using provider-native on/off" : focusedAdvertisesThinking ? "Thinking supported \xB7 this runtime advertises no controllable graded ladder or on/off mapping" : "Effort not supported",
454475
454525
  focusedModelName ? ` for ${focusedModelName}` : "",
454476
454526
  effortCapabilityLoading ? " \xB7 checking provider\u2026" : ""
454477
454527
  ]
@@ -454556,7 +454606,7 @@ function getAdaptiveModelVisibleCount(optionCount, terminalRows) {
454556
454606
  return Math.min(Math.floor(optionCount), availableRows);
454557
454607
  }
454558
454608
  function providerNeedsFocusedEffortProbe(provider, focusedModel) {
454559
- return (provider === "llama.cpp" || provider === "ollama") && Boolean(focusedModel);
454609
+ return (provider === "llama.cpp" || provider === "ollama" || provider === "vllm") && Boolean(focusedModel);
454560
454610
  }
454561
454611
  function resolveOptionModel(value) {
454562
454612
  if (!value)
@@ -456768,7 +456818,7 @@ function Config({
456768
456818
  }
456769
456819
  }, undefined, false, undefined, this)
456770
456820
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime176.jsxDEV(ChannelDowngradeDialog, {
456771
- currentVersion: "1.84.0",
456821
+ currentVersion: "1.84.1",
456772
456822
  onChoice: (choice) => {
456773
456823
  setShowSubmenu(null);
456774
456824
  setTabsHidden(false);
@@ -456780,7 +456830,7 @@ function Config({
456780
456830
  autoUpdatesChannel: "stable"
456781
456831
  };
456782
456832
  if (choice === "stay") {
456783
- newSettings.minimumVersion = "1.84.0";
456833
+ newSettings.minimumVersion = "1.84.1";
456784
456834
  }
456785
456835
  updateSettingsForSource("userSettings", newSettings);
456786
456836
  setSettingsData((prev_27) => ({
@@ -465097,7 +465147,7 @@ function HelpV2(t0) {
465097
465147
  let t6;
465098
465148
  if ($2[31] !== tabs) {
465099
465149
  t6 = /* @__PURE__ */ jsx_dev_runtime203.jsxDEV(Tabs, {
465100
- title: `UR v${"1.84.0"}`,
465150
+ title: `UR v${"1.84.1"}`,
465101
465151
  color: "professionalBlue",
465102
465152
  defaultTab: "general",
465103
465153
  children: tabs
@@ -466031,7 +466081,7 @@ function buildToolUseContext(tools, readFileStateCache, toolPermissionContext, a
466031
466081
  async function handleInitialize(options2) {
466032
466082
  return {
466033
466083
  name: "UR",
466034
- version: "1.84.0",
466084
+ version: "1.84.1",
466035
466085
  protocolVersion: "0.1.0",
466036
466086
  workspaceRoot: options2.cwd,
466037
466087
  capabilities: {
@@ -483164,7 +483214,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
483164
483214
  return [];
483165
483215
  }
483166
483216
  }
483167
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.84.0") {
483217
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.84.1") {
483168
483218
  if (process.env.USER_TYPE === "ant") {
483169
483219
  const changelog = "";
483170
483220
  if (changelog) {
@@ -483191,7 +483241,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.84.0")
483191
483241
  releaseNotes
483192
483242
  };
483193
483243
  }
483194
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.84.0") {
483244
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.84.1") {
483195
483245
  if (process.env.USER_TYPE === "ant") {
483196
483246
  const changelog = "";
483197
483247
  if (changelog) {
@@ -486099,7 +486149,7 @@ function getRecentActivitySync() {
486099
486149
  return cachedActivity;
486100
486150
  }
486101
486151
  function getLogoDisplayData() {
486102
- const version2 = process.env.DEMO_VERSION ?? "1.84.0";
486152
+ const version2 = process.env.DEMO_VERSION ?? "1.84.1";
486103
486153
  const serverUrl = getDirectConnectServerUrl();
486104
486154
  const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd());
486105
486155
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -486987,7 +487037,7 @@ function LogoV2() {
486987
487037
  if ($2[2] === Symbol.for("react.memo_cache_sentinel")) {
486988
487038
  t2 = () => {
486989
487039
  const currentConfig = getGlobalConfig();
486990
- if (currentConfig.lastReleaseNotesSeen === "1.84.0") {
487040
+ if (currentConfig.lastReleaseNotesSeen === "1.84.1") {
486991
487041
  return;
486992
487042
  }
486993
487043
  saveGlobalConfig(_temp327);
@@ -487675,12 +487725,12 @@ function LogoV2() {
487675
487725
  return t41;
487676
487726
  }
487677
487727
  function _temp327(current) {
487678
- if (current.lastReleaseNotesSeen === "1.84.0") {
487728
+ if (current.lastReleaseNotesSeen === "1.84.1") {
487679
487729
  return current;
487680
487730
  }
487681
487731
  return {
487682
487732
  ...current,
487683
- lastReleaseNotesSeen: "1.84.0"
487733
+ lastReleaseNotesSeen: "1.84.1"
487684
487734
  };
487685
487735
  }
487686
487736
  function _temp240(s_0) {
@@ -503773,7 +503823,7 @@ function compileAgenticCiWorkflow(specName = "default", options2 = {}) {
503773
503823
  if (spec.name !== specName) {
503774
503824
  throw new Error("Agentic CI workflow spec name does not match");
503775
503825
  }
503776
- const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.84.0" : "1.84.0");
503826
+ const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.84.1" : "1.84.1");
503777
503827
  if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(packageVersion)) {
503778
503828
  throw new Error("invalid ur-agent package version");
503779
503829
  }
@@ -504769,7 +504819,7 @@ runner; \`ur trigger\` is the inbound parser that decides what to run.
504769
504819
  path: ".github/workflows/ur.yml",
504770
504820
  root: "project",
504771
504821
  content: compileAgenticCiWorkflow("default", {
504772
- packageVersion: typeof MACRO !== "undefined" ? "1.84.0" : "1.84.0"
504822
+ packageVersion: typeof MACRO !== "undefined" ? "1.84.1" : "1.84.1"
504773
504823
  })
504774
504824
  },
504775
504825
  {
@@ -504832,7 +504882,7 @@ function value(tokens, flag) {
504832
504882
  return index2 >= 0 ? tokens[index2 + 1] : undefined;
504833
504883
  }
504834
504884
  function cliVersion() {
504835
- return typeof MACRO !== "undefined" ? "1.84.0" : "1.84.0";
504885
+ return typeof MACRO !== "undefined" ? "1.84.1" : "1.84.1";
504836
504886
  }
504837
504887
  function workflowPath(cwd2) {
504838
504888
  return join156(cwd2, ".github", "workflows", "ur-agentic-ci.yml");
@@ -505741,7 +505791,7 @@ function formatA2AV1AgentCard(options2 = {}, pretty = true) {
505741
505791
  var urVersion, researchSnapshotDate = "2026-08-10", coverage2, priorityRoadmap;
505742
505792
  var init_trends = __esm(() => {
505743
505793
  init_a2aCardSignature();
505744
- urVersion = typeof MACRO !== "undefined" ? "1.84.0" : "1.84.0";
505794
+ urVersion = typeof MACRO !== "undefined" ? "1.84.1" : "1.84.1";
505745
505795
  coverage2 = [
505746
505796
  {
505747
505797
  id: "local-runtime",
@@ -511474,7 +511524,7 @@ function createAcpStdioApp(deps) {
511474
511524
  }
511475
511525
  },
511476
511526
  authMethods: [],
511477
- agentInfo: { name: "UR-Nexus", version: "1.84.0" }
511527
+ agentInfo: { name: "UR-Nexus", version: "1.84.1" }
511478
511528
  })).onRequest("authenticate", () => ({})).onRequest("session/new", async (context6) => {
511479
511529
  const result = runtime2.newSession(context6.params.cwd, context6.params.mcpServers, context6.params.additionalDirectories);
511480
511530
  await runtime2.announce({
@@ -511571,7 +511621,7 @@ function createAcpStdioAgent(deps) {
511571
511621
  }
511572
511622
  },
511573
511623
  authMethods: [],
511574
- agentInfo: { name: "UR-Nexus", version: "1.84.0" }
511624
+ agentInfo: { name: "UR-Nexus", version: "1.84.1" }
511575
511625
  });
511576
511626
  return;
511577
511627
  case "authenticate":
@@ -725574,7 +725624,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
725574
725624
  smapsRollup,
725575
725625
  platform: process.platform,
725576
725626
  nodeVersion: process.version,
725577
- ccVersion: "1.84.0"
725627
+ ccVersion: "1.84.1"
725578
725628
  };
725579
725629
  }
725580
725630
  async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
@@ -726163,7 +726213,7 @@ var init_bridge_kick = __esm(() => {
726163
726213
  var call153 = async () => {
726164
726214
  return {
726165
726215
  type: "text",
726166
- value: "1.84.0"
726216
+ value: "1.84.1"
726167
726217
  };
726168
726218
  }, version2, version_default;
726169
726219
  var init_version = __esm(() => {
@@ -729269,7 +729319,7 @@ function ProviderFirstModelPicker({
729269
729319
  }, [selectedProvider, modelReloadToken]);
729270
729320
  import_react183.useEffect(() => {
729271
729321
  const capabilityProvider = selectedProvider?.value;
729272
- if (capabilityProvider !== "llama.cpp" && capabilityProvider !== "ollama" || !focusedModelValue) {
729322
+ if (capabilityProvider !== "llama.cpp" && capabilityProvider !== "ollama" && capabilityProvider !== "vllm" || !focusedModelValue) {
729273
729323
  setEffortCapabilityLoading(false);
729274
729324
  setEffortCapabilityWarning(null);
729275
729325
  return;
@@ -729350,7 +729400,8 @@ function ProviderFirstModelPicker({
729350
729400
  const focusedEffortLevels = focusedResolvedModel && focusedProviderId ? getSupportedEffortLevelsForModel(focusedResolvedModel, focusedProviderId) : [];
729351
729401
  const focusedEffortLevelLabels = focusedResolvedModel && focusedProviderId ? getSupportedEffortLevelLabelsForModel(focusedResolvedModel, focusedProviderId) : [];
729352
729402
  const focusedSupportsEffort = focusedResolvedModel ? modelSupportsEffort(focusedResolvedModel, focusedProviderId) : false;
729353
- const focusedSupportsThinking = focusedResolvedModel && focusedProviderId ? modelSupportsThinking(focusedResolvedModel, focusedProviderId) && providerSupportsThinkingToggle(focusedProviderId) : false;
729403
+ const focusedAdvertisesThinking = focusedResolvedModel && focusedProviderId ? modelSupportsThinking(focusedResolvedModel, focusedProviderId) : false;
729404
+ const focusedSupportsThinking = focusedResolvedModel && focusedProviderId ? focusedAdvertisesThinking && providerSupportsThinkingToggle(focusedProviderId) : false;
729354
729405
  const focusedDefaultEffort = focusedResolvedModel ? convertEffortValueToLevel(getDefaultEffortForModel(focusedResolvedModel, focusedProviderId) ?? (focusedEffortLevels.includes("high") ? "high" : focusedEffortLevels.at(-1)) ?? "high") : "high";
729355
729406
  const displayedEffort = focusedResolvedModel ? resolveProviderEffortLevel(focusedResolvedModel, effort ?? focusedDefaultEffort, focusedProviderId) ?? focusedDefaultEffort : focusedDefaultEffort;
729356
729407
  function handleProviderFocus(value2) {
@@ -730101,7 +730152,7 @@ function ProviderFirstModelPicker({
730101
730152
  !focusedSupportsEffort && !effortCapabilityLoading && /* @__PURE__ */ jsx_dev_runtime333.jsxDEV(ThemedText, {
730102
730153
  dimColor: true,
730103
730154
  color: "subtle",
730104
- children: focusedSupportsThinking ? "No graded effort advertised; this model accepts on/off thinking." : "Graded effort not advertised for this model."
730155
+ children: focusedSupportsThinking ? "Thinking supported; no model-specific graded ladder advertised. Using provider-native on/off control." : focusedAdvertisesThinking ? "Thinking supported; this runtime advertises no controllable graded ladder or on/off mapping." : "Graded effort not advertised for this model."
730105
730156
  }, undefined, false, undefined, this),
730106
730157
  focusedSupportsThinking && /* @__PURE__ */ jsx_dev_runtime333.jsxDEV(ThemedText, {
730107
730158
  dimColor: true,
@@ -732264,7 +732315,7 @@ function setEffortValue(effortValue, model, provider = getRuntimeProvider()) {
732264
732315
  effort: effortValue
732265
732316
  });
732266
732317
  return {
732267
- message: `Requested ${effortValue} was not sent: ${model} on ${provider} accepts thinking on/off, not graded effort. Thinking is now ON. Use /thinking off to disable it or /thinking status to inspect it.`,
732318
+ message: `Requested ${effortValue} was not sent: ${model} on ${provider} advertises thinking but no model-specific graded ladder. UR used the provider-native on/off control and thinking is now ON. Use /thinking off to disable it or /thinking status to inspect it.`,
732268
732319
  thinkingUpdate: {
732269
732320
  value: true
732270
732321
  }
@@ -732341,7 +732392,7 @@ function showCurrentEffort(appStateEffort, model, provider = getRuntimeProvider(
732341
732392
  if (!modelSupportsEffort(model, provider)) {
732342
732393
  if (modelSupportsThinking(model, provider) && providerSupportsThinkingToggle(provider)) {
732343
732394
  return {
732344
- message: `Effort: graded levels unavailable \u2014 ${model} on ${provider} accepts thinking on/off only. Thinking is ${thinkingEnabled === false ? "OFF" : "ON"}; use /thinking on|off to change it.`
732395
+ message: `Effort: no model-specific graded ladder advertised for ${model} on ${provider}. UR is using the provider-native on/off control; thinking is ${thinkingEnabled === false ? "OFF" : "ON"}. Use /thinking on|off to change it.`
732345
732396
  };
732346
732397
  }
732347
732398
  if (modelSupportsThinking(model, provider)) {
@@ -732367,7 +732418,7 @@ function showCurrentEffort(appStateEffort, model, provider = getRuntimeProvider(
732367
732418
  if (!modelSupportsEffort(model, provider)) {
732368
732419
  if (modelSupportsThinking(model, provider) && providerSupportsThinkingToggle(provider)) {
732369
732420
  return {
732370
- message: `Requested effort: ${effectiveValue}; not sent \u2014 ${model} on ${provider} accepts thinking on/off only. Thinking is ${thinkingEnabled === false ? "OFF" : "ON"}; use /thinking on|off to change it.`
732421
+ message: `Requested effort: ${effectiveValue}; not sent \u2014 ${model} on ${provider} advertises thinking but no model-specific graded ladder. UR is using the provider-native on/off control; thinking is ${thinkingEnabled === false ? "OFF" : "ON"}. Use /thinking on|off to change it.`
732371
732422
  };
732372
732423
  }
732373
732424
  if (modelSupportsThinking(model, provider)) {
@@ -732557,7 +732608,7 @@ function capabilityMessage(enabled, model, provider) {
732557
732608
  return `${model} advertises thinking, but the ${provider} runtime has no provider-native on/off mapping. ${modelSupportsEffort(model, provider) ? "Use /effort for its advertised graded control." : "UR will not invent a boolean wire field."}`;
732558
732609
  }
732559
732610
  if (!modelSupportsEffort(model, provider)) {
732560
- return `${model} on ${provider} accepts thinking on/off only; no graded effort is sent.`;
732611
+ return `${model} on ${provider} advertises thinking but no model-specific graded ladder. UR uses the provider-native on/off control and sends no graded effort.`;
732561
732612
  }
732562
732613
  return enabled ? `${model} on ${provider} also advertises graded effort; use /effort status to inspect its independently selected level.` : `${model} on ${provider} also advertises graded effort, which remains independently controlled by /effort.`;
732563
732614
  }
@@ -738037,7 +738088,7 @@ function generateHtmlReport(data, insights) {
738037
738088
  </html>`;
738038
738089
  }
738039
738090
  function buildExportData(data, insights, facets, remoteStats) {
738040
- const version3 = typeof MACRO !== "undefined" ? "1.84.0" : "unknown";
738091
+ const version3 = typeof MACRO !== "undefined" ? "1.84.1" : "unknown";
738041
738092
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
738042
738093
  const facets_summary = {
738043
738094
  total: facets.size,
@@ -742352,7 +742403,7 @@ var init_sessionStorage = __esm(() => {
742352
742403
  init_settings2();
742353
742404
  init_slowOperations();
742354
742405
  init_uuid();
742355
- VERSION7 = typeof MACRO !== "undefined" ? "1.84.0" : "unknown";
742406
+ VERSION7 = typeof MACRO !== "undefined" ? "1.84.1" : "unknown";
742356
742407
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
742357
742408
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
742358
742409
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -743567,7 +743618,7 @@ var init_filesystem = __esm(() => {
743567
743618
  });
743568
743619
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
743569
743620
  const nonce = randomBytes23(16).toString("hex");
743570
- return join234(getURTempDir(), "bundled-skills", "1.84.0", nonce);
743621
+ return join234(getURTempDir(), "bundled-skills", "1.84.1", nonce);
743571
743622
  });
743572
743623
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
743573
743624
  });
@@ -775358,7 +775409,7 @@ function getUserAgent() {
775358
775409
  const clientApp = process.env.UR_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}` : "";
775359
775410
  const workload = getWorkload();
775360
775411
  const workloadSuffix = workload ? `, workload/${workload}` : "";
775361
- return `ur-cli/${"1.84.0"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
775412
+ return `ur-cli/${"1.84.1"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
775362
775413
  }
775363
775414
  function getMCPUserAgent() {
775364
775415
  const parts = [];
@@ -775372,7 +775423,7 @@ function getMCPUserAgent() {
775372
775423
  parts.push(`client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}`);
775373
775424
  }
775374
775425
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
775375
- return `ur/${"1.84.0"}${suffix}`;
775426
+ return `ur/${"1.84.1"}${suffix}`;
775376
775427
  }
775377
775428
  function getWebFetchUserAgent() {
775378
775429
  return `UR-User (${getURCodeUserAgent()})`;
@@ -792535,7 +792586,7 @@ function buildSystemInitMessage(inputs) {
792535
792586
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
792536
792587
  apiKeySource: getURHQApiKeyWithSource().source,
792537
792588
  betas: getSdkBetas(),
792538
- ur_version: "1.84.0",
792589
+ ur_version: "1.84.1",
792539
792590
  output_style: outputStyle,
792540
792591
  agents: inputs.agents.map((agent2) => agent2.agentType),
792541
792592
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
@@ -796076,7 +796127,7 @@ var init_useVoiceEnabled = __esm(() => {
796076
796127
  function getSemverPart(version3) {
796077
796128
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
796078
796129
  }
796079
- function useUpdateNotification(updatedVersion, initialVersion = "1.84.0") {
796130
+ function useUpdateNotification(updatedVersion, initialVersion = "1.84.1") {
796080
796131
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react225.useState(() => getSemverPart(initialVersion));
796081
796132
  if (!updatedVersion) {
796082
796133
  return null;
@@ -796125,7 +796176,7 @@ function AutoUpdater({
796125
796176
  return;
796126
796177
  }
796127
796178
  if (false) {}
796128
- const currentVersion = "1.84.0";
796179
+ const currentVersion = "1.84.1";
796129
796180
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
796130
796181
  let latestVersion = await getLatestVersion(channel);
796131
796182
  const isDisabled = isAutoUpdaterDisabled();
@@ -796354,12 +796405,12 @@ function NativeAutoUpdater({
796354
796405
  logEvent("tengu_native_auto_updater_start", {});
796355
796406
  try {
796356
796407
  const maxVersion = await getMaxVersion();
796357
- if (maxVersion && gt("1.84.0", maxVersion)) {
796408
+ if (maxVersion && gt("1.84.1", maxVersion)) {
796358
796409
  const msg = await getMaxVersionMessage();
796359
796410
  setMaxVersionIssue(msg ?? "affects your version");
796360
796411
  }
796361
796412
  const result = await installLatest(channel);
796362
- const currentVersion = "1.84.0";
796413
+ const currentVersion = "1.84.1";
796363
796414
  const latencyMs = Date.now() - startTime;
796364
796415
  if (result.lockFailed) {
796365
796416
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -796496,17 +796547,17 @@ function PackageManagerAutoUpdater(t0) {
796496
796547
  const maxVersion = await getMaxVersion();
796497
796548
  if (maxVersion && latest && gt(latest, maxVersion)) {
796498
796549
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
796499
- if (gte("1.84.0", maxVersion)) {
796500
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.84.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
796550
+ if (gte("1.84.1", maxVersion)) {
796551
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.84.1"} is already at or above maxVersion ${maxVersion}, skipping update`);
796501
796552
  setUpdateAvailable(false);
796502
796553
  return;
796503
796554
  }
796504
796555
  latest = maxVersion;
796505
796556
  }
796506
- const hasUpdate = latest && !gte("1.84.0", latest) && !shouldSkipVersion(latest);
796557
+ const hasUpdate = latest && !gte("1.84.1", latest) && !shouldSkipVersion(latest);
796507
796558
  setUpdateAvailable(!!hasUpdate);
796508
796559
  if (hasUpdate) {
796509
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.84.0"} -> ${latest}`);
796560
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.84.1"} -> ${latest}`);
796510
796561
  }
796511
796562
  };
796512
796563
  $2[0] = t1;
@@ -796540,7 +796591,7 @@ function PackageManagerAutoUpdater(t0) {
796540
796591
  wrap: "truncate",
796541
796592
  children: [
796542
796593
  "currentVersion: ",
796543
- "1.84.0"
796594
+ "1.84.1"
796544
796595
  ]
796545
796596
  }, undefined, true, undefined, this);
796546
796597
  $2[3] = verbose;
@@ -807389,7 +807440,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
807389
807440
  project_dir: getOriginalCwd(),
807390
807441
  added_dirs: addedDirs
807391
807442
  },
807392
- version: "1.84.0",
807443
+ version: "1.84.1",
807393
807444
  output_style: {
807394
807445
  name: outputStyleName
807395
807446
  },
@@ -807524,7 +807575,7 @@ function StatusLineInner({
807524
807575
  const attention = customStatusError ?? taskAttention;
807525
807576
  const terminalSize = React138.useContext(TerminalSizeContext);
807526
807577
  const defaultStatusLineText = buildDefaultStatusBar({
807527
- version: "1.84.0",
807578
+ version: "1.84.1",
807528
807579
  providerLabel: providerRuntime.providerLabel,
807529
807580
  authMode: providerRuntime.authLabel,
807530
807581
  model: renderModelName(mainLoopModel) || providerRuntime.model || "",
@@ -819915,7 +819966,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
819915
819966
  } catch {}
819916
819967
  const data = {
819917
819968
  trigger: trigger2,
819918
- version: "1.84.0",
819969
+ version: "1.84.1",
819919
819970
  platform: process.platform,
819920
819971
  transcript,
819921
819972
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -832297,7 +832348,7 @@ function WelcomeV2() {
832297
832348
  dimColor: true,
832298
832349
  children: [
832299
832350
  "v",
832300
- "1.84.0"
832351
+ "1.84.1"
832301
832352
  ]
832302
832353
  }, undefined, true, undefined, this)
832303
832354
  ]
@@ -833543,7 +833594,7 @@ function completeOnboarding() {
833543
833594
  saveGlobalConfig((current) => ({
833544
833595
  ...current,
833545
833596
  hasCompletedOnboarding: true,
833546
- lastOnboardingVersion: "1.84.0"
833597
+ lastOnboardingVersion: "1.84.1"
833547
833598
  }));
833548
833599
  }
833549
833600
  function showDialog(root2, renderer) {
@@ -838540,7 +838591,7 @@ function appendToLog(path28, message) {
838540
838591
  cwd: getFsImplementation().cwd(),
838541
838592
  userType: process.env.USER_TYPE,
838542
838593
  sessionId: getSessionId(),
838543
- version: "1.84.0"
838594
+ version: "1.84.1"
838544
838595
  };
838545
838596
  getLogWriter(path28).write(messageWithTimestamp);
838546
838597
  }
@@ -842703,8 +842754,8 @@ async function getEnvLessBridgeConfig() {
842703
842754
  }
842704
842755
  async function checkEnvLessBridgeMinVersion() {
842705
842756
  const cfg = await getEnvLessBridgeConfig();
842706
- if (cfg.min_version && lt("1.84.0", cfg.min_version)) {
842707
- return `Your version of UR (${"1.84.0"}) is too old for Remote Control.
842757
+ if (cfg.min_version && lt("1.84.1", cfg.min_version)) {
842758
+ return `Your version of UR (${"1.84.1"}) is too old for Remote Control.
842708
842759
  Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
842709
842760
  }
842710
842761
  return null;
@@ -843178,7 +843229,7 @@ async function initBridgeCore(params) {
843178
843229
  const rawApi = createBridgeApiClient({
843179
843230
  baseUrl,
843180
843231
  getAccessToken,
843181
- runnerVersion: "1.84.0",
843232
+ runnerVersion: "1.84.1",
843182
843233
  onDebug: logForDebugging,
843183
843234
  onAuth401,
843184
843235
  getTrustedDeviceToken
@@ -856620,7 +856671,7 @@ function getAgUiCapabilities() {
856620
856671
  name: "UR-Nexus",
856621
856672
  type: "ur-nexus",
856622
856673
  description: "Provider-flexible, local-first autonomous engineering workflow agent.",
856623
- version: "1.84.0",
856674
+ version: "1.84.1",
856624
856675
  provider: "UR",
856625
856676
  documentationUrl: "https://github.com/Maitham16/UR/blob/master/docs/AG_UI.md"
856626
856677
  },
@@ -857440,7 +857491,7 @@ function createMCPServer(cwd4, debug2, verbose) {
857440
857491
  };
857441
857492
  const server2 = new Server({
857442
857493
  name: "ur-nexus",
857443
- version: "1.84.0"
857494
+ version: "1.84.1"
857444
857495
  }, {
857445
857496
  capabilities: {
857446
857497
  tools: {}
@@ -858643,7 +858694,7 @@ function thrownResponse(error61) {
858643
858694
  }
858644
858695
  async function createUrMcp2026Runtime(options5) {
858645
858696
  const server2 = createMCPServer(options5.cwd, options5.debug === true, options5.verbose === true);
858646
- const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.84.0" }, { capabilities: {} });
858697
+ const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.84.1" }, { capabilities: {} });
858647
858698
  const [clientTransport, serverTransport] = createLinkedTransportPair();
858648
858699
  try {
858649
858700
  await server2.connect(serverTransport);
@@ -858654,7 +858705,7 @@ async function createUrMcp2026Runtime(options5) {
858654
858705
  }
858655
858706
  const runtime2 = new Mcp2026Runtime({
858656
858707
  cwd: options5.cwd,
858657
- version: "1.84.0",
858708
+ version: "1.84.1",
858658
858709
  backend: {
858659
858710
  listTools: async () => {
858660
858711
  const listed = await client2.listTools();
@@ -861490,7 +861541,7 @@ async function update() {
861490
861541
  logEvent("tengu_update_check", {});
861491
861542
  const diagnostic2 = await getDoctorDiagnostic();
861492
861543
  const result = await checkUpgradeStatus({
861493
- currentVersion: "1.84.0",
861544
+ currentVersion: "1.84.1",
861494
861545
  packageName: UR_AGENT_PACKAGE_NAME,
861495
861546
  installationType: diagnostic2.installationType,
861496
861547
  latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
@@ -862818,7 +862869,7 @@ ${customInstructions}` : customInstructions;
862818
862869
  }
862819
862870
  }
862820
862871
  logForDiagnosticsNoPII("info", "started", {
862821
- version: "1.84.0",
862872
+ version: "1.84.1",
862822
862873
  is_native_binary: isInBundledMode()
862823
862874
  });
862824
862875
  registerCleanup(async () => {
@@ -863605,7 +863656,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
863605
863656
  pendingHookMessages
863606
863657
  }, renderAndRun);
863607
863658
  }
863608
- }).version("1.84.0 (UR-Nexus)", "-v, --version", "Output the version number");
863659
+ }).version("1.84.1 (UR-Nexus)", "-v, --version", "Output the version number");
863609
863660
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
863610
863661
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
863611
863662
  if (canUserConfigureAdvisor()) {
@@ -864732,7 +864783,7 @@ if (false) {}
864732
864783
  async function main2() {
864733
864784
  const args = process.argv.slice(2);
864734
864785
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
864735
- console.log(`${"1.84.0"} (UR-Nexus)`);
864786
+ console.log(`${"1.84.1"} (UR-Nexus)`);
864736
864787
  return;
864737
864788
  }
864738
864789
  if (args[0] === "a2a" && args[1] === "serve" && !args.includes("--help") && !args.includes("-h")) {
@@ -182,15 +182,19 @@ entry. Its endpoint-scoped catalog is reused for five minutes, while Ctrl+R
182
182
  forces an immediate live refresh; a failed forced refresh never silently
183
183
  displays cached entries. API-provider secret
184
184
  entry stays on one masked row and stores the value through the keychain flow.
185
- Ollama and llama.cpp capabilities are loaded lazily for the focused model from
186
- `/api/show` and `/props`, respectively, so the arrow selector reflects the
187
- actual model rather than a provider-wide guess.
185
+ Ollama, llama.cpp, and vLLM capabilities are loaded lazily for the focused
186
+ model from `/api/show`, `/props`, and `/server_info?config_format=json`,
187
+ respectively, so the arrow selector reflects live runtime evidence rather than
188
+ a provider-wide guess. llama.cpp's current boolean support flag does not name
189
+ accepted levels, while a configured vLLM reasoning parser exposes its
190
+ documented `minimal→none|low|medium|high` mapping.
188
191
 
189
192
  The effort row contains only capability-backed selectors UR can map to native
190
193
  provider values. Ultra appears only when metadata advertises `ultra`, `max`,
191
194
  `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).
195
+ exactly. Models that top out at `high`, models without an advertised
196
+ beyond-high value, and unknown capabilities omit Ultra. See
197
+ [Reasoning effort](providers.md#reasoning-effort).
194
198
 
195
199
  Boolean-thinking models on runtimes with a native toggle expose a two-state
196
200
  control instead: Left selects off, Right selects on, and `t` toggles in
@@ -19,7 +19,7 @@ You need:
19
19
 
20
20
  ```sh
21
21
  ur --version
22
- # expected for this release: "1.84.0 (UR-Nexus)"
22
+ # expected for this release: "1.84.1 (UR-Nexus)"
23
23
  ```
24
24
 
25
25
  ### 0.0 Redteam mode and Reverse Skills (1.81.0)
@@ -82,15 +82,18 @@ between models that top out at high, xhigh, max, and native-ultra models; the le
82
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
- an Ollama model that advertises boolean thinking without a ladder, verify that
85
+ an Ollama model that advertises thinking without a model-specific ladder, verify that
86
86
  Left selects off, Right selects on, `t` toggles, and `/effort max` reports that
87
87
  max was not sent while enabling `think: true`; `/thinking off` must produce
88
88
  `think: false`. For
89
- llama.cpp, verify focus requests
90
- `/props?model=<focused-id>` and that a template reporting
91
- `supports_reasoning_effort: false` has no graded selector. Open the OpenAI API or Claude
92
- API connection flow and verify the masked `API key` label and entry remain on
93
- one horizontal row.
89
+ llama.cpp, verify focus requests `/props?model=<focused-id>` and that both an
90
+ unsupported template and a bare `supports_reasoning_effort: true` flag have no
91
+ graded selector unless exact levels are also returned. For vLLM, verify one
92
+ focus request to `/server_info?config_format=json`; a non-empty reasoning parser
93
+ must expose `minimal→none`, `low`, `medium`, and `high`, serialize
94
+ `minimal` as `reasoning_effort: "none"`, and omit Ultra. Open the OpenAI API or
95
+ Claude API connection flow and verify the masked `API key` label and entry
96
+ remain on one horizontal row.
94
97
 
95
98
  Then ask UR to research a current topic with WebSearch and WebFetch. Expected:
96
99
  the auxiliary request stays on the active OpenRouter model, no `modelH` error
package/docs/providers.md CHANGED
@@ -182,8 +182,9 @@ For OpenRouter, UR preserves the live `/models` reasoning metadata and sends
182
182
  the unified `reasoning.effort` request. OpenAI-compatible servers receive the
183
183
  resolved value as `reasoning_effort`. The command confirmation, status
184
184
  indicator, active-work spinner, SDK settings response, and provider request all
185
- use the same resolved value. If a provider advertises only boolean thinking and
186
- its runtime has a real native on/off mapping, UR does not invent a graded effort
185
+ use the same resolved value. If a provider advertises thinking without a
186
+ model-specific graded ladder and its runtime has a real native on/off mapping,
187
+ UR does not invent a graded effort
187
188
  selector. Use `/thinking on|off` directly;
188
189
  in `/model`, Left selects off, Right selects on, and `t` toggles. A graded
189
190
  `/effort` request on that model enables boolean thinking while clearly reporting
@@ -194,7 +195,8 @@ so metadata alone does not make this toggle appear and UR sends no invented para
194
195
  when the provider/model advertises `ultra`, `max`, `xhigh`, or an explicit
195
196
  provider-authored equivalent. UR shows the native mapping (for example,
196
197
  `ultra→max`) and sends that exact wire value; it never enables Ultra for a model
197
- whose graded ladder tops out at `high`, boolean thinking, or unknown capability metadata. Arbitrary
198
+ whose graded ladder tops out at `high`, lacks an advertised beyond-high value,
199
+ or has unknown capability metadata. Arbitrary
198
200
  labels such as `deep` still require an explicit provider alias because UR
199
201
  cannot infer their rank.
200
202
 
@@ -209,16 +211,30 @@ the model advertises `supports_max_tokens`.
209
211
 
210
212
  For Ollama, UR lazily reads the focused model's `/api/show` capabilities and
211
213
  sends the resolved control through native `think`. A generic `thinking`
212
- capability means boolean thinking only. GPT-OSS uses Ollama's documented
214
+ capability proves thinking support but does not identify a model-specific
215
+ graded ladder; UR therefore exposes the verified native on/off control without
216
+ claiming that the model cannot also support levels. GPT-OSS uses Ollama's documented
213
217
  `low|medium|high` ladder and does not expose Ultra. Other graded ladders and
214
218
  Ultra aliases are used only when the endpoint explicitly returns them in model
215
- reasoning metadata. Direct OpenAI,
219
+ reasoning metadata.
220
+
221
+ For vLLM, UR lazily reads the non-generating
222
+ `/server_info?config_format=json` endpoint for the focused model. A configured
223
+ reasoning parser establishes vLLM's documented Chat Completions contract:
224
+ `none|low|medium|high`, displayed as `minimal→none|low|medium|high` and sent
225
+ through `reasoning_effort`. This discovery never launches a completion and
226
+ does not add Ultra. A richer provider-authored model record can add exact
227
+ levels or aliases. For llama.cpp, `/props` can establish that the active chat
228
+ template consumes reasoning effort, but the current capability flag does not
229
+ publish its finite accepted values; UR does not fabricate a ladder from that
230
+ boolean. Direct OpenAI,
216
231
  Anthropic, and Gemini models use curated model-specific ladders from their
217
232
  official documentation; live discovery rows are merged with those contracts.
218
233
  See [Ollama thinking](https://docs.ollama.com/capabilities/thinking),
219
234
  [OpenAI model guidance](https://developers.openai.com/api/docs/guides/latest-model),
220
235
  [Claude effort](https://platform.claude.com/docs/en/build-with-claude/effort),
221
- and [Gemini thinking](https://ai.google.dev/gemini-api/docs/thinking).
236
+ [Gemini thinking](https://ai.google.dev/gemini-api/docs/thinking), and
237
+ [vLLM reasoning outputs](https://docs.vllm.ai/en/latest/features/reasoning_outputs/).
222
238
 
223
239
  The provider-first `/model` picker supports the same control directly: use
224
240
  Left/Right to move through the capability-backed selectors UR can map to a
@@ -249,12 +265,13 @@ file and MCP size checks retain the local estimate rather than disabling their
249
265
  limits.
250
266
 
251
267
  For llama.cpp, `/v1/models` metadata is preserved when the server supplies it.
252
- Because stock llama.cpp exposes chat-template effort support per loaded model,
253
268
  UR also resolves the model currently under the Up/Down cursor through
254
- `/props?model=<id>`. Left/Right is enabled only after that focused template
255
- advertises `supports_reasoning_effort`; the selected value is then sent
256
- unchanged in `reasoning_effort`. This works with llama.cpp router/cluster mode
257
- and does not assume that port 8080 limits UR to one worker.
269
+ `/props?model=<id>`. `supports_reasoning_effort` establishes template support,
270
+ but current llama.cpp does not expose the accepted value set through that flag,
271
+ so it does not by itself enable Left/Right. Exact effort metadata from the
272
+ model endpoint still enables the corresponding selectors and is sent unchanged
273
+ as `reasoning_effort`. This works with llama.cpp router/cluster mode and does
274
+ not assume that port 8080 limits UR to one worker.
258
275
 
259
276
  ### Provider-aware research calls
260
277
 
@@ -548,7 +548,7 @@ const slashGroups = [
548
548
  {
549
549
  title: 'Models, tools, and interop',
550
550
  items: ['/model', '/provider', '/effort', '/thinking', '/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 or provider-native boolean thinking, inspect capabilities, manage MCP/plugin extensions, browse prompt skills with /skills, run executable workflows with /skill, and expose interop surfaces.',
551
+ text: 'Pick providers and models, cycle only capability-backed effort selectors or a verified provider-native thinking toggle, 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.84.0</p>
48
+ <p class="eyebrow">Version 1.84.1</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>
@@ -179,8 +179,8 @@ ur config set responses.store false</code></pre>
179
179
  <pre><code>/effort ultra
180
180
  /thinking on
181
181
  ur --model kimi-k3:cloud --effort high
182
- /model # Up/Down model · Left/Right effort or boolean thinking · Enter apply</code></pre>
183
- <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. For boolean-thinking models on runtimes with a native toggle, Left selects off, Right selects on, and <code>t</code> toggles; <code>/thinking on|off</code> is the direct control. A graded <code>/effort</code> request on such a model enables thinking while reporting that no graded value was sent. Generic OpenAI-compatible runtimes receive no invented boolean field.</p>
182
+ /model # Up/Down model · Left/Right effort or thinking on/off · Enter apply</code></pre>
183
+ <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>, lack an advertised beyond-high value, or have unknown capabilities do not get Ultra. For models with thinking but no advertised graded ladder on runtimes with a native toggle, Left selects off, Right selects on, and <code>t</code> toggles; <code>/thinking on|off</code> is the direct control. A graded <code>/effort</code> request on such a model enables thinking while reporting that no graded value was sent. Focused vLLM models use non-generating <code>/server_info</code> discovery for the documented <code>minimal→none|low|medium|high</code> mapping; llama.cpp's bare support flag creates no invented ladder. Generic OpenAI-compatible runtimes receive no invented boolean field.</p>
184
184
  </article>
185
185
  <article>
186
186
  <h3>OpenRouter responsive routing</h3>
@@ -7,7 +7,7 @@ plugins {
7
7
  }
8
8
 
9
9
  group = "dev.urnexus"
10
- version = "1.84.0"
10
+ version = "1.84.1"
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.84.0",
5
+ "version": "1.84.1",
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.84.0",
3
+ "version": "1.84.1",
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",