ur-agent 1.80.6 → 1.80.7

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,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.80.7
4
+
5
+ - Fixed Ollama runs stopping with `response returned unavailable tool
6
+ "WebSearch"`. Syntactically valid but unavailable native and text-form calls
7
+ now reach UR's guarded executor, which returns a recoverable result without
8
+ executing the tool and tells the model to use an available alternative or
9
+ return useful partial work. Identical retries are bounded; malformed names
10
+ and arguments still fail closed.
11
+ - Extended task-free read-only research beyond Plan Mode. The main session may
12
+ launch UR's exact shipped `Explore` and `Plan` agents before tasks exist in
13
+ every permission mode, and those workers are forced into plan permissions
14
+ even when the parent uses Accept Edits or Approve All. Custom, write-capable,
15
+ nested, team, and worktree agents still require an actionable parent task.
16
+ - Removed the global deprecated-alias fallback from tool execution. Aliases
17
+ continue to work for tools present in the active profile, but can no longer
18
+ revive a tool deliberately omitted from a worker. Approve All itself remains
19
+ supported and unchanged.
20
+
3
21
  ## 1.80.6
4
22
 
5
23
  - Fixed Plan Mode's failed-first research delegation. UR's shipped read-only
package/dist/cli.js CHANGED
@@ -88903,6 +88903,9 @@ function parseTextToolCalls(text, options = {}) {
88903
88903
  return call;
88904
88904
  const name = reconcileToolName(call.name, options.availableToolNames);
88905
88905
  if (!hasTool(options.availableToolNames, name)) {
88906
+ if (options.preserveUnavailableToolCalls) {
88907
+ return name === call.name ? call : { ...call, name };
88908
+ }
88906
88909
  throw new KimiToolCallParseError(`Kimi returned unavailable tool "${name}"`);
88907
88910
  }
88908
88911
  return name === call.name ? call : { ...call, name };
@@ -90333,7 +90336,8 @@ function ollamaResponseToURHQMessage(response, params, textToolFallbackAllowed)
90333
90336
  const rawText = response.message?.content ?? "";
90334
90337
  const parsedText = textToolFallbackAllowed ? parseTextToolCalls(rawText, {
90335
90338
  availableToolNames,
90336
- parseBareJsonToolCalls: true
90339
+ parseBareJsonToolCalls: true,
90340
+ preserveUnavailableToolCalls: true
90337
90341
  }) : { text: rawText, toolCalls: [] };
90338
90342
  const text = parsedText.text;
90339
90343
  const textToolCalls = [...parsedText.toolCalls];
@@ -90423,7 +90427,7 @@ function normalizeOllamaToolUses(structured, textCalls, availableToolNames, cont
90423
90427
  }
90424
90428
  const name = reconcileToolName(rawName, availableToolNames);
90425
90429
  if (!availableToolNames.has(name)) {
90426
- throw new ProviderResponseParseError(`${context} returned unavailable tool "${name}"`, { rawName, availableToolNames: [...availableToolNames] });
90430
+ logForDebugging(`${context} preserved unavailable tool "${name}" for guarded rejection`, { level: "warn" });
90427
90431
  }
90428
90432
  const key = `${name}\x00${toolArgsKey(input)}`;
90429
90433
  if (seen.has(key)) {
@@ -107784,7 +107788,7 @@ var init_auth = __esm(() => {
107784
107788
 
107785
107789
  // src/utils/userAgent.ts
107786
107790
  function getURCodeUserAgent() {
107787
- return `ur/${"1.80.6"}`;
107791
+ return `ur/${"1.80.7"}`;
107788
107792
  }
107789
107793
 
107790
107794
  // src/utils/workloadContext.ts
@@ -107806,7 +107810,7 @@ function getUserAgent() {
107806
107810
  const clientApp = process.env.UR_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}` : "";
107807
107811
  const workload = getWorkload();
107808
107812
  const workloadSuffix = workload ? `, workload/${workload}` : "";
107809
- return `ur-cli/${"1.80.6"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
107813
+ return `ur-cli/${"1.80.7"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
107810
107814
  }
107811
107815
  function getMCPUserAgent() {
107812
107816
  const parts = [];
@@ -107820,7 +107824,7 @@ function getMCPUserAgent() {
107820
107824
  parts.push(`client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}`);
107821
107825
  }
107822
107826
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
107823
- return `ur/${"1.80.6"}${suffix}`;
107827
+ return `ur/${"1.80.7"}${suffix}`;
107824
107828
  }
107825
107829
  function getWebFetchUserAgent() {
107826
107830
  return `UR-User (${getURCodeUserAgent()})`;
@@ -107958,7 +107962,7 @@ var init_user = __esm(() => {
107958
107962
  deviceId,
107959
107963
  sessionId: getSessionId(),
107960
107964
  email: getEmail(),
107961
- appVersion: "1.80.6",
107965
+ appVersion: "1.80.7",
107962
107966
  platform: getHostPlatformForAnalytics(),
107963
107967
  organizationUuid,
107964
107968
  accountUuid,
@@ -115845,7 +115849,7 @@ var init_metadata = __esm(() => {
115845
115849
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
115846
115850
  WHITESPACE_REGEX = /\s+/;
115847
115851
  getVersionBase = memoize_default(() => {
115848
- const match = "1.80.6".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
115852
+ const match = "1.80.7".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
115849
115853
  return match ? match[0] : undefined;
115850
115854
  });
115851
115855
  buildEnvContext = memoize_default(async () => {
@@ -115885,7 +115889,7 @@ var init_metadata = __esm(() => {
115885
115889
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
115886
115890
  isURCodeAction: isEnvTruthy(process.env.UR_CODE_ACTION),
115887
115891
  isURAiAuth: isURAISubscriber(),
115888
- version: "1.80.6",
115892
+ version: "1.80.7",
115889
115893
  versionBase: getVersionBase(),
115890
115894
  buildTime: "",
115891
115895
  deploymentEnvironment: env2.detectDeploymentEnvironment(),
@@ -116555,7 +116559,7 @@ function initialize1PEventLogging() {
116555
116559
  const platform2 = getPlatform();
116556
116560
  const attributes = {
116557
116561
  [import_semantic_conventions4.ATTR_SERVICE_NAME]: "ur",
116558
- [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.80.6"
116562
+ [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.80.7"
116559
116563
  };
116560
116564
  if (platform2 === "wsl") {
116561
116565
  const wslVersion = getWslVersion();
@@ -116583,7 +116587,7 @@ function initialize1PEventLogging() {
116583
116587
  })
116584
116588
  ]
116585
116589
  });
116586
- firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.80.6");
116590
+ firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.80.7");
116587
116591
  }
116588
116592
  async function reinitialize1PEventLoggingIfConfigChanged() {
116589
116593
  if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
@@ -126546,7 +126550,7 @@ function formatA2AAgentCard(options = {}, pretty = true) {
126546
126550
  function formatA2AV1AgentCard(options = {}, pretty = true) {
126547
126551
  return JSON.stringify(buildA2AV1AgentCard(options), null, pretty ? 2 : 0);
126548
126552
  }
126549
- var urVersion = "1.80.6", researchSnapshotDate = "2026-08-10", coverage, priorityRoadmap;
126553
+ var urVersion = "1.80.7", researchSnapshotDate = "2026-08-10", coverage, priorityRoadmap;
126550
126554
  var init_trends = __esm(() => {
126551
126555
  init_a2aCardSignature();
126552
126556
  coverage = [
@@ -129436,7 +129440,7 @@ function getAttributionHeader(fingerprint) {
129436
129440
  if (!isAttributionHeaderEnabled()) {
129437
129441
  return "";
129438
129442
  }
129439
- const version2 = `${"1.80.6"}.${fingerprint}`;
129443
+ const version2 = `${"1.80.7"}.${fingerprint}`;
129440
129444
  const entrypoint = process.env.UR_CODE_ENTRYPOINT ?? "unknown";
129441
129445
  const cch = "";
129442
129446
  const workload = getWorkload();
@@ -184632,7 +184636,7 @@ var init_projectSafety = __esm(() => {
184632
184636
  function getInstruments() {
184633
184637
  if (instruments)
184634
184638
  return instruments;
184635
- const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.80.6");
184639
+ const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.80.7");
184636
184640
  instruments = {
184637
184641
  operationDuration: meter.createHistogram("gen_ai.client.operation.duration", {
184638
184642
  description: "GenAI operation duration.",
@@ -184730,7 +184734,7 @@ function genAiAgentAttributes() {
184730
184734
  "gen_ai.operation.name": GEN_AI_OPERATION_INVOKE_AGENT,
184731
184735
  "gen_ai.provider.name": "ur",
184732
184736
  "gen_ai.agent.name": "UR-Nexus",
184733
- "gen_ai.agent.version": "1.80.6"
184737
+ "gen_ai.agent.version": "1.80.7"
184734
184738
  };
184735
184739
  }
184736
184740
  function genAiWorkflowAttributes(workflowName, workflowRunId) {
@@ -184751,7 +184755,7 @@ function genAiWorkflowAttributes(workflowName, workflowRunId) {
184751
184755
  function startGenAiWorkflowSpan(workflowName, workflowRunId) {
184752
184756
  const attributes = genAiWorkflowAttributes(workflowName, workflowRunId);
184753
184757
  const name = typeof attributes["gen_ai.workflow.name"] === "string" ? `invoke_workflow ${attributes["gen_ai.workflow.name"]}` : GEN_AI_OPERATION_INVOKE_WORKFLOW;
184754
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.80.6").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
184758
+ return import_api10.trace.getTracer("ur-agent.gen_ai", "1.80.7").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
184755
184759
  }
184756
184760
  function endGenAiWorkflowSpan(span, options2 = {}) {
184757
184761
  try {
@@ -184789,7 +184793,7 @@ function startGenAiMemorySpan(operation, options2 = {}) {
184789
184793
  if (options2.recordCount !== undefined && Number.isInteger(options2.recordCount) && options2.recordCount >= 0) {
184790
184794
  attributes["gen_ai.memory.record.count"] = options2.recordCount;
184791
184795
  }
184792
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.80.6").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
184796
+ return import_api10.trace.getTracer("ur-agent.gen_ai", "1.80.7").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
184793
184797
  }
184794
184798
  function endGenAiMemorySpan(span, options2 = {}) {
184795
184799
  try {
@@ -278504,7 +278508,7 @@ function getTelemetryAttributes() {
278504
278508
  attributes["session.id"] = sessionId;
278505
278509
  }
278506
278510
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
278507
- attributes["app.version"] = "1.80.6";
278511
+ attributes["app.version"] = "1.80.7";
278508
278512
  }
278509
278513
  const oauthAccount = getOauthAccountInfo();
278510
278514
  if (oauthAccount) {
@@ -319495,7 +319499,7 @@ function getInstallationEnv() {
319495
319499
  return;
319496
319500
  }
319497
319501
  function getURCodeVersion() {
319498
- return "1.80.6";
319502
+ return "1.80.7";
319499
319503
  }
319500
319504
  async function getInstalledVSCodeExtensionVersion(command) {
319501
319505
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -326865,7 +326869,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
326865
326869
  const client2 = new Client({
326866
326870
  name: "ur",
326867
326871
  title: "UR",
326868
- version: "1.80.6",
326872
+ version: "1.80.7",
326869
326873
  description: "UR-Nexus autonomous engineering workflow engine",
326870
326874
  websiteUrl: PRODUCT_URL
326871
326875
  }, {
@@ -327226,7 +327230,7 @@ var init_client5 = __esm(() => {
327226
327230
  const client2 = new Client({
327227
327231
  name: "ur",
327228
327232
  title: "UR",
327229
- version: "1.80.6",
327233
+ version: "1.80.7",
327230
327234
  description: "UR-Nexus autonomous engineering workflow engine",
327231
327235
  websiteUrl: PRODUCT_URL
327232
327236
  }, {
@@ -329242,6 +329246,25 @@ var init_agentToolUtils = __esm(() => {
329242
329246
  }));
329243
329247
  });
329244
329248
 
329249
+ // src/tools/AgentTool/readOnlyAgents.ts
329250
+ function isShippedReadOnlyAgentDefinition(agent) {
329251
+ return SHIPPED_READ_ONLY_AGENT_TYPES.has(agent.agentType) && agent.source === "built-in" && agent.permissionMode === "plan";
329252
+ }
329253
+ function shouldApplyAgentDefinitionPermissionMode(agent, parentMode, transcriptClassifierEnabled) {
329254
+ if (!agent.permissionMode)
329255
+ return false;
329256
+ if (isShippedReadOnlyAgentDefinition(agent))
329257
+ return true;
329258
+ return parentMode !== "bypassPermissions" && parentMode !== "acceptEdits" && !(transcriptClassifierEnabled && parentMode === "auto");
329259
+ }
329260
+ var SHIPPED_READ_ONLY_AGENT_TYPES;
329261
+ var init_readOnlyAgents = __esm(() => {
329262
+ SHIPPED_READ_ONLY_AGENT_TYPES = new Set([
329263
+ "Explore",
329264
+ "Plan"
329265
+ ]);
329266
+ });
329267
+
329245
329268
  // src/components/AgentProgressLine.tsx
329246
329269
  function getAgentProgressStatus({
329247
329270
  isResolved,
@@ -339964,7 +339987,7 @@ async function createRuntime() {
339964
339987
  bootstrapTelemetry();
339965
339988
  const resource = defaultResource().merge(detectResources({ detectors: [envDetector] })).merge(resourceFromAttributes({
339966
339989
  [import_semantic_conventions7.ATTR_SERVICE_NAME]: "ur-agent",
339967
- [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.80.6"
339990
+ [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.80.7"
339968
339991
  }));
339969
339992
  const tracerProvider = exporters.traces.length > 0 ? new BasicTracerProvider({
339970
339993
  resource,
@@ -339997,11 +340020,11 @@ async function createRuntime() {
339997
340020
  setMeterProvider(meterProvider);
339998
340021
  setLoggerProvider(loggerProvider);
339999
340022
  if (meterProvider) {
340000
- const meter = meterProvider.getMeter("ur-agent", "1.80.6");
340023
+ const meter = meterProvider.getMeter("ur-agent", "1.80.7");
340001
340024
  setMeter(meter, (name, options2) => meter.createCounter(name, options2));
340002
340025
  }
340003
340026
  if (loggerProvider) {
340004
- setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.80.6"));
340027
+ setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.80.7"));
340005
340028
  }
340006
340029
  if (!cleanupRegistered3) {
340007
340030
  cleanupRegistered3 = true;
@@ -340663,9 +340686,9 @@ async function assertMinVersion() {
340663
340686
  if (false) {}
340664
340687
  try {
340665
340688
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
340666
- if (versionConfig.minVersion && lt("1.80.6", versionConfig.minVersion)) {
340689
+ if (versionConfig.minVersion && lt("1.80.7", versionConfig.minVersion)) {
340667
340690
  console.error(`
340668
- It looks like your version of UR (${"1.80.6"}) needs an update.
340691
+ It looks like your version of UR (${"1.80.7"}) needs an update.
340669
340692
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
340670
340693
 
340671
340694
  To update, please run:
@@ -340881,7 +340904,7 @@ async function installGlobalPackage(specificVersion) {
340881
340904
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
340882
340905
  logEvent("tengu_auto_updater_lock_contention", {
340883
340906
  pid: process.pid,
340884
- currentVersion: "1.80.6"
340907
+ currentVersion: "1.80.7"
340885
340908
  });
340886
340909
  return "in_progress";
340887
340910
  }
@@ -340890,7 +340913,7 @@ async function installGlobalPackage(specificVersion) {
340890
340913
  if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
340891
340914
  logError2(new Error("Windows NPM detected in WSL environment"));
340892
340915
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
340893
- currentVersion: "1.80.6"
340916
+ currentVersion: "1.80.7"
340894
340917
  });
340895
340918
  console.error(`
340896
340919
  Error: Windows NPM detected in WSL
@@ -341425,7 +341448,7 @@ function detectLinuxGlobPatternWarnings() {
341425
341448
  }
341426
341449
  async function getDoctorDiagnostic() {
341427
341450
  const installationType = await getCurrentInstallationType();
341428
- const version2 = typeof MACRO !== "undefined" ? "1.80.6" : "unknown";
341451
+ const version2 = typeof MACRO !== "undefined" ? "1.80.7" : "unknown";
341429
341452
  const installationPath = await getInstallationPath();
341430
341453
  const invokedBinary = getInvokedBinary();
341431
341454
  const multipleInstallations = await detectMultipleInstallations();
@@ -342360,8 +342383,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
342360
342383
  const maxVersion = await getMaxVersion();
342361
342384
  if (maxVersion && gt(version2, maxVersion)) {
342362
342385
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
342363
- if (gte("1.80.6", maxVersion)) {
342364
- logForDebugging(`Native installer: current version ${"1.80.6"} is already at or above maxVersion ${maxVersion}, skipping update`);
342386
+ if (gte("1.80.7", maxVersion)) {
342387
+ logForDebugging(`Native installer: current version ${"1.80.7"} is already at or above maxVersion ${maxVersion}, skipping update`);
342365
342388
  logEvent("tengu_native_update_skipped_max_version", {
342366
342389
  latency_ms: Date.now() - startTime,
342367
342390
  max_version: maxVersion,
@@ -342372,7 +342395,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
342372
342395
  version2 = maxVersion;
342373
342396
  }
342374
342397
  }
342375
- if (!forceReinstall && version2 === "1.80.6" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
342398
+ if (!forceReinstall && version2 === "1.80.7" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
342376
342399
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
342377
342400
  logEvent("tengu_native_update_complete", {
342378
342401
  latency_ms: Date.now() - startTime,
@@ -363462,7 +363485,7 @@ async function* runAgent({
363462
363485
  const agentGetAppState = () => {
363463
363486
  const state = toolUseContext.getAppState();
363464
363487
  let toolPermissionContext = state.toolPermissionContext;
363465
- if (agentPermissionMode && state.toolPermissionContext.mode !== "bypassPermissions" && state.toolPermissionContext.mode !== "acceptEdits" && true) {
363488
+ if (agentPermissionMode && shouldApplyAgentDefinitionPermissionMode(agentDefinition, state.toolPermissionContext.mode, false)) {
363466
363489
  toolPermissionContext = {
363467
363490
  ...toolPermissionContext,
363468
363491
  mode: agentPermissionMode
@@ -363755,6 +363778,7 @@ var init_runAgent = __esm(() => {
363755
363778
  init_uuid();
363756
363779
  init_agentToolUtils();
363757
363780
  init_loadAgentsDir();
363781
+ init_readOnlyAgents();
363758
363782
  });
363759
363783
 
363760
363784
  // src/services/AgentSummary/agentSummary.ts
@@ -396228,7 +396252,7 @@ function checkTaskListGate(input) {
396228
396252
  return { allowed: true };
396229
396253
  if (input.isPlanningArtifact === true)
396230
396254
  return { allowed: true };
396231
- if (input.isReadOnlyPlanningDelegation === true)
396255
+ if (input.isReadOnlyBuiltInDelegation === true)
396232
396256
  return { allowed: true };
396233
396257
  const isMutating = input.isMutating ?? isMutatingTool2(input.toolName);
396234
396258
  if (!isMutating)
@@ -413027,7 +413051,7 @@ function isAnyTracingEnabled() {
413027
413051
  return isTelemetryEnabled() || isEnhancedTelemetryEnabled() || isBetaTracingEnabled();
413028
413052
  }
413029
413053
  function getTracer() {
413030
- return import_api39.trace.getTracer("ur-agent.gen_ai", "1.80.6");
413054
+ return import_api39.trace.getTracer("ur-agent.gen_ai", "1.80.7");
413031
413055
  }
413032
413056
  function createSpanAttributes(spanType, customAttributes = {}) {
413033
413057
  const baseAttributes = getTelemetryAttributes();
@@ -414482,15 +414506,15 @@ function isCurrentPlanFileMutation(toolName, input, context5) {
414482
414506
  return false;
414483
414507
  }
414484
414508
  }
414485
- function isReadOnlyPlanningDelegation(toolName, input, context5) {
414486
- if (context5.agentId || context5.getAppState().toolPermissionContext.mode !== "plan" || toolName !== AGENT_TOOL_NAME && toolName !== LEGACY_AGENT_TOOL_NAME || !input || typeof input !== "object" || Array.isArray(input)) {
414509
+ function isReadOnlyBuiltInDelegation(toolName, input, context5) {
414510
+ if (context5.agentId || toolName !== AGENT_TOOL_NAME && toolName !== LEGACY_AGENT_TOOL_NAME || !input || typeof input !== "object" || Array.isArray(input)) {
414487
414511
  return false;
414488
414512
  }
414489
414513
  const delegation = input;
414490
- if (typeof delegation.subagent_type !== "string" || !READ_ONLY_PLANNING_AGENT_TYPES.has(delegation.subagent_type) || delegation.name !== undefined || delegation.team_name !== undefined || delegation.isolation !== undefined) {
414514
+ if (typeof delegation.subagent_type !== "string" || delegation.name !== undefined || delegation.team_name !== undefined || delegation.isolation !== undefined) {
414491
414515
  return false;
414492
414516
  }
414493
- return context5.options.agentDefinitions.activeAgents.some((agent) => agent.agentType === delegation.subagent_type && agent.source === "built-in" && agent.permissionMode === "plan");
414517
+ return context5.options.agentDefinitions.activeAgents.some((agent) => agent.agentType === delegation.subagent_type && isShippedReadOnlyAgentDefinition(agent));
414494
414518
  }
414495
414519
  function getStopHookInfo(attachment) {
414496
414520
  if (typeof attachment !== "object" || attachment === null || !("command" in attachment) || typeof attachment.command !== "string" || !("durationMs" in attachment) || typeof attachment.durationMs !== "number") {
@@ -414604,13 +414628,7 @@ function getMcpServerBaseUrlFromToolName(toolName, mcpClients) {
414604
414628
  }
414605
414629
  async function* runToolUse(toolUse, assistantMessage, canUseTool, toolUseContext) {
414606
414630
  const toolName = toolUse.name;
414607
- let tool = findToolByName(toolUseContext.options.tools, toolName);
414608
- if (!tool) {
414609
- const fallbackTool = findToolByName(getAllBaseTools(), toolName);
414610
- if (fallbackTool && fallbackTool.aliases?.includes(toolName)) {
414611
- tool = fallbackTool;
414612
- }
414613
- }
414631
+ const tool = findToolByName(toolUseContext.options.tools, toolName);
414614
414632
  const messageId = assistantMessage.message?.id;
414615
414633
  if (typeof messageId !== "string" || messageId.length === 0) {
414616
414634
  throw new Error(`Cannot execute tool_use ${toolUse.id}: assistant message has no id`);
@@ -414620,7 +414638,7 @@ async function* runToolUse(toolUse, assistantMessage, canUseTool, toolUseContext
414620
414638
  const mcpServerBaseUrl = getMcpServerBaseUrlFromToolName(toolName, toolUseContext.options.mcpClients);
414621
414639
  if (!tool) {
414622
414640
  const callSig = callSignature(toolName, toolUse.input, repeatedFailureScope(toolUseContext, messageId));
414623
- const repeat2 = checkRepeatedFailure(callSig);
414641
+ const repeat2 = checkRepeatedFailure(callSig, UNKNOWN_TOOL_REPEAT_POLICY);
414624
414642
  if (repeat2.action === "abort") {
414625
414643
  throw new RepeatedToolFailureAbort(`Repeated tool failure: ${repeat2.reason}`);
414626
414644
  }
@@ -414662,17 +414680,18 @@ async function* runToolUse(toolUse, assistantMessage, canUseTool, toolUseContext
414662
414680
  },
414663
414681
  ...mcpToolDetailsForAnalytics(toolName, mcpServerType, mcpServerBaseUrl)
414664
414682
  });
414683
+ const unavailableMessage = `Tool "${toolName}" is not available in this agent's active tool profile. Do not retry this tool unchanged. Continue with an available tool, or return the useful partial result so the parent agent can proceed.`;
414665
414684
  yield {
414666
414685
  message: createUserMessage({
414667
414686
  content: [
414668
414687
  {
414669
414688
  type: "tool_result",
414670
- content: `<tool_use_error>Error: No such tool available: ${toolName}</tool_use_error>`,
414689
+ content: `<tool_use_error>UnavailableTool: ${unavailableMessage}</tool_use_error>`,
414671
414690
  is_error: true,
414672
414691
  tool_use_id: toolUse.id
414673
414692
  }
414674
414693
  ],
414675
- toolUseResult: `Error: No such tool available: ${toolName}`,
414694
+ toolUseResult: `UnavailableTool: ${unavailableMessage}`,
414676
414695
  sourceToolAssistantUUID: assistantMessage.uuid
414677
414696
  })
414678
414697
  };
@@ -414957,7 +414976,7 @@ async function checkPermissionsAndCallTool(tool, toolUseID, input, toolUseContex
414957
414976
  requiresTaskList: taskListRun?.requiresTaskList,
414958
414977
  requirementReason: taskListRun?.requirementReason,
414959
414978
  isPlanningArtifact: isCurrentPlanFileMutation(tool.name, parsedInput.data, toolUseContext),
414960
- isReadOnlyPlanningDelegation: isReadOnlyPlanningDelegation(tool.name, parsedInput.data, toolUseContext),
414979
+ isReadOnlyBuiltInDelegation: isReadOnlyBuiltInDelegation(tool.name, parsedInput.data, toolUseContext),
414961
414980
  taskListWriterAvailable: toolUseContext.options.tools.some((candidate) => candidate.name === "TaskCreate")
414962
414981
  });
414963
414982
  if (gate.allowed === false) {
@@ -415319,7 +415338,7 @@ async function checkPermissionsAndCallTool(tool, toolUseID, input, toolUseContex
415319
415338
  requiresTaskList: taskListRun?.requiresTaskList,
415320
415339
  requirementReason: taskListRun?.requirementReason,
415321
415340
  isPlanningArtifact: isCurrentPlanFileMutation(tool.name, finalParsedInput.data, toolUseContext),
415322
- isReadOnlyPlanningDelegation: isReadOnlyPlanningDelegation(tool.name, finalParsedInput.data, toolUseContext),
415341
+ isReadOnlyBuiltInDelegation: isReadOnlyBuiltInDelegation(tool.name, finalParsedInput.data, toolUseContext),
415323
415342
  taskListWriterAvailable: toolUseContext.options.tools.some((candidate) => candidate.name === "TaskCreate")
415324
415343
  });
415325
415344
  if (finalGate.allowed === false) {
@@ -415729,7 +415748,7 @@ async function checkPermissionsAndCallTool(tool, toolUseID, input, toolUseContex
415729
415748
  }
415730
415749
  }
415731
415750
  }
415732
- var READ_ONLY_PLANNING_AGENT_TYPES, HOOK_TIMING_DISPLAY_THRESHOLD_MS2 = 500, SLOW_PHASE_LOG_THRESHOLD_MS = 2000;
415751
+ var UNKNOWN_TOOL_REPEAT_POLICY, HOOK_TIMING_DISPLAY_THRESHOLD_MS2 = 500, SLOW_PHASE_LOG_THRESHOLD_MS = 2000;
415733
415752
  var init_toolExecution = __esm(() => {
415734
415753
  init_analytics();
415735
415754
  init_metadata();
@@ -415741,11 +415760,11 @@ var init_toolExecution = __esm(() => {
415741
415760
  init_prompt();
415742
415761
  init_bashPermissions();
415743
415762
  init_constants2();
415763
+ init_readOnlyAgents();
415744
415764
  init_prompt3();
415745
415765
  init_prompt4();
415746
415766
  init_gitOperationTracking();
415747
415767
  init_prompt8();
415748
- init_tools2();
415749
415768
  init_attachments2();
415750
415769
  init_debug();
415751
415770
  init_errors();
@@ -415771,7 +415790,11 @@ var init_toolExecution = __esm(() => {
415771
415790
  init_mcpStringUtils();
415772
415791
  init_utils3();
415773
415792
  init_toolHooks();
415774
- READ_ONLY_PLANNING_AGENT_TYPES = new Set(["Explore", "Plan"]);
415793
+ UNKNOWN_TOOL_REPEAT_POLICY = {
415794
+ enabled: true,
415795
+ limit: 1,
415796
+ abortAfter: 3
415797
+ };
415775
415798
  });
415776
415799
 
415777
415800
  // src/services/tools/StreamingToolExecutor.ts
@@ -443147,7 +443170,7 @@ function Feedback({
443147
443170
  platform: env2.platform,
443148
443171
  gitRepo: envInfo.isGit,
443149
443172
  terminal: env2.terminal,
443150
- version: "1.80.6",
443173
+ version: "1.80.7",
443151
443174
  transcript: normalizeMessagesForAPI(messages),
443152
443175
  errors: sanitizedErrors,
443153
443176
  lastApiRequest: getLastAPIRequest(),
@@ -443339,7 +443362,7 @@ function Feedback({
443339
443362
  ", ",
443340
443363
  env2.terminal,
443341
443364
  ", v",
443342
- "1.80.6"
443365
+ "1.80.7"
443343
443366
  ]
443344
443367
  }, undefined, true, undefined, this)
443345
443368
  ]
@@ -443445,7 +443468,7 @@ ${sanitizedDescription}
443445
443468
  ` + `**Environment Info**
443446
443469
  ` + `- Platform: ${env2.platform}
443447
443470
  ` + `- Terminal: ${env2.terminal}
443448
- ` + `- Version: ${"1.80.6"}
443471
+ ` + `- Version: ${"1.80.7"}
443449
443472
  ` + `- Feedback ID: ${feedbackId}
443450
443473
  ` + `
443451
443474
  **Errors**
@@ -446555,7 +446578,7 @@ function buildPrimarySection() {
446555
446578
  }, undefined, false, undefined, this);
446556
446579
  return [{
446557
446580
  label: "Version",
446558
- value: "1.80.6"
446581
+ value: "1.80.7"
446559
446582
  }, {
446560
446583
  label: "Session name",
446561
446584
  value: nameValue
@@ -449937,7 +449960,7 @@ function Config({
449937
449960
  }
449938
449961
  }, undefined, false, undefined, this)
449939
449962
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime179.jsxDEV(ChannelDowngradeDialog, {
449940
- currentVersion: "1.80.6",
449963
+ currentVersion: "1.80.7",
449941
449964
  onChoice: (choice) => {
449942
449965
  setShowSubmenu(null);
449943
449966
  setTabsHidden(false);
@@ -449949,7 +449972,7 @@ function Config({
449949
449972
  autoUpdatesChannel: "stable"
449950
449973
  };
449951
449974
  if (choice === "stay") {
449952
- newSettings.minimumVersion = "1.80.6";
449975
+ newSettings.minimumVersion = "1.80.7";
449953
449976
  }
449954
449977
  updateSettingsForSource("userSettings", newSettings);
449955
449978
  setSettingsData((prev_27) => ({
@@ -458258,7 +458281,7 @@ function HelpV2(t0) {
458258
458281
  let t6;
458259
458282
  if ($2[31] !== tabs) {
458260
458283
  t6 = /* @__PURE__ */ jsx_dev_runtime206.jsxDEV(Tabs, {
458261
- title: `UR v${"1.80.6"}`,
458284
+ title: `UR v${"1.80.7"}`,
458262
458285
  color: "professionalBlue",
458263
458286
  defaultTab: "general",
458264
458287
  children: tabs
@@ -459191,7 +459214,7 @@ function buildToolUseContext(tools, readFileStateCache, toolPermissionContext, a
459191
459214
  async function handleInitialize(options2) {
459192
459215
  return {
459193
459216
  name: "UR",
459194
- version: "1.80.6",
459217
+ version: "1.80.7",
459195
459218
  protocolVersion: "0.1.0",
459196
459219
  workspaceRoot: options2.cwd,
459197
459220
  capabilities: {
@@ -476299,7 +476322,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
476299
476322
  return [];
476300
476323
  }
476301
476324
  }
476302
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.80.6") {
476325
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.80.7") {
476303
476326
  if (process.env.USER_TYPE === "ant") {
476304
476327
  const changelog = "";
476305
476328
  if (changelog) {
@@ -476326,7 +476349,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.80.6")
476326
476349
  releaseNotes
476327
476350
  };
476328
476351
  }
476329
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.80.6") {
476352
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.80.7") {
476330
476353
  if (process.env.USER_TYPE === "ant") {
476331
476354
  const changelog = "";
476332
476355
  if (changelog) {
@@ -479231,7 +479254,7 @@ function getRecentActivitySync() {
479231
479254
  return cachedActivity;
479232
479255
  }
479233
479256
  function getLogoDisplayData() {
479234
- const version2 = process.env.DEMO_VERSION ?? "1.80.6";
479257
+ const version2 = process.env.DEMO_VERSION ?? "1.80.7";
479235
479258
  const serverUrl = getDirectConnectServerUrl();
479236
479259
  const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd());
479237
479260
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -480099,7 +480122,7 @@ function LogoV2() {
480099
480122
  if ($2[2] === Symbol.for("react.memo_cache_sentinel")) {
480100
480123
  t2 = () => {
480101
480124
  const currentConfig = getGlobalConfig();
480102
- if (currentConfig.lastReleaseNotesSeen === "1.80.6") {
480125
+ if (currentConfig.lastReleaseNotesSeen === "1.80.7") {
480103
480126
  return;
480104
480127
  }
480105
480128
  saveGlobalConfig(_temp325);
@@ -480784,12 +480807,12 @@ function LogoV2() {
480784
480807
  return t41;
480785
480808
  }
480786
480809
  function _temp325(current) {
480787
- if (current.lastReleaseNotesSeen === "1.80.6") {
480810
+ if (current.lastReleaseNotesSeen === "1.80.7") {
480788
480811
  return current;
480789
480812
  }
480790
480813
  return {
480791
480814
  ...current,
480792
- lastReleaseNotesSeen: "1.80.6"
480815
+ lastReleaseNotesSeen: "1.80.7"
480793
480816
  };
480794
480817
  }
480795
480818
  function _temp241(s_0) {
@@ -496881,7 +496904,7 @@ function compileAgenticCiWorkflow(specName = "default", options2 = {}) {
496881
496904
  if (spec.name !== specName) {
496882
496905
  throw new Error("Agentic CI workflow spec name does not match");
496883
496906
  }
496884
- const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.80.6" : "1.80.6");
496907
+ const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.80.7" : "1.80.7");
496885
496908
  if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(packageVersion)) {
496886
496909
  throw new Error("invalid ur-agent package version");
496887
496910
  }
@@ -497874,7 +497897,7 @@ runner; \`ur trigger\` is the inbound parser that decides what to run.
497874
497897
  path: ".github/workflows/ur.yml",
497875
497898
  root: "project",
497876
497899
  content: compileAgenticCiWorkflow("default", {
497877
- packageVersion: typeof MACRO !== "undefined" ? "1.80.6" : "1.80.6"
497900
+ packageVersion: typeof MACRO !== "undefined" ? "1.80.7" : "1.80.7"
497878
497901
  })
497879
497902
  },
497880
497903
  {
@@ -497937,7 +497960,7 @@ function value(tokens, flag) {
497937
497960
  return index2 >= 0 ? tokens[index2 + 1] : undefined;
497938
497961
  }
497939
497962
  function cliVersion() {
497940
- return typeof MACRO !== "undefined" ? "1.80.6" : "1.80.6";
497963
+ return typeof MACRO !== "undefined" ? "1.80.7" : "1.80.7";
497941
497964
  }
497942
497965
  function workflowPath(cwd2) {
497943
497966
  return join168(cwd2, ".github", "workflows", "ur-agentic-ci.yml");
@@ -503793,7 +503816,7 @@ function createAcpStdioApp(deps) {
503793
503816
  }
503794
503817
  },
503795
503818
  authMethods: [],
503796
- agentInfo: { name: "UR-Nexus", version: "1.80.6" }
503819
+ agentInfo: { name: "UR-Nexus", version: "1.80.7" }
503797
503820
  })).onRequest("authenticate", () => ({})).onRequest("session/new", async (context6) => {
503798
503821
  const result = runtime2.newSession(context6.params.cwd, context6.params.mcpServers, context6.params.additionalDirectories);
503799
503822
  await runtime2.announce({
@@ -503890,7 +503913,7 @@ function createAcpStdioAgent(deps) {
503890
503913
  }
503891
503914
  },
503892
503915
  authMethods: [],
503893
- agentInfo: { name: "UR-Nexus", version: "1.80.6" }
503916
+ agentInfo: { name: "UR-Nexus", version: "1.80.7" }
503894
503917
  });
503895
503918
  return;
503896
503919
  case "authenticate":
@@ -715116,7 +715139,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
715116
715139
  smapsRollup,
715117
715140
  platform: process.platform,
715118
715141
  nodeVersion: process.version,
715119
- ccVersion: "1.80.6"
715142
+ ccVersion: "1.80.7"
715120
715143
  };
715121
715144
  }
715122
715145
  async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
@@ -715705,7 +715728,7 @@ var init_bridge_kick = __esm(() => {
715705
715728
  var call154 = async () => {
715706
715729
  return {
715707
715730
  type: "text",
715708
- value: "1.80.6"
715731
+ value: "1.80.7"
715709
715732
  };
715710
715733
  }, version2, version_default;
715711
715734
  var init_version = __esm(() => {
@@ -726948,7 +726971,7 @@ function generateHtmlReport(data, insights) {
726948
726971
  </html>`;
726949
726972
  }
726950
726973
  function buildExportData(data, insights, facets, remoteStats) {
726951
- const version3 = typeof MACRO !== "undefined" ? "1.80.6" : "unknown";
726974
+ const version3 = typeof MACRO !== "undefined" ? "1.80.7" : "unknown";
726952
726975
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
726953
726976
  const facets_summary = {
726954
726977
  total: facets.size,
@@ -731261,7 +731284,7 @@ var init_sessionStorage = __esm(() => {
731261
731284
  init_settings2();
731262
731285
  init_slowOperations();
731263
731286
  init_uuid();
731264
- VERSION7 = typeof MACRO !== "undefined" ? "1.80.6" : "unknown";
731287
+ VERSION7 = typeof MACRO !== "undefined" ? "1.80.7" : "unknown";
731265
731288
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
731266
731289
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
731267
731290
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -732476,7 +732499,7 @@ var init_filesystem = __esm(() => {
732476
732499
  });
732477
732500
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
732478
732501
  const nonce = randomBytes24(16).toString("hex");
732479
- return join243(getURTempDir(), "bundled-skills", "1.80.6", nonce);
732502
+ return join243(getURTempDir(), "bundled-skills", "1.80.7", nonce);
732480
732503
  });
732481
732504
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
732482
732505
  });
@@ -738086,6 +738109,7 @@ function getOllamaToolDisciplineSection() {
738086
738109
  return null;
738087
738110
  const items = [
738088
738111
  `Use the native structured tool-call interface; never substitute prose, fenced code, XML, or printed arguments for a call. Only use a text fallback when the runtime explicitly says native tools are unavailable and supplies the exact fallback format.`,
738112
+ `Call only tools exposed in the active tool list. If a tool result says a tool is unavailable, do not retry it unchanged: use an available alternative or continue with the useful partial result.`,
738089
738113
  `Use ${FILE_WRITE_TOOL_NAME} or ${FILE_EDIT_TOOL_NAME} for file changes. Batch independent calls in one turn (maximum 8); keep read\u2192decide\u2192write and other dependencies sequential.`,
738090
738114
  `Treat each call as pending until its matching result arrives. Observe that result before continuing, and never claim a file change, command, test, or other action succeeded without a successful result.`,
738091
738115
  `Never emit an empty turn: provide a real tool call, useful user-facing text, or both.`
@@ -738095,7 +738119,7 @@ function getOllamaToolDisciplineSection() {
738095
738119
  }
738096
738120
  function getAgentToolSection() {
738097
738121
  const launch = isForkSubagentEnabled() ? `Calling ${AGENT_TOOL_NAME} without a subagent_type creates a fork, which runs in the background and keeps its raw tool output out of your context. **If you ARE the fork**, execute your bounded assignment directly; do not re-delegate.` : `Use ${AGENT_TOOL_NAME} with the specialized agent whose description best matches each bounded assignment.`;
738098
- return `${launch} For a large request, first create a bounded task list, then delegate at most one ready independent branch per agent. Launch independent read-only research, audits, or exploration together. Shared-checkout writers, unknown scopes, dependencies, and overlapping file targets must run sequentially. Parallel writers require separate worktrees based on the exact clean starting revision; if the current required state is dirty or unsnapshotted, keep those writers serial in the shared checkout. Keep tiny dependent steps with the parent when delegation overhead is larger than the work. The parent owns task status, integration, and final verification: do not duplicate delegated work, do not mark a delegated task complete from a launch acknowledgement, and do not finish until the returned result and acceptance evidence have been checked.`;
738122
+ return `${launch} For a large request, first create a bounded task list, then delegate at most one ready independent branch per agent. The shipped read-only Explore and Plan agents may investigate before that list exists; every custom, write-capable, nested, team, or worktree delegation requires a ready parent task. Launch independent read-only research, audits, or exploration together. Shared-checkout writers, unknown scopes, dependencies, and overlapping file targets must run sequentially. Parallel writers require separate worktrees based on the exact clean starting revision; if the current required state is dirty or unsnapshotted, keep those writers serial in the shared checkout. Keep tiny dependent steps with the parent when delegation overhead is larger than the work. The parent owns task status, integration, and final verification: do not duplicate delegated work, do not mark a delegated task complete from a launch acknowledgement, and do not finish until the returned result and acceptance evidence have been checked.`;
738099
738123
  }
738100
738124
  function getDiscoverSkillsGuidance() {
738101
738125
  if (false) {}
@@ -738865,7 +738889,7 @@ function computeFingerprint(messageText2, version3) {
738865
738889
  }
738866
738890
  function computeFingerprintFromMessages(messages) {
738867
738891
  const firstMessageText = extractFirstMessageText(messages);
738868
- return computeFingerprint(firstMessageText, "1.80.6");
738892
+ return computeFingerprint(firstMessageText, "1.80.7");
738869
738893
  }
738870
738894
  var FINGERPRINT_SALT = "59cf53e54c78";
738871
738895
  var init_fingerprint = () => {};
@@ -740790,7 +740814,7 @@ async function sideQuery(opts) {
740790
740814
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
740791
740815
  }
740792
740816
  const messageText2 = extractFirstUserMessageText(messages);
740793
- const fingerprint2 = computeFingerprint(messageText2, "1.80.6");
740817
+ const fingerprint2 = computeFingerprint(messageText2, "1.80.7");
740794
740818
  const attributionHeader = getAttributionHeader(fingerprint2);
740795
740819
  const systemBlocks = [
740796
740820
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -745624,7 +745648,7 @@ function buildSystemInitMessage(inputs) {
745624
745648
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
745625
745649
  apiKeySource: getURHQApiKeyWithSource().source,
745626
745650
  betas: getSdkBetas(),
745627
- ur_version: "1.80.6",
745651
+ ur_version: "1.80.7",
745628
745652
  output_style: outputStyle,
745629
745653
  agents: inputs.agents.map((agent2) => agent2.agentType),
745630
745654
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
@@ -759460,7 +759484,7 @@ var init_useVoiceEnabled = __esm(() => {
759460
759484
  function getSemverPart(version3) {
759461
759485
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
759462
759486
  }
759463
- function useUpdateNotification(updatedVersion, initialVersion = "1.80.6") {
759487
+ function useUpdateNotification(updatedVersion, initialVersion = "1.80.7") {
759464
759488
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react225.useState(() => getSemverPart(initialVersion));
759465
759489
  if (!updatedVersion) {
759466
759490
  return null;
@@ -759509,7 +759533,7 @@ function AutoUpdater({
759509
759533
  return;
759510
759534
  }
759511
759535
  if (false) {}
759512
- const currentVersion = "1.80.6";
759536
+ const currentVersion = "1.80.7";
759513
759537
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
759514
759538
  let latestVersion = await getLatestVersion(channel);
759515
759539
  const isDisabled = isAutoUpdaterDisabled();
@@ -759738,12 +759762,12 @@ function NativeAutoUpdater({
759738
759762
  logEvent("tengu_native_auto_updater_start", {});
759739
759763
  try {
759740
759764
  const maxVersion = await getMaxVersion();
759741
- if (maxVersion && gt("1.80.6", maxVersion)) {
759765
+ if (maxVersion && gt("1.80.7", maxVersion)) {
759742
759766
  const msg = await getMaxVersionMessage();
759743
759767
  setMaxVersionIssue(msg ?? "affects your version");
759744
759768
  }
759745
759769
  const result = await installLatest(channel);
759746
- const currentVersion = "1.80.6";
759770
+ const currentVersion = "1.80.7";
759747
759771
  const latencyMs = Date.now() - startTime;
759748
759772
  if (result.lockFailed) {
759749
759773
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -759880,17 +759904,17 @@ function PackageManagerAutoUpdater(t0) {
759880
759904
  const maxVersion = await getMaxVersion();
759881
759905
  if (maxVersion && latest && gt(latest, maxVersion)) {
759882
759906
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
759883
- if (gte("1.80.6", maxVersion)) {
759884
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.80.6"} is already at or above maxVersion ${maxVersion}, skipping update`);
759907
+ if (gte("1.80.7", maxVersion)) {
759908
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.80.7"} is already at or above maxVersion ${maxVersion}, skipping update`);
759885
759909
  setUpdateAvailable(false);
759886
759910
  return;
759887
759911
  }
759888
759912
  latest = maxVersion;
759889
759913
  }
759890
- const hasUpdate = latest && !gte("1.80.6", latest) && !shouldSkipVersion(latest);
759914
+ const hasUpdate = latest && !gte("1.80.7", latest) && !shouldSkipVersion(latest);
759891
759915
  setUpdateAvailable(!!hasUpdate);
759892
759916
  if (hasUpdate) {
759893
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.80.6"} -> ${latest}`);
759917
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.80.7"} -> ${latest}`);
759894
759918
  }
759895
759919
  };
759896
759920
  $2[0] = t1;
@@ -759924,7 +759948,7 @@ function PackageManagerAutoUpdater(t0) {
759924
759948
  wrap: "truncate",
759925
759949
  children: [
759926
759950
  "currentVersion: ",
759927
- "1.80.6"
759951
+ "1.80.7"
759928
759952
  ]
759929
759953
  }, undefined, true, undefined, this);
759930
759954
  $2[3] = verbose;
@@ -770777,7 +770801,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
770777
770801
  project_dir: getOriginalCwd(),
770778
770802
  added_dirs: addedDirs
770779
770803
  },
770780
- version: "1.80.6",
770804
+ version: "1.80.7",
770781
770805
  output_style: {
770782
770806
  name: outputStyleName
770783
770807
  },
@@ -770912,7 +770936,7 @@ function StatusLineInner({
770912
770936
  const attention = customStatusError ?? taskAttention;
770913
770937
  const terminalSize = React133.useContext(TerminalSizeContext);
770914
770938
  const defaultStatusLineText = buildDefaultStatusBar({
770915
- version: "1.80.6",
770939
+ version: "1.80.7",
770916
770940
  providerLabel: providerRuntime.providerLabel,
770917
770941
  authMode: providerRuntime.authLabel,
770918
770942
  model: renderModelName(mainLoopModel) || providerRuntime.model || "",
@@ -783167,7 +783191,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
783167
783191
  } catch {}
783168
783192
  const data = {
783169
783193
  trigger: trigger2,
783170
- version: "1.80.6",
783194
+ version: "1.80.7",
783171
783195
  platform: process.platform,
783172
783196
  transcript,
783173
783197
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -795536,7 +795560,7 @@ function WelcomeV2() {
795536
795560
  dimColor: true,
795537
795561
  children: [
795538
795562
  "v",
795539
- "1.80.6"
795563
+ "1.80.7"
795540
795564
  ]
795541
795565
  }, undefined, true, undefined, this)
795542
795566
  ]
@@ -796796,7 +796820,7 @@ function completeOnboarding() {
796796
796820
  saveGlobalConfig((current) => ({
796797
796821
  ...current,
796798
796822
  hasCompletedOnboarding: true,
796799
- lastOnboardingVersion: "1.80.6"
796823
+ lastOnboardingVersion: "1.80.7"
796800
796824
  }));
796801
796825
  }
796802
796826
  function showDialog(root2, renderer) {
@@ -801942,7 +801966,7 @@ function appendToLog(path28, message) {
801942
801966
  cwd: getFsImplementation().cwd(),
801943
801967
  userType: process.env.USER_TYPE,
801944
801968
  sessionId: getSessionId(),
801945
- version: "1.80.6"
801969
+ version: "1.80.7"
801946
801970
  };
801947
801971
  getLogWriter(path28).write(messageWithTimestamp);
801948
801972
  }
@@ -806106,8 +806130,8 @@ async function getEnvLessBridgeConfig() {
806106
806130
  }
806107
806131
  async function checkEnvLessBridgeMinVersion() {
806108
806132
  const cfg = await getEnvLessBridgeConfig();
806109
- if (cfg.min_version && lt("1.80.6", cfg.min_version)) {
806110
- return `Your version of UR (${"1.80.6"}) is too old for Remote Control.
806133
+ if (cfg.min_version && lt("1.80.7", cfg.min_version)) {
806134
+ return `Your version of UR (${"1.80.7"}) is too old for Remote Control.
806111
806135
  Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
806112
806136
  }
806113
806137
  return null;
@@ -806581,7 +806605,7 @@ async function initBridgeCore(params) {
806581
806605
  const rawApi = createBridgeApiClient({
806582
806606
  baseUrl,
806583
806607
  getAccessToken,
806584
- runnerVersion: "1.80.6",
806608
+ runnerVersion: "1.80.7",
806585
806609
  onDebug: logForDebugging,
806586
806610
  onAuth401,
806587
806611
  getTrustedDeviceToken
@@ -816054,7 +816078,7 @@ function getAgUiCapabilities() {
816054
816078
  name: "UR-Nexus",
816055
816079
  type: "ur-nexus",
816056
816080
  description: "Provider-flexible, local-first autonomous engineering workflow agent.",
816057
- version: "1.80.6",
816081
+ version: "1.80.7",
816058
816082
  provider: "UR",
816059
816083
  documentationUrl: "https://github.com/Maitham16/UR/blob/master/docs/AG_UI.md"
816060
816084
  },
@@ -817281,7 +817305,7 @@ function createMCPServer(cwd4, debug2, verbose) {
817281
817305
  };
817282
817306
  const server2 = new Server({
817283
817307
  name: "ur-nexus",
817284
- version: "1.80.6"
817308
+ version: "1.80.7"
817285
817309
  }, {
817286
817310
  capabilities: {
817287
817311
  tools: {}
@@ -818485,7 +818509,7 @@ function thrownResponse(error40) {
818485
818509
  }
818486
818510
  async function createUrMcp2026Runtime(options5) {
818487
818511
  const server2 = createMCPServer(options5.cwd, options5.debug === true, options5.verbose === true);
818488
- const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.80.6" }, { capabilities: {} });
818512
+ const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.80.7" }, { capabilities: {} });
818489
818513
  const [clientTransport, serverTransport] = createLinkedTransportPair();
818490
818514
  try {
818491
818515
  await server2.connect(serverTransport);
@@ -818496,7 +818520,7 @@ async function createUrMcp2026Runtime(options5) {
818496
818520
  }
818497
818521
  const runtime2 = new Mcp2026Runtime({
818498
818522
  cwd: options5.cwd,
818499
- version: "1.80.6",
818523
+ version: "1.80.7",
818500
818524
  backend: {
818501
818525
  listTools: async () => {
818502
818526
  const listed = await client2.listTools();
@@ -821231,7 +821255,7 @@ async function update() {
821231
821255
  logEvent("tengu_update_check", {});
821232
821256
  const diagnostic2 = await getDoctorDiagnostic();
821233
821257
  const result = await checkUpgradeStatus({
821234
- currentVersion: "1.80.6",
821258
+ currentVersion: "1.80.7",
821235
821259
  packageName: UR_AGENT_PACKAGE_NAME,
821236
821260
  installationType: diagnostic2.installationType,
821237
821261
  latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
@@ -822559,7 +822583,7 @@ ${customInstructions}` : customInstructions;
822559
822583
  }
822560
822584
  }
822561
822585
  logForDiagnosticsNoPII("info", "started", {
822562
- version: "1.80.6",
822586
+ version: "1.80.7",
822563
822587
  is_native_binary: isInBundledMode()
822564
822588
  });
822565
822589
  registerCleanup(async () => {
@@ -823346,7 +823370,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
823346
823370
  pendingHookMessages
823347
823371
  }, renderAndRun);
823348
823372
  }
823349
- }).version("1.80.6 (UR-Nexus)", "-v, --version", "Output the version number");
823373
+ }).version("1.80.7 (UR-Nexus)", "-v, --version", "Output the version number");
823350
823374
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
823351
823375
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
823352
823376
  if (canUserConfigureAdvisor()) {
@@ -824473,7 +824497,7 @@ if (false) {}
824473
824497
  async function main2() {
824474
824498
  const args = process.argv.slice(2);
824475
824499
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
824476
- console.log(`${"1.80.6"} (UR-Nexus)`);
824500
+ console.log(`${"1.80.7"} (UR-Nexus)`);
824477
824501
  return;
824478
824502
  }
824479
824503
  if (args[0] === "a2a" && args[1] === "serve" && !args.includes("--help") && !args.includes("-h")) {
@@ -9,6 +9,13 @@ reproducible autonomous software engineering agent: every substantial task can
9
9
  be driven as `spec -> plan -> patch -> test -> report -> rollback`, with the
10
10
  spec as the durable source of truth and command evidence as the success gate.
11
11
 
12
+ ## v1.80.7 Additions
13
+
14
+ | Addition | Surface | What it adds |
15
+ | --- | --- | --- |
16
+ | Recoverable local-model tool mismatch | Ollama native/text calls, streaming/non-streaming execution | Converts a valid call to a tool absent from the active profile into a safe `UnavailableTool` result instead of aborting the provider turn. Identical retries are bounded and omitted tools cannot be revived through legacy aliases. |
17
+ | Task-free read-only research | `Agent`, strict-hybrid task gate | Lets the main session launch the exact shipped `Explore` and `Plan` definitions before tasks exist in every parent permission mode, while forcing those children into plan permissions and keeping all custom or write-capable delegation gated. |
18
+
12
19
  ## v1.80.6 Addition
13
20
 
14
21
  | Addition | Surface | What it adds |
@@ -56,7 +56,11 @@ never blocked.
56
56
  do not carry a classified user turn; it is not a limit on investigation. Set
57
57
  it to `0` to require a task before every mutation. Set `enabled` to `false` to
58
58
  return to advisory task tracking. Profiles that omit `TaskCreate` are not
59
- gated, because they could not satisfy the requirement.
59
+ gated, because they could not satisfy the requirement. The main session may
60
+ launch UR's shipped `Explore` and `Plan` agents before a task exists in any
61
+ permission mode. These exact built-in definitions are forced read-only; custom,
62
+ write-capable, nested, named/team, and worktree delegation still requires an
63
+ actionable parent task.
60
64
 
61
65
  ## Model Providers
62
66
 
@@ -83,14 +83,17 @@ ur provider status
83
83
  different source. Timeouts, `408`, `409`, `425`, `429`, and `5xx` responses
84
84
  remain retryable because they may be transient.
85
85
 
86
- ### Plan mode says `TaskListRequired`
86
+ ### A built-in research agent says `TaskListRequired`
87
87
 
88
88
  - Likely cause on UR 1.80.3–1.80.5: the strict task gate treated either the
89
89
  active plan file or early read-only research delegation as an untracked
90
90
  project mutation, creating a circular requirement before planning finished.
91
- - Fix: upgrade to UR 1.80.6 or newer. The exact active plan file and main-thread
92
- delegation to UR's shipped read-only `Explore` and `Plan` agents are allowed
93
- before tasks exist. Approved plans are synchronized into visible
91
+ - UR 1.80.6 fixed this inside Plan Mode. UR 1.80.7 extends the same safe rule to
92
+ ordinary main-session research: upgrade to 1.80.7 or newer. The exact active
93
+ plan file and main-thread delegation to UR's shipped read-only `Explore` and
94
+ `Plan` agents are allowed before tasks exist. The child is forced into plan
95
+ permissions even if the parent uses Accept Edits or Approve All. Approved
96
+ plans are synchronized into visible
94
97
  implementation and verification tasks before the first project mutation.
95
98
  Other files and write-capable delegation remain protected. Existing
96
99
  actionable tasks are preserved.
@@ -100,6 +103,20 @@ ur provider status
100
103
  approve the plan first. Disabling `tasks.requireBeforeChanges` is no longer
101
104
  needed for normal plan mode.
102
105
 
106
+ ### Ollama stops with `unavailable tool "WebSearch"`
107
+
108
+ - Cause on UR 1.80.6 and older: a local model requested a provider-hosted tool
109
+ that was not present in its active tool profile. The Ollama adapter treated
110
+ the valid but unavailable tool name as a fatal provider-response error, so
111
+ the parent could not receive the research agents' remaining useful results.
112
+ - Fix: upgrade to UR 1.80.7 or newer. UR now returns a recoverable
113
+ `UnavailableTool` result without executing the call. The agent is instructed
114
+ to use an available alternative or return its partial result, and repeated
115
+ identical unavailable calls are bounded. This applies to native and
116
+ text-form calls in streaming and non-streaming Ollama responses.
117
+ - `WebSearch` is still not fabricated for a model or profile that does not have
118
+ it. Malformed tool names and malformed arguments still fail closed.
119
+
103
120
  ## Providers and models
104
121
 
105
122
  ### Provider selected but the model is unavailable
package/docs/USAGE.md CHANGED
@@ -470,11 +470,12 @@ older builds are hidden and removed at the next prompt boundary.
470
470
 
471
471
  Plan mode has one narrow exception to the mutation gate: UR may write or edit
472
472
  the exact plan file for the active session while the rest of the workspace
473
- remains read-only. The main session may also delegate early research to UR's
474
- shipped `Explore` and `Plan` agents before tasks exist. Those two definitions
475
- are mechanically held in plan permission mode; custom overrides,
476
- general-purpose agents, nested agents, team workers, and worktree agents still
477
- require an actionable parent task. When the user approves the plan,
473
+ remains read-only. In any permission mode, the main session may delegate early
474
+ research to UR's shipped `Explore` and `Plan` agents before tasks exist. Those
475
+ two definitions are mechanically forced into plan permission mode even when
476
+ the parent is in Accept Edits or Approve All. Custom overrides, general-purpose
477
+ agents, nested agents, team workers, and worktree agents still require an
478
+ actionable parent task. When the user approves the plan,
478
479
  `ExitPlanMode` preserves any existing actionable board or creates a bounded set
479
480
  of professional, deduplicated implementation tasks plus a verification task
480
481
  that depends on them. Implementation therefore starts with visible tracking
@@ -19,22 +19,37 @@ You need:
19
19
 
20
20
  ```sh
21
21
  ur --version
22
- # expected for this release: "1.80.6 (UR-Nexus)"
22
+ # expected for this release: "1.80.7 (UR-Nexus)"
23
23
  ```
24
24
 
25
- ### 0.0 Plan research delegation starts cleanly (1.80.6)
25
+ ### 0.0 Read-only research delegation starts cleanly (1.80.7)
26
26
 
27
- Start an interactive session with task enforcement enabled and ask UR to plan a
28
- change that requires codebase research. Before any task exists, built-in
29
- `Explore` and `Plan` agent calls should initialize without `TaskListRequired`.
30
- Custom or general-purpose agents should remain blocked until they have an
31
- actionable parent task. The deterministic regressions are:
27
+ Start an interactive session with task enforcement enabled and ask UR to
28
+ research a change, both normally and from Plan Mode. Before any task exists,
29
+ built-in `Explore` and `Plan` agent calls should initialize without
30
+ `TaskListRequired`. Their workers remain read-only even when the parent uses
31
+ Accept Edits or Approve All. Custom or general-purpose agents should remain
32
+ blocked until they have an actionable parent task. The deterministic
33
+ regressions are:
32
34
 
33
35
  ```sh
34
36
  bun test test/taskListGate.test.ts test/toolExecutionFinalInput.test.ts
35
37
  ```
36
38
 
37
- ### 0.0.1 Plan approval creates visible tasks (1.80.5)
39
+ ### 0.0.1 Unavailable Ollama tools recover (1.80.7)
40
+
41
+ With an Ollama model, ask for research that mentions WebSearch. If WebSearch is
42
+ not in the active profile, UR should reject that call safely and the agent
43
+ should continue with available tools or its useful partial result. It must not
44
+ end the parent turn with `Ollama response returned unavailable tool`. Native
45
+ and text-form, streaming and non-streaming regressions are covered by:
46
+
47
+ ```sh
48
+ bun test test/ollamaToolCalls.test.ts test/kimiToolCalls.test.ts \
49
+ test/repeatedFailureGuard.test.ts test/streamingToolExecutor.test.ts
50
+ ```
51
+
52
+ ### 0.0.2 Plan approval creates visible tasks (1.80.5)
38
53
 
39
54
  Start an interactive session with task enforcement enabled, ask for a
40
55
  multi-file change, and let the agent enter plan mode. Expected lifecycle:
@@ -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.80.6</p>
48
+ <p class="eyebrow">Version 1.80.7</p>
49
49
  <h1>UR-Nexus Documentation</h1>
50
50
  <p class="lead">A practical, tutorial-style reference for installing, configuring, automating, extending, and operating UR-Nexus.</p>
51
51
  </div>
@@ -7,7 +7,7 @@ plugins {
7
7
  }
8
8
 
9
9
  group = "dev.urnexus"
10
- version = "1.80.6"
10
+ version = "1.80.7"
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.80.6",
5
+ "version": "1.80.7",
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.80.6",
3
+ "version": "1.80.7",
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",