ur-agent 1.80.7 → 1.80.9

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,33 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.80.9
4
+
5
+ - Fixed the remaining provider-independent `TaskListRequired` failure for
6
+ research fan-out. Some models preserved the research/report-only brief but
7
+ dropped the caller's explicit “read-only” wording while still selecting
8
+ `general-purpose`. UR now recognizes that constrained shape and reduces it
9
+ to the mechanically read-only shipped `Explore` worker before task gating.
10
+ - Kept the boundary fail-closed for any prompt that directs implementation,
11
+ building, file changes, command execution, testing, installation, commits,
12
+ deployment, or other mutation. Custom definitions, nested workers,
13
+ names/teams, worktrees, and cwd overrides remain excluded. Approve All is
14
+ unchanged.
15
+
16
+ ## 1.80.8
17
+
18
+ - Fixed provider-independent failed-first research delegation. Several model
19
+ families selected `general-purpose` even when their own worker brief said
20
+ read-only research, causing `TaskListRequired` before the research could
21
+ start. UR now safely downgrades that exact main-session contract to its
22
+ mechanically read-only shipped `Explore` agent before task gating.
23
+ - Strengthened the shared Agent prompt and Explore description so models choose
24
+ `subagent_type="Explore"` directly for task-free research. The compatibility
25
+ downgrade also recognizes “research task only; do not write files” wording.
26
+ - Kept the boundary fail-closed: implementation prompts, custom definitions,
27
+ nested workers, named/team agents, worktrees, cwd overrides, and every other
28
+ general-purpose call still require an actionable task. Permission and hook
29
+ rewrites are revalidated before execution. Approve All remains unchanged.
30
+
3
31
  ## 1.80.7
4
32
 
5
33
  - Fixed Ollama runs stopping with `response returned unavailable tool
package/dist/cli.js CHANGED
@@ -107788,7 +107788,7 @@ var init_auth = __esm(() => {
107788
107788
 
107789
107789
  // src/utils/userAgent.ts
107790
107790
  function getURCodeUserAgent() {
107791
- return `ur/${"1.80.7"}`;
107791
+ return `ur/${"1.80.9"}`;
107792
107792
  }
107793
107793
 
107794
107794
  // src/utils/workloadContext.ts
@@ -107810,7 +107810,7 @@ function getUserAgent() {
107810
107810
  const clientApp = process.env.UR_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}` : "";
107811
107811
  const workload = getWorkload();
107812
107812
  const workloadSuffix = workload ? `, workload/${workload}` : "";
107813
- return `ur-cli/${"1.80.7"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
107813
+ return `ur-cli/${"1.80.9"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
107814
107814
  }
107815
107815
  function getMCPUserAgent() {
107816
107816
  const parts = [];
@@ -107824,7 +107824,7 @@ function getMCPUserAgent() {
107824
107824
  parts.push(`client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}`);
107825
107825
  }
107826
107826
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
107827
- return `ur/${"1.80.7"}${suffix}`;
107827
+ return `ur/${"1.80.9"}${suffix}`;
107828
107828
  }
