ur-agent 1.80.5 → 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,34 @@
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
+
21
+ ## 1.80.6
22
+
23
+ - Fixed Plan Mode's failed-first research delegation. UR's shipped read-only
24
+ `Explore` and `Plan` agents can now run before implementation tasks exist, as
25
+ the plan workflow already instructs, without emitting `TaskListRequired`.
26
+ - Kept the exception deliberately narrow: the active definition must be the
27
+ built-in plan-permission agent, called by the main session without a name,
28
+ team, worktree, or nested parent. Custom overrides and every write-capable
29
+ delegation still require an actionable task, and rewritten tool inputs are
30
+ revalidated immediately before execution. Approve All remains unchanged.
31
+
3
32
  ## 1.80.5
4
33
 
5
34
  - Fixed the plan-mode/task-tracking deadlock introduced by the strict task
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.5"}`;
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.5"} (${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.5"}${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.5",
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.5".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.5",
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.5"
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.5");
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.5", 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.5"}.${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();
@@ -174285,6 +174289,7 @@ var init_exploreAgent = __esm(() => {
174285
174289
  ],
174286
174290
  source: "built-in",
174287
174291
  baseDir: "built-in",
174292
+ permissionMode: "plan",
174288
174293
  model: process.env.USER_TYPE === "ant" ? "inherit" : "modelH",
174289
174294
  omitAgentMd: true,
174290
174295
  getSystemPrompt: () => getExploreSystemPrompt()
@@ -174395,6 +174400,7 @@ var init_planAgent = __esm(() => {
174395
174400
  source: "built-in",
174396
174401
  tools: EXPLORE_AGENT.tools,
174397
174402
  baseDir: "built-in",
174403
+ permissionMode: "plan",
174398
174404
  model: "inherit",
174399
174405
  omitAgentMd: true,
174400
174406
  getSystemPrompt: () => getPlanV2SystemPrompt()
@@ -184630,7 +184636,7 @@ var init_projectSafety = __esm(() => {
184630
184636
  function getInstruments() {
184631
184637
  if (instruments)
184632
184638
  return instruments;
184633
- const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.80.5");
184639
+ const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.80.7");
184634
184640
  instruments = {
184635
184641
  operationDuration: meter.createHistogram("gen_ai.client.operation.duration", {
184636
184642
  description: "GenAI operation duration.",
@@ -184728,7 +184734,7 @@ function genAiAgentAttributes() {
184728
184734
  "gen_ai.operation.name": GEN_AI_OPERATION_INVOKE_AGENT,
184729
184735
  "gen_ai.provider.name": "ur",
184730
184736
  "gen_ai.agent.name": "UR-Nexus",
184731
- "gen_ai.agent.version": "1.80.5"
184737
+ "gen_ai.agent.version": "1.80.7"
184732
184738
  };
184733
184739
  }
184734
184740
  function genAiWorkflowAttributes(workflowName, workflowRunId) {
@@ -184749,7 +184755,7 @@ function genAiWorkflowAttributes(workflowName, workflowRunId) {
184749
184755
  function startGenAiWorkflowSpan(workflowName, workflowRunId) {
184750
184756
  const attributes = genAiWorkflowAttributes(workflowName, workflowRunId);
184751
184757
  const name = typeof attributes["gen_ai.workflow.name"] === "string" ? `invoke_workflow ${attributes["gen_ai.workflow.name"]}` : GEN_AI_OPERATION_INVOKE_WORKFLOW;
184752
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.80.5").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 });
184753
184759
  }
184754
184760
  function endGenAiWorkflowSpan(span, options2 = {}) {
184755
184761
  try {
@@ -184787,7 +184793,7 @@ function startGenAiMemorySpan(operation, options2 = {}) {
184787
184793
  if (options2.recordCount !== undefined && Number.isInteger(options2.recordCount) && options2.recordCount >= 0) {
184788
184794
  attributes["gen_ai.memory.record.count"] = options2.recordCount;
184789
184795
  }
184790
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.80.5").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 });
184791
184797
  }
184792
184798
  function endGenAiMemorySpan(span, options2 = {}) {
184793
184799
  try {
@@ -278502,7 +278508,7 @@ function getTelemetryAttributes() {
278502
278508
  attributes["session.id"] = sessionId;
278503
278509
  }
278504
278510
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
278505
- attributes["app.version"] = "1.80.5";
278511
+ attributes["app.version"] = "1.80.7";
278506
278512
  }
278507
278513
  const oauthAccount = getOauthAccountInfo();
278508
278514
  if (oauthAccount) {
@@ -319493,7 +319499,7 @@ function getInstallationEnv() {
319493
319499
  return;
319494
319500
  }
319495
319501
  function getURCodeVersion() {
319496
- return "1.80.5";
319502
+ return "1.80.7";
319497
319503
  }
319498
319504
  async function getInstalledVSCodeExtensionVersion(command) {
319499
319505
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -326863,7 +326869,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
326863
326869
  const client2 = new Client({
326864
326870
  name: "ur",
326865
326871
  title: "UR",
326866
- version: "1.80.5",
326872
+ version: "1.80.7",
326867
326873
  description: "UR-Nexus autonomous engineering workflow engine",
326868
326874
  websiteUrl: PRODUCT_URL
326869
326875
  }, {
@@ -327224,7 +327230,7 @@ var init_client5 = __esm(() => {
327224
327230
  const client2 = new Client({
327225
327231
  name: "ur",
327226
327232
  title: "UR",
327227
- version: "1.80.5",
327233
+ version: "1.80.7",
327228
327234
  description: "UR-Nexus autonomous engineering workflow engine",
327229
327235
  websiteUrl: PRODUCT_URL
327230
327236
  }, {
@@ -329240,6 +329246,25 @@ var init_agentToolUtils = __esm(() => {
329240
329246
  }));
329241
329247
  });
329242
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
+
329243
329268
  // src/components/AgentProgressLine.tsx
329244
329269
  function getAgentProgressStatus({
329245
329270
  isResolved,
@@ -339962,7 +339987,7 @@ async function createRuntime() {
339962
339987
  bootstrapTelemetry();
339963
339988
  const resource = defaultResource().merge(detectResources({ detectors: [envDetector] })).merge(resourceFromAttributes({
339964
339989
  [import_semantic_conventions7.ATTR_SERVICE_NAME]: "ur-agent",
339965
- [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.80.5"
339990
+ [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.80.7"
339966
339991
  }));
339967
339992
  const tracerProvider = exporters.traces.length > 0 ? new BasicTracerProvider({
339968
339993
  resource,
@@ -339995,11 +340020,11 @@ async function createRuntime() {
339995
340020
  setMeterProvider(meterProvider);
339996
340021
  setLoggerProvider(loggerProvider);
339997
340022
  if (meterProvider) {
339998
- const meter = meterProvider.getMeter("ur-agent", "1.80.5");
340023
+ const meter = meterProvider.getMeter("ur-agent", "1.80.7");
339999
340024
  setMeter(meter, (name, options2) => meter.createCounter(name, options2));
340000
340025
  }
340001
340026
  if (loggerProvider) {
340002
- setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.80.5"));
340027
+ setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.80.7"));
340003
340028
  }
340004
340029
  if (!cleanupRegistered3) {
340005
340030
  cleanupRegistered3 = true;
@@ -340661,9 +340686,9 @@ async function assertMinVersion() {
340661
340686
  if (false) {}
340662
340687
  try {
340663
340688
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
340664
- if (versionConfig.minVersion && lt("1.80.5", versionConfig.minVersion)) {
340689
+ if (versionConfig.minVersion && lt("1.80.7", versionConfig.minVersion)) {
340665
340690
  console.error(`
340666
- It looks like your version of UR (${"1.80.5"}) needs an update.
340691
+ It looks like your version of UR (${"1.80.7"}) needs an update.
340667
340692
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
340668
340693
 
340669
340694
  To update, please run:
@@ -340879,7 +340904,7 @@ async function installGlobalPackage(specificVersion) {
340879
340904
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
340880
340905
  logEvent("tengu_auto_updater_lock_contention", {
340881
340906
  pid: process.pid,
340882
- currentVersion: "1.80.5"
340907
+ currentVersion: "1.80.7"
340883
340908
  });
340884
340909
  return "in_progress";
340885
340910
  }
@@ -340888,7 +340913,7 @@ async function installGlobalPackage(specificVersion) {
340888
340913
  if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
340889
340914
  logError2(new Error("Windows NPM detected in WSL environment"));
340890
340915
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
340891
- currentVersion: "1.80.5"
340916
+ currentVersion: "1.80.7"
340892
340917
  });
340893
340918
  console.error(`
340894
340919
  Error: Windows NPM detected in WSL
@@ -341423,7 +341448,7 @@ function detectLinuxGlobPatternWarnings() {
341423
341448
  }
341424
341449
  async function getDoctorDiagnostic() {
341425
341450
  const installationType = await getCurrentInstallationType();
341426
- const version2 = typeof MACRO !== "undefined" ? "1.80.5" : "unknown";
341451
+ const version2 = typeof MACRO !== "undefined" ? "1.80.7" : "unknown";
341427
341452
  const installationPath = await getInstallationPath();
341428
341453
  const invokedBinary = getInvokedBinary();
341429
341454
  const multipleInstallations = await detectMultipleInstallations();
@@ -342358,8 +342383,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
342358
342383
  const maxVersion = await getMaxVersion();
342359
342384
  if (maxVersion && gt(version2, maxVersion)) {
342360
342385
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
342361
- if (gte("1.80.5", maxVersion)) {
342362
- logForDebugging(`Native installer: current version ${"1.80.5"} 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`);
342363
342388
  logEvent("tengu_native_update_skipped_max_version", {
342364
342389
  latency_ms: Date.now() - startTime,
342365
342390
  max_version: maxVersion,
@@ -342370,7 +342395,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
342370
342395
  version2 = maxVersion;
342371
342396
  }
342372
342397
  }
342373
- if (!forceReinstall && version2 === "1.80.5" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
342398
+ if (!forceReinstall && version2 === "1.80.7" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
342374
342399
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
342375
342400
  logEvent("tengu_native_update_complete", {
342376
342401
  latency_ms: Date.now() - startTime,
@@ -363460,7 +363485,7 @@ async function* runAgent({
363460
363485
  const agentGetAppState = () => {
363461
363486
  const state = toolUseContext.getAppState();
363462
363487
  let toolPermissionContext = state.toolPermissionContext;
363463
- if (agentPermissionMode && state.toolPermissionContext.mode !== "bypassPermissions" && state.toolPermissionContext.mode !== "acceptEdits" && true) {
363488
+ if (agentPermissionMode && shouldApplyAgentDefinitionPermissionMode(agentDefinition, state.toolPermissionContext.mode, false)) {
363464
363489
  toolPermissionContext = {
363465
363490
  ...toolPermissionContext,
363466
363491
  mode: agentPermissionMode
@@ -363753,6 +363778,7 @@ var init_runAgent = __esm(() => {
363753
363778
  init_uuid();
363754
363779
  init_agentToolUtils();
363755
363780
  init_loadAgentsDir();
363781
+ init_readOnlyAgents();
363756
363782
  });
363757
363783
 
363758
363784
  // src/services/AgentSummary/agentSummary.ts
@@ -396226,6 +396252,8 @@ function checkTaskListGate(input) {
396226
396252
  return { allowed: true };
396227
396253
  if (input.isPlanningArtifact === true)
396228
396254
  return { allowed: true };
396255
+ if (input.isReadOnlyBuiltInDelegation === true)
396256
+ return { allowed: true };
396229
396257
  const isMutating = input.isMutating ?? isMutatingTool2(input.toolName);
396230
396258
  if (!isMutating)
396231
396259
  return { allowed: true };
@@ -400519,12 +400547,13 @@ var init_prompt18 = __esm(() => {
400519
400547
 
400520
400548
  In plan mode, you'll:
400521
400549
  1. Thoroughly explore the codebase using Glob, Grep, and Read tools
400522
- 2. Understand existing patterns and architecture
400523
- 3. Design an implementation approach
400524
- 4. Present your plan to the user for approval
400525
- 5. Use ${ASK_USER_QUESTION_TOOL_NAME} if you need to clarify approaches
400526
- 6. Use TaskCreate for manual task decomposition when useful; plan-file writes are allowed while planning
400527
- 7. Exit plan mode with ExitPlanMode when ready. After approval, ExitPlanMode guarantees that visible implementation tasks exist before coding begins
400550
+ 2. Delegate early research only to UR's shipped read-only Explore or Plan agents; other delegation requires an actionable parent task
400551
+ 3. Understand existing patterns and architecture
400552
+ 4. Design an implementation approach
400553
+ 5. Present your plan to the user for approval
400554
+ 6. Use ${ASK_USER_QUESTION_TOOL_NAME} if you need to clarify approaches
400555
+ 7. Use TaskCreate for manual task decomposition when useful; plan-file writes are allowed while planning
400556
+ 8. Exit plan mode with ExitPlanMode when ready. After approval, ExitPlanMode guarantees that visible implementation tasks exist before coding begins
400528
400557
 
400529
400558
  `;
400530
400559
  });
@@ -400643,7 +400672,7 @@ var init_EnterPlanModeTool = __esm(() => {
400643
400672
  }));
400644
400673
  return {
400645
400674
  data: {
400646
- message: "Entered plan mode. Explore the codebase and write the plan file. TaskCreate remains available for manual decomposition; after approval, ExitPlanMode guarantees visible implementation tasks before coding begins."
400675
+ message: "Entered plan mode. Explore the codebase and write the plan file. UR's shipped read-only Explore and Plan agents may assist before tasks exist; other delegation requires an actionable parent task. TaskCreate remains available for manual decomposition; after approval, ExitPlanMode guarantees visible implementation tasks before coding begins."
400647
400676
  }
400648
400677
  };
400649
400678
  },
@@ -400658,8 +400687,9 @@ In plan mode, you should:
400658
400687
  3. Consider multiple approaches and their trade-offs
400659
400688
  4. Use AskUserQuestion if you need to clarify the approach
400660
400689
  5. Design a concrete implementation strategy
400661
- 6. If useful, use TaskCreate to decompose the work manually; plan-file writes remain allowed while planning
400662
- 7. When ready, use ExitPlanMode to present your plan for approval. After approval, it guarantees visible implementation tasks before coding begins
400690
+ 6. Before tasks exist, delegate only to UR's shipped read-only Explore or Plan agents; other delegation requires an actionable parent task
400691
+ 7. If useful, use TaskCreate to decompose the work manually; plan-file writes remain allowed while planning
400692
+ 8. When ready, use ExitPlanMode to present your plan for approval. After approval, it guarantees visible implementation tasks before coding begins
400663
400693
 
400664
400694
  Remember: DO NOT write or edit any files yet. This is a read-only exploration and planning phase.`;
400665
400695
  return {
@@ -413021,7 +413051,7 @@ function isAnyTracingEnabled() {
413021
413051
  return isTelemetryEnabled() || isEnhancedTelemetryEnabled() || isBetaTracingEnabled();
413022
413052
  }
413023
413053
  function getTracer() {
413024
- return import_api39.trace.getTracer("ur-agent.gen_ai", "1.80.5");
413054
+ return import_api39.trace.getTracer("ur-agent.gen_ai", "1.80.7");
413025
413055
  }
413026
413056
  function createSpanAttributes(spanType, customAttributes = {}) {
413027
413057
  const baseAttributes = getTelemetryAttributes();
@@ -414476,6 +414506,16 @@ function isCurrentPlanFileMutation(toolName, input, context5) {
414476
414506
  return false;
414477
414507
  }
414478
414508
  }
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)) {
414511
+ return false;
414512
+ }
414513
+ const delegation = input;
414514
+ if (typeof delegation.subagent_type !== "string" || delegation.name !== undefined || delegation.team_name !== undefined || delegation.isolation !== undefined) {
414515
+ return false;
414516
+ }
414517
+ return context5.options.agentDefinitions.activeAgents.some((agent) => agent.agentType === delegation.subagent_type && isShippedReadOnlyAgentDefinition(agent));
414518
+ }
414479
414519
  function getStopHookInfo(attachment) {
414480
414520
  if (typeof attachment !== "object" || attachment === null || !("command" in attachment) || typeof attachment.command !== "string" || !("durationMs" in attachment) || typeof attachment.durationMs !== "number") {
414481
414521
  return null;
@@ -414588,13 +414628,7 @@ function getMcpServerBaseUrlFromToolName(toolName, mcpClients) {
414588
414628
  }
414589
414629
  async function* runToolUse(toolUse, assistantMessage, canUseTool, toolUseContext) {
414590
414630
  const toolName = toolUse.name;
414591
- let tool = findToolByName(toolUseContext.options.tools, toolName);
414592
- if (!tool) {
414593
- const fallbackTool = findToolByName(getAllBaseTools(), toolName);
414594
- if (fallbackTool && fallbackTool.aliases?.includes(toolName)) {
414595
- tool = fallbackTool;
414596
- }
414597
- }
414631
+ const tool = findToolByName(toolUseContext.options.tools, toolName);
414598
414632
  const messageId = assistantMessage.message?.id;
414599
414633
  if (typeof messageId !== "string" || messageId.length === 0) {
414600
414634
  throw new Error(`Cannot execute tool_use ${toolUse.id}: assistant message has no id`);
@@ -414604,7 +414638,7 @@ async function* runToolUse(toolUse, assistantMessage, canUseTool, toolUseContext
414604
414638
  const mcpServerBaseUrl = getMcpServerBaseUrlFromToolName(toolName, toolUseContext.options.mcpClients);
414605
414639
  if (!tool) {
414606
414640
  const callSig = callSignature(toolName, toolUse.input, repeatedFailureScope(toolUseContext, messageId));
414607
- const repeat2 = checkRepeatedFailure(callSig);
414641
+ const repeat2 = checkRepeatedFailure(callSig, UNKNOWN_TOOL_REPEAT_POLICY);
414608
414642
  if (repeat2.action === "abort") {
414609
414643
  throw new RepeatedToolFailureAbort(`Repeated tool failure: ${repeat2.reason}`);
414610
414644
  }
@@ -414646,17 +414680,18 @@ async function* runToolUse(toolUse, assistantMessage, canUseTool, toolUseContext
414646
414680
  },
414647
414681
  ...mcpToolDetailsForAnalytics(toolName, mcpServerType, mcpServerBaseUrl)
414648
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.`;
414649
414684
  yield {
414650
414685
  message: createUserMessage({
414651
414686
  content: [
414652
414687
  {
414653
414688
  type: "tool_result",
414654
- content: `<tool_use_error>Error: No such tool available: ${toolName}</tool_use_error>`,
414689
+ content: `<tool_use_error>UnavailableTool: ${unavailableMessage}</tool_use_error>`,
414655
414690
  is_error: true,
414656
414691
  tool_use_id: toolUse.id
414657
414692
  }
414658
414693
  ],
414659
- toolUseResult: `Error: No such tool available: ${toolName}`,
414694
+ toolUseResult: `UnavailableTool: ${unavailableMessage}`,
414660
414695
  sourceToolAssistantUUID: assistantMessage.uuid
414661
414696
  })
414662
414697
  };
@@ -414941,6 +414976,7 @@ async function checkPermissionsAndCallTool(tool, toolUseID, input, toolUseContex
414941
414976
  requiresTaskList: taskListRun?.requiresTaskList,
414942
414977
  requirementReason: taskListRun?.requirementReason,
414943
414978
  isPlanningArtifact: isCurrentPlanFileMutation(tool.name, parsedInput.data, toolUseContext),
414979
+ isReadOnlyBuiltInDelegation: isReadOnlyBuiltInDelegation(tool.name, parsedInput.data, toolUseContext),
414944
414980
  taskListWriterAvailable: toolUseContext.options.tools.some((candidate) => candidate.name === "TaskCreate")
414945
414981
  });
414946
414982
  if (gate.allowed === false) {
@@ -415302,6 +415338,7 @@ async function checkPermissionsAndCallTool(tool, toolUseID, input, toolUseContex
415302
415338
  requiresTaskList: taskListRun?.requiresTaskList,
415303
415339
  requirementReason: taskListRun?.requirementReason,
415304
415340
  isPlanningArtifact: isCurrentPlanFileMutation(tool.name, finalParsedInput.data, toolUseContext),
415341
+ isReadOnlyBuiltInDelegation: isReadOnlyBuiltInDelegation(tool.name, finalParsedInput.data, toolUseContext),
415305
415342
  taskListWriterAvailable: toolUseContext.options.tools.some((candidate) => candidate.name === "TaskCreate")
415306
415343
  });
415307
415344
  if (finalGate.allowed === false) {
@@ -415711,7 +415748,7 @@ async function checkPermissionsAndCallTool(tool, toolUseID, input, toolUseContex
415711
415748
  }
415712
415749
  }
415713
415750
  }
415714
- var 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;
415715
415752
  var init_toolExecution = __esm(() => {
415716
415753
  init_analytics();
415717
415754
  init_metadata();
@@ -415722,11 +415759,12 @@ var init_toolExecution = __esm(() => {
415722
415759
  init_AskUserQuestionTool();
415723
415760
  init_prompt();
415724
415761
  init_bashPermissions();
415762
+ init_constants2();
415763
+ init_readOnlyAgents();
415725
415764
  init_prompt3();
415726
415765
  init_prompt4();
415727
415766
  init_gitOperationTracking();
415728
415767
  init_prompt8();
415729
- init_tools2();
415730
415768
  init_attachments2();
415731
415769
  init_debug();
415732
415770
  init_errors();
@@ -415752,6 +415790,11 @@ var init_toolExecution = __esm(() => {
415752
415790
  init_mcpStringUtils();
415753
415791
  init_utils3();
415754
415792
  init_toolHooks();
415793
+ UNKNOWN_TOOL_REPEAT_POLICY = {
415794
+ enabled: true,
415795
+ limit: 1,
415796
+ abortAfter: 3
415797
+ };
415755
415798
  });
415756
415799
 
415757
415800
  // src/services/tools/StreamingToolExecutor.ts
@@ -433403,7 +433446,7 @@ function getPlanModeV2Instructions(attachment) {
433403
433446
  const agentCount = getPlanModeV2AgentCount();
433404
433447
  const exploreAgentCount = getPlanModeV2ExploreAgentCount();
433405
433448
  const planFileInfo = attachment.planExists ? `A plan file already exists at ${attachment.planFilePath}. You can read it and make incremental edits using the ${FileEditTool.name} tool.` : `No plan file exists yet. You should create your plan at ${attachment.planFilePath} using the ${FileWriteTool.name} tool.`;
433406
- const content = `Plan mode is active. The user indicated that they do not want you to execute yet -- you MUST NOT make any edits (with the exception of the plan file mentioned below), run any non-readonly tools (including changing configs or making commits), or otherwise make any changes to the system. TaskCreate, TaskUpdate, TaskList, and TaskGet are also allowed for visible task tracking. This supercedes any other instructions you have received.
433449
+ const content = `Plan mode is active. The user indicated that they do not want you to execute yet -- you MUST NOT make any edits (with the exception of the plan file mentioned below), run any non-readonly tools (including changing configs or making commits), or otherwise make any changes to the system. TaskCreate, TaskUpdate, TaskList, and TaskGet are also allowed for visible task tracking. Before tasks exist, only UR's shipped read-only ${EXPLORE_AGENT.agentType} and ${PLAN_AGENT.agentType} agents may be delegated to; custom, general-purpose, nested, team, and worktree agents still require an actionable parent task. This supercedes any other instructions you have received.
433407
433450
 
433408
433451
  ## Plan File Info:
433409
433452
  ${planFileInfo}
@@ -433478,7 +433521,7 @@ function getReadOnlyToolNames() {
433478
433521
  }
433479
433522
  function getPlanModeInterviewInstructions(attachment) {
433480
433523
  const planFileInfo = attachment.planExists ? `A plan file already exists at ${attachment.planFilePath}. You can read it and make incremental edits using the ${FileEditTool.name} tool.` : `No plan file exists yet. You should create your plan at ${attachment.planFilePath} using the ${FileWriteTool.name} tool.`;
433481
- const content = `Plan mode is active. The user indicated that they do not want you to execute yet -- you MUST NOT make any edits (with the exception of the plan file mentioned below), run any non-readonly tools (including changing configs or making commits), or otherwise make any changes to the system. TaskCreate, TaskUpdate, TaskList, and TaskGet are also allowed for visible task tracking. This supercedes any other instructions you have received.
433524
+ const content = `Plan mode is active. The user indicated that they do not want you to execute yet -- you MUST NOT make any edits (with the exception of the plan file mentioned below), run any non-readonly tools (including changing configs or making commits), or otherwise make any changes to the system. TaskCreate, TaskUpdate, TaskList, and TaskGet are also allowed for visible task tracking.${areExplorePlanAgentsEnabled() ? ` Before tasks exist, only UR's shipped read-only ${EXPLORE_AGENT.agentType} and ${PLAN_AGENT.agentType} agents may be delegated to; custom, general-purpose, nested, team, and worktree agents still require an actionable parent task.` : ""} This supercedes any other instructions you have received.
433482
433525
 
433483
433526
  ## Plan File Info:
433484
433527
  ${planFileInfo}
@@ -443127,7 +443170,7 @@ function Feedback({
443127
443170
  platform: env2.platform,
443128
443171
  gitRepo: envInfo.isGit,
443129
443172
  terminal: env2.terminal,
443130
- version: "1.80.5",
443173
+ version: "1.80.7",
443131
443174
  transcript: normalizeMessagesForAPI(messages),
443132
443175
  errors: sanitizedErrors,
443133
443176
  lastApiRequest: getLastAPIRequest(),
@@ -443319,7 +443362,7 @@ function Feedback({
443319
443362
  ", ",
443320
443363
  env2.terminal,
443321
443364
  ", v",
443322
- "1.80.5"
443365
+ "1.80.7"
443323
443366
  ]
443324
443367
  }, undefined, true, undefined, this)
443325
443368
  ]
@@ -443425,7 +443468,7 @@ ${sanitizedDescription}
443425
443468
  ` + `**Environment Info**
443426
443469
  ` + `- Platform: ${env2.platform}
443427
443470
  ` + `- Terminal: ${env2.terminal}
443428
- ` + `- Version: ${"1.80.5"}
443471
+ ` + `- Version: ${"1.80.7"}
443429
443472
  ` + `- Feedback ID: ${feedbackId}
443430
443473
  ` + `
443431
443474
  **Errors**
@@ -446535,7 +446578,7 @@ function buildPrimarySection() {
446535
446578
  }, undefined, false, undefined, this);
446536
446579
  return [{
446537
446580
  label: "Version",
446538
- value: "1.80.5"
446581
+ value: "1.80.7"
446539
446582
  }, {
446540
446583
  label: "Session name",
446541
446584
  value: nameValue
@@ -449917,7 +449960,7 @@ function Config({
449917
449960
  }
449918
449961
  }, undefined, false, undefined, this)
449919
449962
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime179.jsxDEV(ChannelDowngradeDialog, {
449920
- currentVersion: "1.80.5",
449963
+ currentVersion: "1.80.7",
449921
449964
  onChoice: (choice) => {
449922
449965
  setShowSubmenu(null);
449923
449966
  setTabsHidden(false);
@@ -449929,7 +449972,7 @@ function Config({
449929
449972
  autoUpdatesChannel: "stable"
449930
449973
  };
449931
449974
  if (choice === "stay") {
449932
- newSettings.minimumVersion = "1.80.5";
449975
+ newSettings.minimumVersion = "1.80.7";
449933
449976
  }
449934
449977
  updateSettingsForSource("userSettings", newSettings);
449935
449978
  setSettingsData((prev_27) => ({
@@ -458238,7 +458281,7 @@ function HelpV2(t0) {
458238
458281
  let t6;
458239
458282
  if ($2[31] !== tabs) {
458240
458283
  t6 = /* @__PURE__ */ jsx_dev_runtime206.jsxDEV(Tabs, {
458241
- title: `UR v${"1.80.5"}`,
458284
+ title: `UR v${"1.80.7"}`,
458242
458285
  color: "professionalBlue",
458243
458286
  defaultTab: "general",
458244
458287
  children: tabs
@@ -459171,7 +459214,7 @@ function buildToolUseContext(tools, readFileStateCache, toolPermissionContext, a
459171
459214
  async function handleInitialize(options2) {
459172
459215
  return {
459173
459216
  name: "UR",
459174
- version: "1.80.5",
459217
+ version: "1.80.7",
459175
459218
  protocolVersion: "0.1.0",
459176
459219
  workspaceRoot: options2.cwd,
459177
459220
  capabilities: {
@@ -476279,7 +476322,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
476279
476322
  return [];
476280
476323
  }
476281
476324
  }
476282
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.80.5") {
476325
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.80.7") {
476283
476326
  if (process.env.USER_TYPE === "ant") {
476284
476327
  const changelog = "";
476285
476328
  if (changelog) {
@@ -476306,7 +476349,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.80.5")
476306
476349
  releaseNotes
476307
476350
  };
476308
476351
  }
476309
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.80.5") {
476352
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.80.7") {
476310
476353
  if (process.env.USER_TYPE === "ant") {
476311
476354
  const changelog = "";
476312
476355
  if (changelog) {
@@ -479211,7 +479254,7 @@ function getRecentActivitySync() {
479211
479254
  return cachedActivity;
479212
479255
  }
479213
479256
  function getLogoDisplayData() {
479214
- const version2 = process.env.DEMO_VERSION ?? "1.80.5";
479257
+ const version2 = process.env.DEMO_VERSION ?? "1.80.7";
479215
479258
  const serverUrl = getDirectConnectServerUrl();
479216
479259
  const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd());
479217
479260
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -480079,7 +480122,7 @@ function LogoV2() {
480079
480122
  if ($2[2] === Symbol.for("react.memo_cache_sentinel")) {
480080
480123
  t2 = () => {
480081
480124
  const currentConfig = getGlobalConfig();
480082
- if (currentConfig.lastReleaseNotesSeen === "1.80.5") {
480125
+ if (currentConfig.lastReleaseNotesSeen === "1.80.7") {
480083
480126
  return;
480084
480127
  }
480085
480128
  saveGlobalConfig(_temp325);
@@ -480764,12 +480807,12 @@ function LogoV2() {
480764
480807
  return t41;
480765
480808
  }
480766
480809
  function _temp325(current) {
480767
- if (current.lastReleaseNotesSeen === "1.80.5") {
480810
+ if (current.lastReleaseNotesSeen === "1.80.7") {
480768
480811
  return current;
480769
480812
  }
480770
480813
  return {
480771
480814
  ...current,
480772
- lastReleaseNotesSeen: "1.80.5"
480815
+ lastReleaseNotesSeen: "1.80.7"
480773
480816
  };
480774
480817
  }
480775
480818
  function _temp241(s_0) {
@@ -496861,7 +496904,7 @@ function compileAgenticCiWorkflow(specName = "default", options2 = {}) {
496861
496904
  if (spec.name !== specName) {
496862
496905
  throw new Error("Agentic CI workflow spec name does not match");
496863
496906
  }
496864
- const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.80.5" : "1.80.5");
496907
+ const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.80.7" : "1.80.7");
496865
496908
  if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(packageVersion)) {
496866
496909
  throw new Error("invalid ur-agent package version");
496867
496910
  }
@@ -497854,7 +497897,7 @@ runner; \`ur trigger\` is the inbound parser that decides what to run.
497854
497897
  path: ".github/workflows/ur.yml",
497855
497898
  root: "project",
497856
497899
  content: compileAgenticCiWorkflow("default", {
497857
- packageVersion: typeof MACRO !== "undefined" ? "1.80.5" : "1.80.5"
497900
+ packageVersion: typeof MACRO !== "undefined" ? "1.80.7" : "1.80.7"
497858
497901
  })
497859
497902
  },
497860
497903
  {
@@ -497917,7 +497960,7 @@ function value(tokens, flag) {
497917
497960
  return index2 >= 0 ? tokens[index2 + 1] : undefined;
497918
497961
  }
497919
497962
  function cliVersion() {
497920
- return typeof MACRO !== "undefined" ? "1.80.5" : "1.80.5";
497963
+ return typeof MACRO !== "undefined" ? "1.80.7" : "1.80.7";
497921
497964
  }
497922
497965
  function workflowPath(cwd2) {
497923
497966
  return join168(cwd2, ".github", "workflows", "ur-agentic-ci.yml");
@@ -503773,7 +503816,7 @@ function createAcpStdioApp(deps) {
503773
503816
  }
503774
503817
  },
503775
503818
  authMethods: [],
503776
- agentInfo: { name: "UR-Nexus", version: "1.80.5" }
503819
+ agentInfo: { name: "UR-Nexus", version: "1.80.7" }
503777
503820
  })).onRequest("authenticate", () => ({})).onRequest("session/new", async (context6) => {
503778
503821
  const result = runtime2.newSession(context6.params.cwd, context6.params.mcpServers, context6.params.additionalDirectories);
503779
503822
  await runtime2.announce({
@@ -503870,7 +503913,7 @@ function createAcpStdioAgent(deps) {
503870
503913
  }
503871
503914
  },
503872
503915
  authMethods: [],
503873
- agentInfo: { name: "UR-Nexus", version: "1.80.5" }
503916
+ agentInfo: { name: "UR-Nexus", version: "1.80.7" }
503874
503917
  });
503875
503918
  return;
503876
503919
  case "authenticate":
@@ -715096,7 +715139,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
715096
715139
  smapsRollup,
715097
715140
  platform: process.platform,
715098
715141
  nodeVersion: process.version,
715099
- ccVersion: "1.80.5"
715142
+ ccVersion: "1.80.7"
715100
715143
  };
715101
715144
  }
715102
715145
  async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
@@ -715685,7 +715728,7 @@ var init_bridge_kick = __esm(() => {
715685
715728
  var call154 = async () => {
715686
715729
  return {
715687
715730
  type: "text",
715688
- value: "1.80.5"
715731
+ value: "1.80.7"
715689
715732
  };
715690
715733
  }, version2, version_default;
715691
715734
  var init_version = __esm(() => {
@@ -726928,7 +726971,7 @@ function generateHtmlReport(data, insights) {
726928
726971
  </html>`;
726929
726972
  }
726930
726973
  function buildExportData(data, insights, facets, remoteStats) {
726931
- const version3 = typeof MACRO !== "undefined" ? "1.80.5" : "unknown";
726974
+ const version3 = typeof MACRO !== "undefined" ? "1.80.7" : "unknown";
726932
726975
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
726933
726976
  const facets_summary = {
726934
726977
  total: facets.size,
@@ -731241,7 +731284,7 @@ var init_sessionStorage = __esm(() => {
731241
731284
  init_settings2();
731242
731285
  init_slowOperations();
731243
731286
  init_uuid();
731244
- VERSION7 = typeof MACRO !== "undefined" ? "1.80.5" : "unknown";
731287
+ VERSION7 = typeof MACRO !== "undefined" ? "1.80.7" : "unknown";
731245
731288
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
731246
731289
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
731247
731290
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -732456,7 +732499,7 @@ var init_filesystem = __esm(() => {
732456
732499
  });
732457
732500
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
732458
732501
  const nonce = randomBytes24(16).toString("hex");
732459
- return join243(getURTempDir(), "bundled-skills", "1.80.5", nonce);
732502
+ return join243(getURTempDir(), "bundled-skills", "1.80.7", nonce);
732460
732503
  });
732461
732504
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
732462
732505
  });
@@ -738066,6 +738109,7 @@ function getOllamaToolDisciplineSection() {
738066
738109
  return null;
738067
738110
  const items = [
738068
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.`,
738069
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.`,
738070
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.`,
738071
738115
  `Never emit an empty turn: provide a real tool call, useful user-facing text, or both.`
@@ -738075,7 +738119,7 @@ function getOllamaToolDisciplineSection() {
738075
738119
  }
738076
738120
  function getAgentToolSection() {
738077
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.`;
738078
- 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.`;
738079
738123
  }
738080
738124
  function getDiscoverSkillsGuidance() {
738081
738125
  if (false) {}
@@ -738845,7 +738889,7 @@ function computeFingerprint(messageText2, version3) {
738845
738889
  }
738846
738890
  function computeFingerprintFromMessages(messages) {
738847
738891
  const firstMessageText = extractFirstMessageText(messages);
738848
- return computeFingerprint(firstMessageText, "1.80.5");
738892
+ return computeFingerprint(firstMessageText, "1.80.7");
738849
738893
  }
738850
738894
  var FINGERPRINT_SALT = "59cf53e54c78";
738851
738895
  var init_fingerprint = () => {};
@@ -740770,7 +740814,7 @@ async function sideQuery(opts) {
740770
740814
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
740771
740815
  }
740772
740816
  const messageText2 = extractFirstUserMessageText(messages);
740773
- const fingerprint2 = computeFingerprint(messageText2, "1.80.5");
740817
+ const fingerprint2 = computeFingerprint(messageText2, "1.80.7");
740774
740818
  const attributionHeader = getAttributionHeader(fingerprint2);
740775
740819
  const systemBlocks = [
740776
740820
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -745604,7 +745648,7 @@ function buildSystemInitMessage(inputs) {
745604
745648
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
745605
745649
  apiKeySource: getURHQApiKeyWithSource().source,
745606
745650
  betas: getSdkBetas(),
745607
- ur_version: "1.80.5",
745651
+ ur_version: "1.80.7",
745608
745652
  output_style: outputStyle,
745609
745653
  agents: inputs.agents.map((agent2) => agent2.agentType),
745610
745654
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
@@ -759440,7 +759484,7 @@ var init_useVoiceEnabled = __esm(() => {
759440
759484
  function getSemverPart(version3) {
759441
759485
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
759442
759486
  }
759443
- function useUpdateNotification(updatedVersion, initialVersion = "1.80.5") {
759487
+ function useUpdateNotification(updatedVersion, initialVersion = "1.80.7") {
759444
759488
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react225.useState(() => getSemverPart(initialVersion));
759445
759489
  if (!updatedVersion) {
759446
759490
  return null;
@@ -759489,7 +759533,7 @@ function AutoUpdater({
759489
759533
  return;
759490
759534
  }
759491
759535
  if (false) {}
759492
- const currentVersion = "1.80.5";
759536
+ const currentVersion = "1.80.7";
759493
759537
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
759494
759538
  let latestVersion = await getLatestVersion(channel);
759495
759539
  const isDisabled = isAutoUpdaterDisabled();
@@ -759718,12 +759762,12 @@ function NativeAutoUpdater({
759718
759762
  logEvent("tengu_native_auto_updater_start", {});
759719
759763
  try {
759720
759764
  const maxVersion = await getMaxVersion();
759721
- if (maxVersion && gt("1.80.5", maxVersion)) {
759765
+ if (maxVersion && gt("1.80.7", maxVersion)) {
759722
759766
  const msg = await getMaxVersionMessage();
759723
759767
  setMaxVersionIssue(msg ?? "affects your version");
759724
759768
  }
759725
759769
  const result = await installLatest(channel);
759726
- const currentVersion = "1.80.5";
759770
+ const currentVersion = "1.80.7";
759727
759771
  const latencyMs = Date.now() - startTime;
759728
759772
  if (result.lockFailed) {
759729
759773
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -759860,17 +759904,17 @@ function PackageManagerAutoUpdater(t0) {
759860
759904
  const maxVersion = await getMaxVersion();
759861
759905
  if (maxVersion && latest && gt(latest, maxVersion)) {
759862
759906
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
759863
- if (gte("1.80.5", maxVersion)) {
759864
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.80.5"} 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`);
759865
759909
  setUpdateAvailable(false);
759866
759910
  return;
759867
759911
  }
759868
759912
  latest = maxVersion;
759869
759913
  }
759870
- const hasUpdate = latest && !gte("1.80.5", latest) && !shouldSkipVersion(latest);
759914
+ const hasUpdate = latest && !gte("1.80.7", latest) && !shouldSkipVersion(latest);
759871
759915
  setUpdateAvailable(!!hasUpdate);
759872
759916
  if (hasUpdate) {
759873
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.80.5"} -> ${latest}`);
759917
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.80.7"} -> ${latest}`);
759874
759918
  }
759875
759919
  };
759876
759920
  $2[0] = t1;
@@ -759904,7 +759948,7 @@ function PackageManagerAutoUpdater(t0) {
759904
759948
  wrap: "truncate",
759905
759949
  children: [
759906
759950
  "currentVersion: ",
759907
- "1.80.5"
759951
+ "1.80.7"
759908
759952
  ]
759909
759953
  }, undefined, true, undefined, this);
759910
759954
  $2[3] = verbose;
@@ -770757,7 +770801,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
770757
770801
  project_dir: getOriginalCwd(),
770758
770802
  added_dirs: addedDirs
770759
770803
  },
770760
- version: "1.80.5",
770804
+ version: "1.80.7",
770761
770805
  output_style: {
770762
770806
  name: outputStyleName
770763
770807
  },
@@ -770892,7 +770936,7 @@ function StatusLineInner({
770892
770936
  const attention = customStatusError ?? taskAttention;
770893
770937
  const terminalSize = React133.useContext(TerminalSizeContext);
770894
770938
  const defaultStatusLineText = buildDefaultStatusBar({
770895
- version: "1.80.5",
770939
+ version: "1.80.7",
770896
770940
  providerLabel: providerRuntime.providerLabel,
770897
770941
  authMode: providerRuntime.authLabel,
770898
770942
  model: renderModelName(mainLoopModel) || providerRuntime.model || "",
@@ -783147,7 +783191,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
783147
783191
  } catch {}
783148
783192
  const data = {
783149
783193
  trigger: trigger2,
783150
- version: "1.80.5",
783194
+ version: "1.80.7",
783151
783195
  platform: process.platform,
783152
783196
  transcript,
783153
783197
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -795516,7 +795560,7 @@ function WelcomeV2() {
795516
795560
  dimColor: true,
795517
795561
  children: [
795518
795562
  "v",
795519
- "1.80.5"
795563
+ "1.80.7"
795520
795564
  ]
795521
795565
  }, undefined, true, undefined, this)
795522
795566
  ]
@@ -796776,7 +796820,7 @@ function completeOnboarding() {
796776
796820
  saveGlobalConfig((current) => ({
796777
796821
  ...current,
796778
796822
  hasCompletedOnboarding: true,
796779
- lastOnboardingVersion: "1.80.5"
796823
+ lastOnboardingVersion: "1.80.7"
796780
796824
  }));
796781
796825
  }
796782
796826
  function showDialog(root2, renderer) {
@@ -801922,7 +801966,7 @@ function appendToLog(path28, message) {
801922
801966
  cwd: getFsImplementation().cwd(),
801923
801967
  userType: process.env.USER_TYPE,
801924
801968
  sessionId: getSessionId(),
801925
- version: "1.80.5"
801969
+ version: "1.80.7"
801926
801970
  };
801927
801971
  getLogWriter(path28).write(messageWithTimestamp);
801928
801972
  }
@@ -806086,8 +806130,8 @@ async function getEnvLessBridgeConfig() {
806086
806130
  }
806087
806131
  async function checkEnvLessBridgeMinVersion() {
806088
806132
  const cfg = await getEnvLessBridgeConfig();
806089
- if (cfg.min_version && lt("1.80.5", cfg.min_version)) {
806090
- return `Your version of UR (${"1.80.5"}) 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.
806091
806135
  Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
806092
806136
  }
806093
806137
  return null;
@@ -806561,7 +806605,7 @@ async function initBridgeCore(params) {
806561
806605
  const rawApi = createBridgeApiClient({
806562
806606
  baseUrl,
806563
806607
  getAccessToken,
806564
- runnerVersion: "1.80.5",
806608
+ runnerVersion: "1.80.7",
806565
806609
  onDebug: logForDebugging,
806566
806610
  onAuth401,
806567
806611
  getTrustedDeviceToken
@@ -816034,7 +816078,7 @@ function getAgUiCapabilities() {
816034
816078
  name: "UR-Nexus",
816035
816079
  type: "ur-nexus",
816036
816080
  description: "Provider-flexible, local-first autonomous engineering workflow agent.",
816037
- version: "1.80.5",
816081
+ version: "1.80.7",
816038
816082
  provider: "UR",
816039
816083
  documentationUrl: "https://github.com/Maitham16/UR/blob/master/docs/AG_UI.md"
816040
816084
  },
@@ -817261,7 +817305,7 @@ function createMCPServer(cwd4, debug2, verbose) {
817261
817305
  };
817262
817306
  const server2 = new Server({
817263
817307
  name: "ur-nexus",
817264
- version: "1.80.5"
817308
+ version: "1.80.7"
817265
817309
  }, {
817266
817310
  capabilities: {
817267
817311
  tools: {}
@@ -818465,7 +818509,7 @@ function thrownResponse(error40) {
818465
818509
  }
818466
818510
  async function createUrMcp2026Runtime(options5) {
818467
818511
  const server2 = createMCPServer(options5.cwd, options5.debug === true, options5.verbose === true);
818468
- const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.80.5" }, { capabilities: {} });
818512
+ const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.80.7" }, { capabilities: {} });
818469
818513
  const [clientTransport, serverTransport] = createLinkedTransportPair();
818470
818514
  try {
818471
818515
  await server2.connect(serverTransport);
@@ -818476,7 +818520,7 @@ async function createUrMcp2026Runtime(options5) {
818476
818520
  }
818477
818521
  const runtime2 = new Mcp2026Runtime({
818478
818522
  cwd: options5.cwd,
818479
- version: "1.80.5",
818523
+ version: "1.80.7",
818480
818524
  backend: {
818481
818525
  listTools: async () => {
818482
818526
  const listed = await client2.listTools();
@@ -821211,7 +821255,7 @@ async function update() {
821211
821255
  logEvent("tengu_update_check", {});
821212
821256
  const diagnostic2 = await getDoctorDiagnostic();
821213
821257
  const result = await checkUpgradeStatus({
821214
- currentVersion: "1.80.5",
821258
+ currentVersion: "1.80.7",
821215
821259
  packageName: UR_AGENT_PACKAGE_NAME,
821216
821260
  installationType: diagnostic2.installationType,
821217
821261
  latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
@@ -822539,7 +822583,7 @@ ${customInstructions}` : customInstructions;
822539
822583
  }
822540
822584
  }
822541
822585
  logForDiagnosticsNoPII("info", "started", {
822542
- version: "1.80.5",
822586
+ version: "1.80.7",
822543
822587
  is_native_binary: isInBundledMode()
822544
822588
  });
822545
822589
  registerCleanup(async () => {
@@ -823326,7 +823370,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
823326
823370
  pendingHookMessages
823327
823371
  }, renderAndRun);
823328
823372
  }
823329
- }).version("1.80.5 (UR-Nexus)", "-v, --version", "Output the version number");
823373
+ }).version("1.80.7 (UR-Nexus)", "-v, --version", "Output the version number");
823330
823374
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
823331
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.");
823332
823376
  if (canUserConfigureAdvisor()) {
@@ -824453,7 +824497,7 @@ if (false) {}
824453
824497
  async function main2() {
824454
824498
  const args = process.argv.slice(2);
824455
824499
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
824456
- console.log(`${"1.80.5"} (UR-Nexus)`);
824500
+ console.log(`${"1.80.7"} (UR-Nexus)`);
824457
824501
  return;
824458
824502
  }
824459
824503
  if (args[0] === "a2a" && args[1] === "serve" && !args.includes("--help") && !args.includes("-h")) {
@@ -9,6 +9,19 @@ 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
+
19
+ ## v1.80.6 Addition
20
+
21
+ | Addition | Surface | What it adds |
22
+ | --- | --- | --- |
23
+ | Read-only planning delegation | Plan mode, `Agent`, strict-hybrid task gate | Lets the shipped `Explore` and `Plan` agents research before implementation tasks exist, eliminating failed-first delegation while retaining plan permissions and task requirements for every custom, write-capable, nested, team, or worktree agent. |
24
+
12
25
  ## v1.80.5 Addition
13
26
 
14
27
  | 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,18 +83,39 @@ 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`
87
-
88
- - Likely cause on UR 1.80.3–1.80.4: the strict task gate treated the session's
89
- own plan-file update as a project mutation, creating a circular requirement
90
- for tasks before the plan could be finalized.
91
- - Fix: upgrade to UR 1.80.5 or newer. The exact active plan file is allowed
92
- during plan mode, and approved plans are synchronized into visible
86
+ ### A built-in research agent says `TaskListRequired`
87
+
88
+ - Likely cause on UR 1.80.3–1.80.5: the strict task gate treated either the
89
+ active plan file or early read-only research delegation as an untracked
90
+ project mutation, creating a circular requirement before planning finished.
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
93
97
  implementation and verification tasks before the first project mutation.
94
- Other files remain protected. Existing actionable tasks are preserved.
98
+ Other files and write-capable delegation remain protected. Existing
99
+ actionable tasks are preserved.
95
100
  - If the message names a project file rather than the active plan file, it is
96
- expected: create the requested tasks or finish and approve the plan first.
97
- Disabling `tasks.requireBeforeChanges` is no longer needed for plan mode.
101
+ expected. It is also expected for custom/general-purpose/nested/team/worktree
102
+ agents without a parent task: create the requested tasks or finish and
103
+ approve the plan first. Disabling `tasks.requireBeforeChanges` is no longer
104
+ needed for normal plan mode.
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.
98
119
 
99
120
  ## Providers and models
100
121
 
package/docs/USAGE.md CHANGED
@@ -470,11 +470,17 @@ 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. When the user approves the plan, `ExitPlanMode` preserves
474
- any existing actionable board or creates a bounded set of professional,
475
- deduplicated implementation tasks plus a verification task that depends on
476
- them. Implementation therefore starts with visible tracking without requiring
477
- the model or user to recover from a circular `TaskListRequired` error.
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,
479
+ `ExitPlanMode` preserves any existing actionable board or creates a bounded set
480
+ of professional, deduplicated implementation tasks plus a verification task
481
+ that depends on them. Implementation therefore starts with visible tracking
482
+ without requiring the model or user to recover from a circular
483
+ `TaskListRequired` error.
478
484
 
479
485
  Independent read-only tasks can run in parallel. A task that may write to the
480
486
  shared checkout is serialized with other possible writers, even when it comes
@@ -19,10 +19,37 @@ You need:
19
19
 
20
20
  ```sh
21
21
  ur --version
22
- # expected for this release: "1.80.5 (UR-Nexus)"
22
+ # expected for this release: "1.80.7 (UR-Nexus)"
23
23
  ```
24
24
 
25
- ### 0.0.1 Plan approval creates visible tasks (1.80.5)
25
+ ### 0.0 Read-only research delegation starts cleanly (1.80.7)
26
+
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:
34
+
35
+ ```sh
36
+ bun test test/taskListGate.test.ts test/toolExecutionFinalInput.test.ts
37
+ ```
38
+
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)
26
53
 
27
54
  Start an interactive session with task enforcement enabled, ask for a
28
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.5</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.5"
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.5",
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.5",
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",