107829
107829
  function getWebFetchUserAgent() {
107830
107830
  return `UR-User (${getURCodeUserAgent()})`;
@@ -107962,7 +107962,7 @@ var init_user = __esm(() => {
107962
107962
  deviceId,
107963
107963
  sessionId: getSessionId(),
107964
107964
  email: getEmail(),
107965
- appVersion: "1.80.7",
107965
+ appVersion: "1.80.9",
107966
107966
  platform: getHostPlatformForAnalytics(),
107967
107967
  organizationUuid,
107968
107968
  accountUuid,
@@ -115849,7 +115849,7 @@ var init_metadata = __esm(() => {
115849
115849
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
115850
115850
  WHITESPACE_REGEX = /\s+/;
115851
115851
  getVersionBase = memoize_default(() => {
115852
- const match = "1.80.7".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
115852
+ const match = "1.80.9".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
115853
115853
  return match ? match[0] : undefined;
115854
115854
  });
115855
115855
  buildEnvContext = memoize_default(async () => {
@@ -115889,7 +115889,7 @@ var init_metadata = __esm(() => {
115889
115889
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
115890
115890
  isURCodeAction: isEnvTruthy(process.env.UR_CODE_ACTION),
115891
115891
  isURAiAuth: isURAISubscriber(),
115892
- version: "1.80.7",
115892
+ version: "1.80.9",
115893
115893
  versionBase: getVersionBase(),
115894
115894
  buildTime: "",
115895
115895
  deploymentEnvironment: env2.detectDeploymentEnvironment(),
@@ -116559,7 +116559,7 @@ function initialize1PEventLogging() {
116559
116559
  const platform2 = getPlatform();
116560
116560
  const attributes = {
116561
116561
  [import_semantic_conventions4.ATTR_SERVICE_NAME]: "ur",
116562
- [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.80.7"
116562
+ [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.80.9"
116563
116563
  };
116564
116564
  if (platform2 === "wsl") {
116565
116565
  const wslVersion = getWslVersion();
@@ -116587,7 +116587,7 @@ function initialize1PEventLogging() {
116587
116587
  })
116588
116588
  ]
116589
116589
  });
116590
- firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.80.7");
116590
+ firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.80.9");
116591
116591
  }
116592
116592
  async function reinitialize1PEventLoggingIfConfigChanged() {
116593
116593
  if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
@@ -126550,7 +126550,7 @@ function formatA2AAgentCard(options = {}, pretty = true) {
126550
126550
  function formatA2AV1AgentCard(options = {}, pretty = true) {
126551
126551
  return JSON.stringify(buildA2AV1AgentCard(options), null, pretty ? 2 : 0);
126552
126552
  }
126553
- var urVersion = "1.80.7", researchSnapshotDate = "2026-08-10", coverage, priorityRoadmap;
126553
+ var urVersion = "1.80.9", researchSnapshotDate = "2026-08-10", coverage, priorityRoadmap;
126554
126554
  var init_trends = __esm(() => {
126555
126555
  init_a2aCardSignature();
126556
126556
  coverage = [
@@ -129440,7 +129440,7 @@ function getAttributionHeader(fingerprint) {
129440
129440
  if (!isAttributionHeaderEnabled()) {
129441
129441
  return "";
129442
129442
  }
129443
- const version2 = `${"1.80.7"}.${fingerprint}`;
129443
+ const version2 = `${"1.80.9"}.${fingerprint}`;
129444
129444
  const entrypoint = process.env.UR_CODE_ENTRYPOINT ?? "unknown";
129445
129445
  const cch = "";
129446
129446
  const workload = getWorkload();
@@ -174270,7 +174270,7 @@ NOTE: You are meant to be a fast agent that returns output as quickly as possibl
174270
174270
 
174271
174271
  Complete the user's search request efficiently and report your findings clearly.`;
174272
174272
  }
174273
- var EXPLORE_AGENT_MIN_QUERIES = 3, EXPLORE_WHEN_TO_USE = 'Fast agent specialized for exploring codebases. Use this when you need to quickly find files by patterns (eg. "src/components/**/*.tsx"), search code for keywords (eg. "API endpoints"), or answer questions about the codebase (eg. "how do API endpoints work?"). When calling this agent, specify the desired thoroughness level: "quick" for basic searches, "medium" for moderate exploration, or "very thorough" for comprehensive analysis across multiple locations and naming conventions.', EXPLORE_AGENT;
174273
+ var EXPLORE_AGENT_MIN_QUERIES = 3, EXPLORE_WHEN_TO_USE = 'Read-only research and exploration agent. Use this for external research, source gathering, audits, codebase exploration, file-pattern searches (eg. "src/components/**/*.tsx"), code searches (eg. "API endpoints"), and questions about how a repository works. Prefer this over general-purpose whenever the worker must not modify files, especially before an actionable task exists. Specify the desired thoroughness: "quick", "medium", or "very thorough".', EXPLORE_AGENT;
174274
174274
  var init_exploreAgent = __esm(() => {
174275
174275
  init_prompt3();
174276
174276
  init_prompt4();
@@ -184636,7 +184636,7 @@ var init_projectSafety = __esm(() => {
184636
184636
  function getInstruments() {
184637
184637
  if (instruments)
184638
184638
  return instruments;
184639
- const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.80.7");
184639
+ const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.80.9");
184640
184640
  instruments = {
184641
184641
  operationDuration: meter.createHistogram("gen_ai.client.operation.duration", {
184642
184642
  description: "GenAI operation duration.",
@@ -184734,7 +184734,7 @@ function genAiAgentAttributes() {
184734
184734
  "gen_ai.operation.name": GEN_AI_OPERATION_INVOKE_AGENT,
184735
184735
  "gen_ai.provider.name": "ur",
184736
184736
  "gen_ai.agent.name": "UR-Nexus",
184737
- "gen_ai.agent.version": "1.80.7"
184737
+ "gen_ai.agent.version": "1.80.9"
184738
184738
  };
184739
184739
  }
184740
184740
  function genAiWorkflowAttributes(workflowName, workflowRunId) {
@@ -184755,7 +184755,7 @@ function genAiWorkflowAttributes(workflowName, workflowRunId) {
184755
184755
  function startGenAiWorkflowSpan(workflowName, workflowRunId) {
184756
184756
  const attributes = genAiWorkflowAttributes(workflowName, workflowRunId);
184757
184757
  const name = typeof attributes["gen_ai.workflow.name"] === "string" ? `invoke_workflow ${attributes["gen_ai.workflow.name"]}` : GEN_AI_OPERATION_INVOKE_WORKFLOW;
184758
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.80.7").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
184758
+ return import_api10.trace.getTracer("ur-agent.gen_ai", "1.80.9").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
184759
184759
  }
184760
184760
  function endGenAiWorkflowSpan(span, options2 = {}) {
184761
184761
  try {
@@ -184793,7 +184793,7 @@ function startGenAiMemorySpan(operation, options2 = {}) {
184793
184793
  if (options2.recordCount !== undefined && Number.isInteger(options2.recordCount) && options2.recordCount >= 0) {
184794
184794
  attributes["gen_ai.memory.record.count"] = options2.recordCount;
184795
184795
  }
184796
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.80.7").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
184796
+ return import_api10.trace.getTracer("ur-agent.gen_ai", "1.80.9").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
184797
184797
  }
184798
184798
  function endGenAiMemorySpan(span, options2 = {}) {
184799
184799
  try {
@@ -278508,7 +278508,7 @@ function getTelemetryAttributes() {
278508
278508
  attributes["session.id"] = sessionId;
278509
278509
  }
278510
278510
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
278511
- attributes["app.version"] = "1.80.7";
278511
+ attributes["app.version"] = "1.80.9";
278512
278512
  }
278513
278513
  const oauthAccount = getOauthAccountInfo();
278514
278514
  if (oauthAccount) {
@@ -319499,7 +319499,7 @@ function getInstallationEnv() {
319499
319499
  return;
319500
319500
  }
319501
319501
  function getURCodeVersion() {
319502
- return "1.80.7";
319502
+ return "1.80.9";
319503
319503
  }
319504
319504
  async function getInstalledVSCodeExtensionVersion(command) {
319505
319505
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -326869,7 +326869,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
326869
326869
  const client2 = new Client({
326870
326870
  name: "ur",
326871
326871
  title: "UR",
326872
- version: "1.80.7",
326872
+ version: "1.80.9",
326873
326873
  description: "UR-Nexus autonomous engineering workflow engine",
326874
326874
  websiteUrl: PRODUCT_URL
326875
326875
  }, {
@@ -327230,7 +327230,7 @@ var init_client5 = __esm(() => {
327230
327230
  const client2 = new Client({
327231
327231
  name: "ur",
327232
327232
  title: "UR",
327233
- version: "1.80.7",
327233
+ version: "1.80.9",
327234
327234
  description: "UR-Nexus autonomous engineering workflow engine",
327235
327235
  websiteUrl: PRODUCT_URL
327236
327236
  }, {
@@ -329250,6 +329250,15 @@ var init_agentToolUtils = __esm(() => {
329250
329250
  function isShippedReadOnlyAgentDefinition(agent) {
329251
329251
  return SHIPPED_READ_ONLY_AGENT_TYPES.has(agent.agentType) && agent.source === "built-in" && agent.permissionMode === "plan";
329252
329252
  }
329253
+ function normalizeReadOnlyResearchDelegation(input, activeAgents, isNestedAgent) {
329254
+ if (isNestedAgent || input.subagent_type !== "general-purpose" || input.name !== undefined || input.team_name !== undefined || input.isolation !== undefined || input.cwd !== undefined || typeof input.prompt !== "string" || !RESEARCH_INTENT_MARKER.test(input.prompt) || !READ_ONLY_RESEARCH_MARKER.test(input.prompt) && MUTATING_DELEGATION_MARKER.test(input.prompt)) {
329255
+ return input;
329256
+ }
329257
+ const exploreAgent = activeAgents.find((agent) => agent.agentType === "Explore" && isShippedReadOnlyAgentDefinition(agent));
329258
+ if (!exploreAgent)
329259
+ return input;
329260
+ return { ...input, subagent_type: exploreAgent.agentType };
329261
+ }
329253
329262
  function shouldApplyAgentDefinitionPermissionMode(agent, parentMode, transcriptClassifierEnabled) {
329254
329263
  if (!agent.permissionMode)
329255
329264
  return false;
@@ -329257,12 +329266,19 @@ function shouldApplyAgentDefinitionPermissionMode(agent, parentMode, transcriptC
329257
329266
  return true;
329258
329267
  return parentMode !== "bypassPermissions" && parentMode !== "acceptEdits" && !(transcriptClassifierEnabled && parentMode === "auto");
329259
329268
  }
329260
- var SHIPPED_READ_ONLY_AGENT_TYPES;
329269
+ var SHIPPED_READ_ONLY_AGENT_TYPES, READ_ONLY_RESEARCH_MARKER, RESEARCH_INTENT_MARKER, MUTATING_ACTION = "(?:implement(?:s|ed|ing)?|build(?:s|ing)?|built|create(?:s|d|ing)?|modif(?:y|ies|ied|ying)|edit(?:s|ed|ing)?|writ(?:e|es|ten|ing)|fix(?:es|ed|ing)?|refactor(?:s|ed|ing)?|update(?:s|d|ing)?|delete(?:s|d|ing)?|remove(?:s|d|ing)?|add(?:s|ed|ing)?|install(?:s|ed|ing)?|execute(?:s|d|ing)?|run(?:s|ning)?|commit(?:s|ted|ting)?|push(?:es|ed|ing)?|deploy(?:s|ed|ing)?|generate(?:s|d|ing)?|scaffold(?:s|ed|ing)?|author(?:s|ed|ing)?|change(?:s|d|ing)?)", MUTATING_DELEGATION_MARKER;
329261
329270
  var init_readOnlyAgents = __esm(() => {
329262
329271
  SHIPPED_READ_ONLY_AGENT_TYPES = new Set([
329263
329272
  "Explore",
329264
329273
  "Plan"
329265
329274
  ]);
329275
+ READ_ONLY_RESEARCH_MARKER = /\bread[\s-]?only\b|\b(?:do not|don't|must not|never)\s+(?:modify|write|edit|create|change)\s+(?:any\s+)?(?:code\s+)?files?\b|\bno\s+(?:file|workspace)\s+(?:changes|modifications)\b/i;
329276
+ RESEARCH_INTENT_MARKER = /\b(?:research|investigat\w*|explor\w*|analy[sz]\w*|audit\w*)\b/i;
329277
+ MUTATING_DELEGATION_MARKER = new RegExp([
329278
+ `\\b(?:and|then|also)\\s+${MUTATING_ACTION}\\b`,
329279
+ `\\b(?:please|must|should|need(?:s)?\\s+to|you(?:'ll|\\s+will|\\s+must|\\s+should))\\s+${MUTATING_ACTION}\\b`,
329280
+ `(?:^|[\\n.;:!?]\\s*|[-*]\\s+)${MUTATING_ACTION}\\b`
329281
+ ].join("|"), "i");
329266
329282
  });
329267
329283
 
329268
329284
  // src/components/AgentProgressLine.tsx
@@ -339987,7 +340003,7 @@ async function createRuntime() {
339987
340003
  bootstrapTelemetry();
339988
340004
  const resource = defaultResource().merge(detectResources({ detectors: [envDetector] })).merge(resourceFromAttributes({
339989
340005
  [import_semantic_conventions7.ATTR_SERVICE_NAME]: "ur-agent",
339990
- [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.80.7"
340006
+ [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.80.9"
339991
340007
  }));
339992
340008
  const tracerProvider = exporters.traces.length > 0 ? new BasicTracerProvider({
339993
340009
  resource,
@@ -340020,11 +340036,11 @@ async function createRuntime() {
340020
340036
  setMeterProvider(meterProvider);
340021
340037
  setLoggerProvider(loggerProvider);
340022
340038
  if (meterProvider) {
340023
- const meter = meterProvider.getMeter("ur-agent", "1.80.7");
340039
+ const meter = meterProvider.getMeter("ur-agent", "1.80.9");
340024
340040
  setMeter(meter, (name, options2) => meter.createCounter(name, options2));
340025
340041
  }
340026
340042
  if (loggerProvider) {
340027
- setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.80.7"));
340043
+ setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.80.9"));
340028
340044
  }
340029
340045
  if (!cleanupRegistered3) {
340030
340046
  cleanupRegistered3 = true;
@@ -340686,9 +340702,9 @@ async function assertMinVersion() {
340686
340702
  if (false) {}
340687
340703
  try {
340688
340704
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
340689
- if (versionConfig.minVersion && lt("1.80.7", versionConfig.minVersion)) {
340705
+ if (versionConfig.minVersion && lt("1.80.9", versionConfig.minVersion)) {
340690
340706
  console.error(`
340691
- It looks like your version of UR (${"1.80.7"}) needs an update.
340707
+ It looks like your version of UR (${"1.80.9"}) needs an update.
340692
340708
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
340693
340709
 
340694
340710
  To update, please run:
@@ -340904,7 +340920,7 @@ async function installGlobalPackage(specificVersion) {
340904
340920
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
340905
340921
  logEvent("tengu_auto_updater_lock_contention", {
340906
340922
  pid: process.pid,
340907
- currentVersion: "1.80.7"
340923
+ currentVersion: "1.80.9"
340908
340924
  });
340909
340925
  return "in_progress";
340910
340926
  }
@@ -340913,7 +340929,7 @@ async function installGlobalPackage(specificVersion) {
340913
340929
  if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
340914
340930
  logError2(new Error("Windows NPM detected in WSL environment"));
340915
340931
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
340916
- currentVersion: "1.80.7"
340932
+ currentVersion: "1.80.9"
340917
340933
  });
340918
340934
  console.error(`
340919
340935
  Error: Windows NPM detected in WSL
@@ -341448,7 +341464,7 @@ function detectLinuxGlobPatternWarnings() {
341448
341464
  }
341449
341465
  async function getDoctorDiagnostic() {
341450
341466
  const installationType = await getCurrentInstallationType();
341451
- const version2 = typeof MACRO !== "undefined" ? "1.80.7" : "unknown";
341467
+ const version2 = typeof MACRO !== "undefined" ? "1.80.9" : "unknown";
341452
341468
  const installationPath = await getInstallationPath();
341453
341469
  const invokedBinary = getInvokedBinary();
341454
341470
  const multipleInstallations = await detectMultipleInstallations();
@@ -342383,8 +342399,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
342383
342399
  const maxVersion = await getMaxVersion();
342384
342400
  if (maxVersion && gt(version2, maxVersion)) {
342385
342401
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
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`);
342402
+ if (gte("1.80.9", maxVersion)) {
342403
+ logForDebugging(`Native installer: current version ${"1.80.9"} is already at or above maxVersion ${maxVersion}, skipping update`);
342388
342404
  logEvent("tengu_native_update_skipped_max_version", {
342389
342405
  latency_ms: Date.now() - startTime,
342390
342406
  max_version: maxVersion,
@@ -342395,7 +342411,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
342395
342411
  version2 = maxVersion;
342396
342412
  }
342397
342413
  }
342398
- if (!forceReinstall && version2 === "1.80.7" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
342414
+ if (!forceReinstall && version2 === "1.80.9" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
342399
342415
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
342400
342416
  logEvent("tengu_native_update_complete", {
342401
342417
  latency_ms: Date.now() - startTime,
@@ -406705,7 +406721,7 @@ async function getPrompt9(agentDefinitions, isCoordinator, allowedAgentTypes) {
406705
406721
  ## When to fork
406706
406722
 
406707
406723
  Fork yourself (omit \`subagent_type\`) when the intermediate tool output isn't worth keeping in your context. The criterion is qualitative \u2014 "will I need this output again" \u2014 not task size.
406708
- - **Research**: fork open-ended questions. If research can be broken into independent questions, launch parallel forks in one message. A fork beats a fresh subagent for this \u2014 it inherits context and shares your cache.
406724
+ - **Research after tasks exist**: fork open-ended questions when inherited context is valuable. Before an actionable task exists, use the shipped \`Explore\` agent instead; a fork or general-purpose agent is write-capable and will be task-gated. If research can be broken into independent questions, launch parallel \`Explore\` agents in one message.
406709
406725
  - **Implementation**: fork only a bounded branch with explicit file scope. Parallel implementation forks must use isolated worktrees based on the exact clean starting revision; otherwise keep shared-checkout writers sequential. Do research before jumping to implementation.
406710
406726
 
406711
406727
  Forks are cheap because they share your prompt cache. Don't set \`model\` on a fork \u2014 a different model can't reuse the parent's cache. Pass a short \`name\` (one or two words, lowercase) so the user can see the fork in the teams panel and steer it mid-run.
@@ -413051,7 +413067,7 @@ function isAnyTracingEnabled() {
413051
413067
  return isTelemetryEnabled() || isEnhancedTelemetryEnabled() || isBetaTracingEnabled();
413052
413068
  }
413053
413069
  function getTracer() {
413054
- return import_api39.trace.getTracer("ur-agent.gen_ai", "1.80.7");
413070
+ return import_api39.trace.getTracer("ur-agent.gen_ai", "1.80.9");
413055
413071
  }
413056
413072
  function createSpanAttributes(spanType, customAttributes = {}) {
413057
413073
  const baseAttributes = getTelemetryAttributes();
@@ -414843,6 +414859,16 @@ async function checkPermissionsAndCallTool(tool, toolUseID, input, toolUseContex
414843
414859
  }
414844
414860
  }
414845
414861
  }
414862
+ if (parsedInput.success && (tool.name === AGENT_TOOL_NAME || tool.name === LEGACY_AGENT_TOOL_NAME)) {
414863
+ const normalizedDelegation = normalizeReadOnlyResearchDelegation(parsedInput.data, toolUseContext.options.agentDefinitions.activeAgents, Boolean(toolUseContext.agentId));
414864
+ if (normalizedDelegation !== parsedInput.data) {
414865
+ input = normalizedDelegation;
414866
+ parsedInput = tool.inputSchema.safeParse(input);
414867
+ logEvent("tengu_agent_read_only_research_normalized", {
414868
+ toolName: sanitizeToolNameForAnalytics(tool.name)
414869
+ });
414870
+ }
414871
+ }
414846
414872
  let callSig = callSignature(tool.name, input, repeatedFailureScope(toolUseContext, messageId));
414847
414873
  const repeat2 = checkRepeatedFailure(callSig);
414848
414874
  if (repeat2.action !== "allow") {
@@ -443170,7 +443196,7 @@ function Feedback({
443170
443196
  platform: env2.platform,
443171
443197
  gitRepo: envInfo.isGit,
443172
443198
  terminal: env2.terminal,
443173
- version: "1.80.7",
443199
+ version: "1.80.9",
443174
443200
  transcript: normalizeMessagesForAPI(messages),
443175
443201
  errors: sanitizedErrors,
443176
443202
  lastApiRequest: getLastAPIRequest(),
@@ -443362,7 +443388,7 @@ function Feedback({
443362
443388
  ", ",
443363
443389
  env2.terminal,
443364
443390
  ", v",
443365
- "1.80.7"
443391
+ "1.80.9"
443366
443392
  ]
443367
443393
  }, undefined, true, undefined, this)
443368
443394
  ]
@@ -443468,7 +443494,7 @@ ${sanitizedDescription}
443468
443494
  ` + `**Environment Info**
443469
443495
  ` + `- Platform: ${env2.platform}
443470
443496
  ` + `- Terminal: ${env2.terminal}
443471
- ` + `- Version: ${"1.80.7"}
443497
+ ` + `- Version: ${"1.80.9"}
443472
443498
  ` + `- Feedback ID: ${feedbackId}
443473
443499
  ` + `
443474
443500
  **Errors**
@@ -446578,7 +446604,7 @@ function buildPrimarySection() {
446578
446604
  }, undefined, false, undefined, this);
446579
446605
  return [{
446580
446606
  label: "Version",
446581
- value: "1.80.7"
446607
+ value: "1.80.9"
446582
446608
  }, {
446583
446609
  label: "Session name",
446584
446610
  value: nameValue
@@ -449960,7 +449986,7 @@ function Config({
449960
449986
  }
449961
449987
  }, undefined, false, undefined, this)
449962
449988
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime179.jsxDEV(ChannelDowngradeDialog, {
449963
- currentVersion: "1.80.7",
449989
+ currentVersion: "1.80.9",
449964
449990
  onChoice: (choice) => {
449965
449991
  setShowSubmenu(null);
449966
449992
  setTabsHidden(false);
@@ -449972,7 +449998,7 @@ function Config({
449972
449998
  autoUpdatesChannel: "stable"
449973
449999
  };
449974
450000
  if (choice === "stay") {
449975
- newSettings.minimumVersion = "1.80.7";
450001
+ newSettings.minimumVersion = "1.80.9";
449976
450002
  }
449977
450003
  updateSettingsForSource("userSettings", newSettings);
449978
450004
  setSettingsData((prev_27) => ({
@@ -458281,7 +458307,7 @@ function HelpV2(t0) {
458281
458307
  let t6;
458282
458308
  if ($2[31] !== tabs) {
458283
458309
  t6 = /* @__PURE__ */ jsx_dev_runtime206.jsxDEV(Tabs, {
458284
- title: `UR v${"1.80.7"}`,
458310
+ title: `UR v${"1.80.9"}`,
458285
458311
  color: "professionalBlue",
458286
458312
  defaultTab: "general",
458287
458313
  children: tabs
@@ -459214,7 +459240,7 @@ function buildToolUseContext(tools, readFileStateCache, toolPermissionContext, a
459214
459240
  async function handleInitialize(options2) {
459215
459241
  return {
459216
459242
  name: "UR",
459217
- version: "1.80.7",
459243
+ version: "1.80.9",
459218
459244
  protocolVersion: "0.1.0",
459219
459245
  workspaceRoot: options2.cwd,
459220
459246
  capabilities: {
@@ -476322,7 +476348,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
476322
476348
  return [];
476323
476349
  }
476324
476350
  }
476325
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.80.7") {
476351
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.80.9") {
476326
476352
  if (process.env.USER_TYPE === "ant") {
476327
476353
  const changelog = "";
476328
476354
  if (changelog) {
@@ -476349,7 +476375,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.80.7")
476349
476375
  releaseNotes
476350
476376
  };
476351
476377
  }
476352
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.80.7") {
476378
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.80.9") {
476353
476379
  if (process.env.USER_TYPE === "ant") {
476354
476380
  const changelog = "";
476355
476381
  if (changelog) {
@@ -479254,7 +479280,7 @@ function getRecentActivitySync() {
479254
479280
  return cachedActivity;
479255
479281
  }
479256
479282
  function getLogoDisplayData() {
479257
- const version2 = process.env.DEMO_VERSION ?? "1.80.7";
479283
+ const version2 = process.env.DEMO_VERSION ?? "1.80.9";
479258
479284
  const serverUrl = getDirectConnectServerUrl();
479259
479285
  const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd());
479260
479286
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -480122,7 +480148,7 @@ function LogoV2() {
480122
480148
  if ($2[2] === Symbol.for("react.memo_cache_sentinel")) {
480123
480149
  t2 = () => {
480124
480150
  const currentConfig = getGlobalConfig();
480125
- if (currentConfig.lastReleaseNotesSeen === "1.80.7") {
480151
+ if (currentConfig.lastReleaseNotesSeen === "1.80.9") {
480126
480152
  return;
480127
480153
  }
480128
480154
  saveGlobalConfig(_temp325);
@@ -480807,12 +480833,12 @@ function LogoV2() {
480807
480833
  return t41;
480808
480834
  }
480809
480835
  function _temp325(current) {
480810
- if (current.lastReleaseNotesSeen === "1.80.7") {
480836
+ if (current.lastReleaseNotesSeen === "1.80.9") {
480811
480837
  return current;
480812
480838
  }
480813
480839
  return {
480814
480840
  ...current,
480815
- lastReleaseNotesSeen: "1.80.7"
480841
+ lastReleaseNotesSeen: "1.80.9"
480816
480842
  };
480817
480843
  }
480818
480844
  function _temp241(s_0) {
@@ -496904,7 +496930,7 @@ function compileAgenticCiWorkflow(specName = "default", options2 = {}) {
496904
496930
  if (spec.name !== specName) {
496905
496931
  throw new Error("Agentic CI workflow spec name does not match");
496906
496932
  }
496907
- const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.80.7" : "1.80.7");
496933
+ const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.80.9" : "1.80.9");
496908
496934
  if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(packageVersion)) {
496909
496935
  throw new Error("invalid ur-agent package version");
496910
496936
  }
@@ -497897,7 +497923,7 @@ runner; \`ur trigger\` is the inbound parser that decides what to run.
497897
497923
  path: ".github/workflows/ur.yml",
497898
497924
  root: "project",
497899
497925
  content: compileAgenticCiWorkflow("default", {
497900
- packageVersion: typeof MACRO !== "undefined" ? "1.80.7" : "1.80.7"
497926
+ packageVersion: typeof MACRO !== "undefined" ? "1.80.9" : "1.80.9"
497901
497927
  })
497902
497928
  },
497903
497929
  {
@@ -497960,7 +497986,7 @@ function value(tokens, flag) {
497960
497986
  return index2 >= 0 ? tokens[index2 + 1] : undefined;
497961
497987
  }
497962
497988
  function cliVersion() {
497963
- return typeof MACRO !== "undefined" ? "1.80.7" : "1.80.7";
497989
+ return typeof MACRO !== "undefined" ? "1.80.9" : "1.80.9";
497964
497990
  }
497965
497991
  function workflowPath(cwd2) {
497966
497992
  return join168(cwd2, ".github", "workflows", "ur-agentic-ci.yml");
@@ -503816,7 +503842,7 @@ function createAcpStdioApp(deps) {
503816
503842
  }
503817
503843
  },
503818
503844
  authMethods: [],
503819
- agentInfo: { name: "UR-Nexus", version: "1.80.7" }
503845
+ agentInfo: { name: "UR-Nexus", version: "1.80.9" }
503820
503846
  })).onRequest("authenticate", () => ({})).onRequest("session/new", async (context6) => {
503821
503847
  const result = runtime2.newSession(context6.params.cwd, context6.params.mcpServers, context6.params.additionalDirectories);
503822
503848
  await runtime2.announce({
@@ -503913,7 +503939,7 @@ function createAcpStdioAgent(deps) {
503913
503939
  }
503914
503940
  },
503915
503941
  authMethods: [],
503916
- agentInfo: { name: "UR-Nexus", version: "1.80.7" }
503942
+ agentInfo: { name: "UR-Nexus", version: "1.80.9" }
503917
503943
  });
503918
503944
  return;
503919
503945
  case "authenticate":
@@ -715139,7 +715165,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
715139
715165
  smapsRollup,
715140
715166
  platform: process.platform,
715141
715167
  nodeVersion: process.version,
715142
- ccVersion: "1.80.7"
715168
+ ccVersion: "1.80.9"
715143
715169
  };
715144
715170
  }
715145
715171
  async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
@@ -715728,7 +715754,7 @@ var init_bridge_kick = __esm(() => {
715728
715754
  var call154 = async () => {
715729
715755
  return {
715730
715756
  type: "text",
715731
- value: "1.80.7"
715757
+ value: "1.80.9"
715732
715758
  };
715733
715759
  }, version2, version_default;
715734
715760
  var init_version = __esm(() => {
@@ -726971,7 +726997,7 @@ function generateHtmlReport(data, insights) {
726971
726997
  </html>`;
726972
726998
  }
726973
726999
  function buildExportData(data, insights, facets, remoteStats) {
726974
- const version3 = typeof MACRO !== "undefined" ? "1.80.7" : "unknown";
727000
+ const version3 = typeof MACRO !== "undefined" ? "1.80.9" : "unknown";
726975
727001
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
726976
727002
  const facets_summary = {
726977
727003
  total: facets.size,
@@ -731284,7 +731310,7 @@ var init_sessionStorage = __esm(() => {
731284
731310
  init_settings2();
731285
731311
  init_slowOperations();
731286
731312
  init_uuid();
731287
- VERSION7 = typeof MACRO !== "undefined" ? "1.80.7" : "unknown";
731313
+ VERSION7 = typeof MACRO !== "undefined" ? "1.80.9" : "unknown";
731288
731314
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
731289
731315
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
731290
731316
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -732499,7 +732525,7 @@ var init_filesystem = __esm(() => {
732499
732525
  });
732500
732526
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
732501
732527
  const nonce = randomBytes24(16).toString("hex");
732502
- return join243(getURTempDir(), "bundled-skills", "1.80.7", nonce);
732528
+ return join243(getURTempDir(), "bundled-skills", "1.80.9", nonce);
732503
732529
  });
732504
732530
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
732505
732531
  });
@@ -738119,7 +738145,7 @@ function getOllamaToolDisciplineSection() {
738119
738145
  }
738120
738146
  function getAgentToolSection() {
738121
738147
  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.`;
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.`;
738148
+ return `${launch} For a large request, first create a bounded task list, then delegate at most one ready independent branch per agent. Before that list exists, read-only research, audits, and exploration MUST use subagent_type="Explore" (or "Plan" for planning); never label a read-only worker general-purpose. Every custom, general-purpose, 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.`;
738123
738149
  }
738124
738150
  function getDiscoverSkillsGuidance() {
738125
738151
  if (false) {}
@@ -738889,7 +738915,7 @@ function computeFingerprint(messageText2, version3) {
738889
738915
  }
738890
738916
  function computeFingerprintFromMessages(messages) {
738891
738917
  const firstMessageText = extractFirstMessageText(messages);
738892
- return computeFingerprint(firstMessageText, "1.80.7");
738918
+ return computeFingerprint(firstMessageText, "1.80.9");
738893
738919
  }
738894
738920
  var FINGERPRINT_SALT = "59cf53e54c78";
738895
738921
  var init_fingerprint = () => {};
@@ -740814,7 +740840,7 @@ async function sideQuery(opts) {
740814
740840
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
740815
740841
  }
740816
740842
  const messageText2 = extractFirstUserMessageText(messages);
740817
- const fingerprint2 = computeFingerprint(messageText2, "1.80.7");
740843
+ const fingerprint2 = computeFingerprint(messageText2, "1.80.9");
740818
740844
  const attributionHeader = getAttributionHeader(fingerprint2);
740819
740845
  const systemBlocks = [
740820
740846
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -745648,7 +745674,7 @@ function buildSystemInitMessage(inputs) {
745648
745674
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
745649
745675
  apiKeySource: getURHQApiKeyWithSource().source,
745650
745676
  betas: getSdkBetas(),
745651
- ur_version: "1.80.7",
745677
+ ur_version: "1.80.9",
745652
745678
  output_style: outputStyle,
745653
745679
  agents: inputs.agents.map((agent2) => agent2.agentType),
745654
745680
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
@@ -759484,7 +759510,7 @@ var init_useVoiceEnabled = __esm(() => {
759484
759510
  function getSemverPart(version3) {
759485
759511
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
759486
759512
  }
759487
- function useUpdateNotification(updatedVersion, initialVersion = "1.80.7") {
759513
+ function useUpdateNotification(updatedVersion, initialVersion = "1.80.9") {
759488
759514
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react225.useState(() => getSemverPart(initialVersion));
759489
759515
  if (!updatedVersion) {
759490
759516
  return null;
@@ -759533,7 +759559,7 @@ function AutoUpdater({
759533
759559
  return;
759534
759560
  }
759535
759561
  if (false) {}
759536
- const currentVersion = "1.80.7";
759562
+ const currentVersion = "1.80.9";
759537
759563
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
759538
759564
  let latestVersion = await getLatestVersion(channel);
759539
759565
  const isDisabled = isAutoUpdaterDisabled();
@@ -759762,12 +759788,12 @@ function NativeAutoUpdater({
759762
759788
  logEvent("tengu_native_auto_updater_start", {});
759763
759789
  try {
759764
759790
  const maxVersion = await getMaxVersion();
759765
- if (maxVersion && gt("1.80.7", maxVersion)) {
759791
+ if (maxVersion && gt("1.80.9", maxVersion)) {
759766
759792
  const msg = await getMaxVersionMessage();
759767
759793
  setMaxVersionIssue(msg ?? "affects your version");
759768
759794
  }
759769
759795
  const result = await installLatest(channel);
759770
- const currentVersion = "1.80.7";
759796
+ const currentVersion = "1.80.9";
759771
759797
  const latencyMs = Date.now() - startTime;
759772
759798
  if (result.lockFailed) {
759773
759799
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -759904,17 +759930,17 @@ function PackageManagerAutoUpdater(t0) {
759904
759930
  const maxVersion = await getMaxVersion();
759905
759931
  if (maxVersion && latest && gt(latest, maxVersion)) {
759906
759932
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
759907
- if (gte("1.80.7", maxVersion)) {
759908
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.80.7"} is already at or above maxVersion ${maxVersion}, skipping update`);
759933
+ if (gte("1.80.9", maxVersion)) {
759934
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.80.9"} is already at or above maxVersion ${maxVersion}, skipping update`);
759909
759935
  setUpdateAvailable(false);
759910
759936
  return;
759911
759937
  }
759912
759938
  latest = maxVersion;
759913
759939
  }
759914
- const hasUpdate = latest && !gte("1.80.7", latest) && !shouldSkipVersion(latest);
759940
+ const hasUpdate = latest && !gte("1.80.9", latest) && !shouldSkipVersion(latest);
759915
759941
  setUpdateAvailable(!!hasUpdate);
759916
759942
  if (hasUpdate) {
759917
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.80.7"} -> ${latest}`);
759943
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.80.9"} -> ${latest}`);
759918
759944
  }
759919
759945
  };
759920
759946
  $2[0] = t1;
@@ -759948,7 +759974,7 @@ function PackageManagerAutoUpdater(t0) {
759948
759974
  wrap: "truncate",
759949
759975
  children: [
759950
759976
  "currentVersion: ",
759951
- "1.80.7"
759977
+ "1.80.9"
759952
759978
  ]
759953
759979
  }, undefined, true, undefined, this);
759954
759980
  $2[3] = verbose;
@@ -770801,7 +770827,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
770801
770827
  project_dir: getOriginalCwd(),
770802
770828
  added_dirs: addedDirs
770803
770829
  },
770804
- version: "1.80.7",
770830
+ version: "1.80.9",
770805
770831
  output_style: {
770806
770832
  name: outputStyleName
770807
770833
  },
@@ -770936,7 +770962,7 @@ function StatusLineInner({
770936
770962
  const attention = customStatusError ?? taskAttention;
770937
770963
  const terminalSize = React133.useContext(TerminalSizeContext);
770938
770964
  const defaultStatusLineText = buildDefaultStatusBar({
770939
- version: "1.80.7",
770965
+ version: "1.80.9",
770940
770966
  providerLabel: providerRuntime.providerLabel,
770941
770967
  authMode: providerRuntime.authLabel,
770942
770968
  model: renderModelName(mainLoopModel) || providerRuntime.model || "",
@@ -783191,7 +783217,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
783191
783217
  } catch {}
783192
783218
  const data = {
783193
783219
  trigger: trigger2,
783194
- version: "1.80.7",
783220
+ version: "1.80.9",
783195
783221
  platform: process.platform,
783196
783222
  transcript,
783197
783223
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -795560,7 +795586,7 @@ function WelcomeV2() {
795560
795586
  dimColor: true,
795561
795587
  children: [
795562
795588
  "v",
795563
- "1.80.7"
795589
+ "1.80.9"
795564
795590
  ]
795565
795591
  }, undefined, true, undefined, this)
795566
795592
  ]
@@ -796820,7 +796846,7 @@ function completeOnboarding() {
796820
796846
  saveGlobalConfig((current) => ({
796821
796847
  ...current,
796822
796848
  hasCompletedOnboarding: true,
796823
- lastOnboardingVersion: "1.80.7"
796849
+ lastOnboardingVersion: "1.80.9"
796824
796850
  }));
796825
796851
  }
796826
796852
  function showDialog(root2, renderer) {
@@ -801966,7 +801992,7 @@ function appendToLog(path28, message) {
801966
801992
  cwd: getFsImplementation().cwd(),
801967
801993
  userType: process.env.USER_TYPE,
801968
801994
  sessionId: getSessionId(),
801969
- version: "1.80.7"
801995
+ version: "1.80.9"
801970
801996
  };
801971
801997
  getLogWriter(path28).write(messageWithTimestamp);
801972
801998
  }
@@ -806130,8 +806156,8 @@ async function getEnvLessBridgeConfig() {
806130
806156
  }
806131
806157
  async function checkEnvLessBridgeMinVersion() {
806132
806158
  const cfg = await getEnvLessBridgeConfig();
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.
806159
+ if (cfg.min_version && lt("1.80.9", cfg.min_version)) {
806160
+ return `Your version of UR (${"1.80.9"}) is too old for Remote Control.
806135
806161
  Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
806136
806162
  }
806137
806163
  return null;
@@ -806605,7 +806631,7 @@ async function initBridgeCore(params) {
806605
806631
  const rawApi = createBridgeApiClient({
806606
806632
  baseUrl,
806607
806633
  getAccessToken,
806608
- runnerVersion: "1.80.7",
806634
+ runnerVersion: "1.80.9",
806609
806635
  onDebug: logForDebugging,
806610
806636
  onAuth401,
806611
806637
  getTrustedDeviceToken
@@ -816078,7 +816104,7 @@ function getAgUiCapabilities() {
816078
816104
  name: "UR-Nexus",
816079
816105
  type: "ur-nexus",
816080
816106
  description: "Provider-flexible, local-first autonomous engineering workflow agent.",
816081
- version: "1.80.7",
816107
+ version: "1.80.9",
816082
816108
  provider: "UR",
816083
816109
  documentationUrl: "https://github.com/Maitham16/UR/blob/master/docs/AG_UI.md"
816084
816110
  },
@@ -817305,7 +817331,7 @@ function createMCPServer(cwd4, debug2, verbose) {
817305
817331
  };
817306
817332
  const server2 = new Server({
817307
817333
  name: "ur-nexus",
817308
- version: "1.80.7"
817334
+ version: "1.80.9"
817309
817335
  }, {
817310
817336
  capabilities: {
817311
817337
  tools: {}
@@ -818509,7 +818535,7 @@ function thrownResponse(error40) {
818509
818535
  }
818510
818536
  async function createUrMcp2026Runtime(options5) {
818511
818537
  const server2 = createMCPServer(options5.cwd, options5.debug === true, options5.verbose === true);
818512
- const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.80.7" }, { capabilities: {} });
818538
+ const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.80.9" }, { capabilities: {} });
818513
818539
  const [clientTransport, serverTransport] = createLinkedTransportPair();
818514
818540
  try {
818515
818541
  await server2.connect(serverTransport);
@@ -818520,7 +818546,7 @@ async function createUrMcp2026Runtime(options5) {
818520
818546
  }
818521
818547
  const runtime2 = new Mcp2026Runtime({
818522
818548
  cwd: options5.cwd,
818523
- version: "1.80.7",
818549
+ version: "1.80.9",
818524
818550
  backend: {
818525
818551
  listTools: async () => {
818526
818552
  const listed = await client2.listTools();
@@ -821255,7 +821281,7 @@ async function update() {
821255
821281
  logEvent("tengu_update_check", {});
821256
821282
  const diagnostic2 = await getDoctorDiagnostic();
821257
821283
  const result = await checkUpgradeStatus({
821258
- currentVersion: "1.80.7",
821284
+ currentVersion: "1.80.9",
821259
821285
  packageName: UR_AGENT_PACKAGE_NAME,
821260
821286
  installationType: diagnostic2.installationType,
821261
821287
  latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
@@ -822583,7 +822609,7 @@ ${customInstructions}` : customInstructions;
822583
822609
  }
822584
822610
  }
822585
822611
  logForDiagnosticsNoPII("info", "started", {
822586
- version: "1.80.7",
822612
+ version: "1.80.9",
822587
822613
  is_native_binary: isInBundledMode()
822588
822614
  });
822589
822615
  registerCleanup(async () => {
@@ -823370,7 +823396,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
823370
823396
  pendingHookMessages
823371
823397
  }, renderAndRun);
823372
823398
  }
823373
- }).version("1.80.7 (UR-Nexus)", "-v, --version", "Output the version number");
823399
+ }).version("1.80.9 (UR-Nexus)", "-v, --version", "Output the version number");
823374
823400
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
823375
823401
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
823376
823402
  if (canUserConfigureAdvisor()) {
@@ -824497,7 +824523,7 @@ if (false) {}
824497
824523
  async function main2() {
824498
824524
  const args = process.argv.slice(2);
824499
824525
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
824500
- console.log(`${"1.80.7"} (UR-Nexus)`);
824526
+ console.log(`${"1.80.9"} (UR-Nexus)`);
824501
824527
  return;
824502
824528
  }
824503
824529
  if (args[0] === "a2a" && args[1] === "serve" && !args.includes("--help") && !args.includes("-h")) {
@@ -9,6 +9,18 @@ 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.9 Addition
13
+
14
+ | Addition | Surface | What it adds |
15
+ | --- | --- | --- |
16
+ | Research-only intent recovery | Shared Agent execution gate | Handles providers that retain a pure research/report brief but omit the caller's “read-only” wording. The call is reduced to shipped Explore capabilities; any implementation or mutation directive remains task-gated. |
17
+
18
+ ## v1.80.8 Addition
19
+
20
+ | Addition | Surface | What it adds |
21
+ | --- | --- | --- |
22
+ | Provider-independent research routing | Shared Agent prompt and execution gate | Directs every model family to use the shipped `Explore` worker for task-free read-only research. If a model still labels an explicitly read-only research brief `general-purpose`, UR reduces it to protected Explore capabilities before task gating; write-capable and custom delegation remains gated. |
23
+
12
24
  ## v1.80.7 Additions
13
25
 
14
26
  | Addition | Surface | What it adds |
@@ -60,7 +60,12 @@ gated, because they could not satisfy the requirement. The main session may
60
60
  launch UR's shipped `Explore` and `Plan` agents before a task exists in any
61
61
  permission mode. These exact built-in definitions are forced read-only; custom,
62
62
  write-capable, nested, named/team, and worktree delegation still requires an
63
- actionable parent task.
63
+ actionable parent task. As provider-independent compatibility, an unnamed
64
+ main-session `general-purpose` call is reduced to the shipped Explore definition
65
+ when its brief is explicitly read-only research or is unambiguously limited to
66
+ research and reporting. Any implementation, test, command-execution,
67
+ installation, or workspace-mutation directive keeps the call gated. It never
68
+ receives general-purpose tools through this path.
64
69
 
65
70
  ## Model Providers
66
71
 
@@ -102,6 +102,17 @@ ur provider status
102
102
  agents without a parent task: create the requested tasks or finish and
103
103
  approve the plan first. Disabling `tasks.requireBeforeChanges` is no longer
104
104
  needed for normal plan mode.
105
+ - If an API, local, or subscription-CLI model still returns this error for an
106
+ explicitly read-only research brief on 1.80.7, upgrade to 1.80.8. Some models
107
+ emitted `subagent_type: "general-purpose"` despite the read-only instruction.
108
+ UR 1.80.8 routes that narrow contract to the protected Explore worker before
109
+ the gate. A real general-purpose or implementation worker is still expected
110
+ to require a task.
111
+ - If the model preserved only the research/report instructions and omitted the
112
+ words “read-only,” upgrade to 1.80.9. UR recognizes that remaining provider
113
+ shape without relying on a specific model name. Prompts that also direct
114
+ implementation, testing, command execution, or file changes remain blocked
115
+ until an actionable task exists.
105
116
 
106
117
  ### Ollama stops with `unavailable tool "WebSearch"`
107
118
 
package/docs/USAGE.md CHANGED
@@ -473,9 +473,14 @@ the exact plan file for the active session while the rest of the workspace
473
473
  remains read-only. In any permission mode, the main session may delegate early
474
474
  research to UR's shipped `Explore` and `Plan` agents before tasks exist. Those
475
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,
476
+ the parent is in Accept Edits or Approve All. Models are instructed to select
477
+ `subagent_type="Explore"` for this work. If a provider still labels an explicit
478
+ read-only brief—or an unambiguous research-and-report-only brief—
479
+ `general-purpose`, UR reduces that main-session call to the shipped Explore
480
+ definition before gating. A brief that also directs implementation, testing,
481
+ command execution, or workspace changes remains task-gated. Ordinary
482
+ general-purpose work, custom overrides, nested agents, named/team workers,
483
+ worktrees, and cwd overrides still require an actionable parent task. When the user approves the plan,
479
484
  `ExitPlanMode` preserves any existing actionable board or creates a bounded set
480
485
  of professional, deduplicated implementation tasks plus a verification task
481
486
  that depends on them. Implementation therefore starts with visible tracking
@@ -19,18 +19,24 @@ You need:
19
19
 
20
20
  ```sh
21
21
  ur --version
22
- # expected for this release: "1.80.7 (UR-Nexus)"
22
+ # expected for this release: "1.80.9 (UR-Nexus)"
23
23
  ```
24
24
 
25
- ### 0.0 Read-only research delegation starts cleanly (1.80.7)
25
+ ### 0.0 Read-only research delegation starts cleanly (1.80.9)
26
26
 
27
27
  Start an interactive session with task enforcement enabled and ask UR to
28
28
  research a change, both normally and from Plan Mode. Before any task exists,
29
29
  built-in `Explore` and `Plan` agent calls should initialize without
30
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:
31
+ Accept Edits or Approve All. Custom agents and ordinary general-purpose agents
32
+ should remain blocked until they have an actionable parent task.
33
+
34
+ Repeat with multiple available model families. A model may correctly emit
35
+ `subagent_type: "Explore"`; if it instead emits `general-purpose` with an
36
+ explicit read-only brief or a pure research/report-only brief, UR must safely
37
+ reduce it to Explore and start without a failed `TaskListRequired` attempt. A
38
+ brief that also requests implementation, tests, command execution, or file
39
+ changes must remain blocked. The deterministic regressions are:
34
40
 
35
41
  ```sh
36
42
  bun test test/taskListGate.test.ts test/toolExecutionFinalInput.test.ts
@@ -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.7</p>
48
+ <p class="eyebrow">Version 1.80.9</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.7"
10
+ version = "1.80.9"
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.7",
5
+ "version": "1.80.9",
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.7",
3
+ "version": "1.80.9",
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",