ur-agent 1.80.8 → 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,18 @@
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
+
3
16
  ## 1.80.8
4
17
 
5
18
  - Fixed provider-independent failed-first research delegation. Several model
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.8"}`;
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.8"} (${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.8"}${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.8",
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.8".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.8",
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.8"
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.8");
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.8", 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.8"}.${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();
@@ -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.8");
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.8"
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.8").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.8").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.8";
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.8";
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.8",
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.8",
327233
+ version: "1.80.9",
327234
327234
  description: "UR-Nexus autonomous engineering workflow engine",
327235
327235
  websiteUrl: PRODUCT_URL
327236
327236
  }, {
@@ -329251,7 +329251,7 @@ function isShippedReadOnlyAgentDefinition(agent) {
329251
329251
  return SHIPPED_READ_ONLY_AGENT_TYPES.has(agent.agentType) && agent.source === "built-in" && agent.permissionMode === "plan";
329252
329252
  }
329253
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" || !READ_ONLY_RESEARCH_MARKER.test(input.prompt) || !RESEARCH_INTENT_MARKER.test(input.prompt)) {
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
329255
  return input;
329256
329256
  }
329257
329257
  const exploreAgent = activeAgents.find((agent) => agent.agentType === "Explore" && isShippedReadOnlyAgentDefinition(agent));
@@ -329266,7 +329266,7 @@ function shouldApplyAgentDefinitionPermissionMode(agent, parentMode, transcriptC
329266
329266
  return true;
329267
329267
  return parentMode !== "bypassPermissions" && parentMode !== "acceptEdits" && !(transcriptClassifierEnabled && parentMode === "auto");
329268
329268
  }
329269
- var SHIPPED_READ_ONLY_AGENT_TYPES, READ_ONLY_RESEARCH_MARKER, RESEARCH_INTENT_MARKER;
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;
329270
329270
  var init_readOnlyAgents = __esm(() => {
329271
329271
  SHIPPED_READ_ONLY_AGENT_TYPES = new Set([
329272
329272
  "Explore",
@@ -329274,6 +329274,11 @@ var init_readOnlyAgents = __esm(() => {
329274
329274
  ]);
329275
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
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");
329277
329282
  });
329278
329283
 
329279
329284
  // src/components/AgentProgressLine.tsx
@@ -339998,7 +340003,7 @@ async function createRuntime() {
339998
340003
  bootstrapTelemetry();
339999
340004
  const resource = defaultResource().merge(detectResources({ detectors: [envDetector] })).merge(resourceFromAttributes({
340000
340005
  [import_semantic_conventions7.ATTR_SERVICE_NAME]: "ur-agent",
340001
- [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.80.8"
340006
+ [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.80.9"
340002
340007
  }));
340003
340008
  const tracerProvider = exporters.traces.length > 0 ? new BasicTracerProvider({
340004
340009
  resource,
@@ -340031,11 +340036,11 @@ async function createRuntime() {
340031
340036
  setMeterProvider(meterProvider);
340032
340037
  setLoggerProvider(loggerProvider);
340033
340038
  if (meterProvider) {
340034
- const meter = meterProvider.getMeter("ur-agent", "1.80.8");
340039
+ const meter = meterProvider.getMeter("ur-agent", "1.80.9");
340035
340040
  setMeter(meter, (name, options2) => meter.createCounter(name, options2));
340036
340041
  }
340037
340042
  if (loggerProvider) {
340038
- setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.80.8"));
340043
+ setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.80.9"));
340039
340044
  }
340040
340045
  if (!cleanupRegistered3) {
340041
340046
  cleanupRegistered3 = true;
@@ -340697,9 +340702,9 @@ async function assertMinVersion() {
340697
340702
  if (false) {}
340698
340703
  try {
340699
340704
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
340700
- if (versionConfig.minVersion && lt("1.80.8", versionConfig.minVersion)) {
340705
+ if (versionConfig.minVersion && lt("1.80.9", versionConfig.minVersion)) {
340701
340706
  console.error(`
340702
- It looks like your version of UR (${"1.80.8"}) needs an update.
340707
+ It looks like your version of UR (${"1.80.9"}) needs an update.
340703
340708
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
340704
340709
 
340705
340710
  To update, please run:
@@ -340915,7 +340920,7 @@ async function installGlobalPackage(specificVersion) {
340915
340920
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
340916
340921
  logEvent("tengu_auto_updater_lock_contention", {
340917
340922
  pid: process.pid,
340918
- currentVersion: "1.80.8"
340923
+ currentVersion: "1.80.9"
340919
340924
  });
340920
340925
  return "in_progress";
340921
340926
  }
@@ -340924,7 +340929,7 @@ async function installGlobalPackage(specificVersion) {
340924
340929
  if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
340925
340930
  logError2(new Error("Windows NPM detected in WSL environment"));
340926
340931
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
340927
- currentVersion: "1.80.8"
340932
+ currentVersion: "1.80.9"
340928
340933
  });
340929
340934
  console.error(`
340930
340935
  Error: Windows NPM detected in WSL
@@ -341459,7 +341464,7 @@ function detectLinuxGlobPatternWarnings() {
341459
341464
  }
341460
341465
  async function getDoctorDiagnostic() {
341461
341466
  const installationType = await getCurrentInstallationType();
341462
- const version2 = typeof MACRO !== "undefined" ? "1.80.8" : "unknown";
341467
+ const version2 = typeof MACRO !== "undefined" ? "1.80.9" : "unknown";
341463
341468
  const installationPath = await getInstallationPath();
341464
341469
  const invokedBinary = getInvokedBinary();
341465
341470
  const multipleInstallations = await detectMultipleInstallations();
@@ -342394,8 +342399,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
342394
342399
  const maxVersion = await getMaxVersion();
342395
342400
  if (maxVersion && gt(version2, maxVersion)) {
342396
342401
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
342397
- if (gte("1.80.8", maxVersion)) {
342398
- logForDebugging(`Native installer: current version ${"1.80.8"} 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`);
342399
342404
  logEvent("tengu_native_update_skipped_max_version", {
342400
342405
  latency_ms: Date.now() - startTime,
342401
342406
  max_version: maxVersion,
@@ -342406,7 +342411,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
342406
342411
  version2 = maxVersion;
342407
342412
  }
342408
342413
  }
342409
- if (!forceReinstall && version2 === "1.80.8" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
342414
+ if (!forceReinstall && version2 === "1.80.9" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
342410
342415
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
342411
342416
  logEvent("tengu_native_update_complete", {
342412
342417
  latency_ms: Date.now() - startTime,
@@ -413062,7 +413067,7 @@ function isAnyTracingEnabled() {
413062
413067
  return isTelemetryEnabled() || isEnhancedTelemetryEnabled() || isBetaTracingEnabled();
413063
413068
  }
413064
413069
  function getTracer() {
413065
- return import_api39.trace.getTracer("ur-agent.gen_ai", "1.80.8");
413070
+ return import_api39.trace.getTracer("ur-agent.gen_ai", "1.80.9");
413066
413071
  }
413067
413072
  function createSpanAttributes(spanType, customAttributes = {}) {
413068
413073
  const baseAttributes = getTelemetryAttributes();
@@ -443191,7 +443196,7 @@ function Feedback({
443191
443196
  platform: env2.platform,
443192
443197
  gitRepo: envInfo.isGit,
443193
443198
  terminal: env2.terminal,
443194
- version: "1.80.8",
443199
+ version: "1.80.9",
443195
443200
  transcript: normalizeMessagesForAPI(messages),
443196
443201
  errors: sanitizedErrors,
443197
443202
  lastApiRequest: getLastAPIRequest(),
@@ -443383,7 +443388,7 @@ function Feedback({
443383
443388
  ", ",
443384
443389
  env2.terminal,
443385
443390
  ", v",
443386
- "1.80.8"
443391
+ "1.80.9"
443387
443392
  ]
443388
443393
  }, undefined, true, undefined, this)
443389
443394
  ]
@@ -443489,7 +443494,7 @@ ${sanitizedDescription}
443489
443494
  ` + `**Environment Info**
443490
443495
  ` + `- Platform: ${env2.platform}
443491
443496
  ` + `- Terminal: ${env2.terminal}
443492
- ` + `- Version: ${"1.80.8"}
443497
+ ` + `- Version: ${"1.80.9"}
443493
443498
  ` + `- Feedback ID: ${feedbackId}
443494
443499
  ` + `
443495
443500
  **Errors**
@@ -446599,7 +446604,7 @@ function buildPrimarySection() {
446599
446604
  }, undefined, false, undefined, this);
446600
446605
  return [{
446601
446606
  label: "Version",
446602
- value: "1.80.8"
446607
+ value: "1.80.9"
446603
446608
  }, {
446604
446609
  label: "Session name",
446605
446610
  value: nameValue
@@ -449981,7 +449986,7 @@ function Config({
449981
449986
  }
449982
449987
  }, undefined, false, undefined, this)
449983
449988
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime179.jsxDEV(ChannelDowngradeDialog, {
449984
- currentVersion: "1.80.8",
449989
+ currentVersion: "1.80.9",
449985
449990
  onChoice: (choice) => {
449986
449991
  setShowSubmenu(null);
449987
449992
  setTabsHidden(false);
@@ -449993,7 +449998,7 @@ function Config({
449993
449998
  autoUpdatesChannel: "stable"
449994
449999
  };
449995
450000
  if (choice === "stay") {
449996
- newSettings.minimumVersion = "1.80.8";
450001
+ newSettings.minimumVersion = "1.80.9";
449997
450002
  }
449998
450003
  updateSettingsForSource("userSettings", newSettings);
449999
450004
  setSettingsData((prev_27) => ({
@@ -458302,7 +458307,7 @@ function HelpV2(t0) {
458302
458307
  let t6;
458303
458308
  if ($2[31] !== tabs) {
458304
458309
  t6 = /* @__PURE__ */ jsx_dev_runtime206.jsxDEV(Tabs, {
458305
- title: `UR v${"1.80.8"}`,
458310
+ title: `UR v${"1.80.9"}`,
458306
458311
  color: "professionalBlue",
458307
458312
  defaultTab: "general",
458308
458313
  children: tabs
@@ -459235,7 +459240,7 @@ function buildToolUseContext(tools, readFileStateCache, toolPermissionContext, a
459235
459240
  async function handleInitialize(options2) {
459236
459241
  return {
459237
459242
  name: "UR",
459238
- version: "1.80.8",
459243
+ version: "1.80.9",
459239
459244
  protocolVersion: "0.1.0",
459240
459245
  workspaceRoot: options2.cwd,
459241
459246
  capabilities: {
@@ -476343,7 +476348,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
476343
476348
  return [];
476344
476349
  }
476345
476350
  }
476346
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.80.8") {
476351
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.80.9") {
476347
476352
  if (process.env.USER_TYPE === "ant") {
476348
476353
  const changelog = "";
476349
476354
  if (changelog) {
@@ -476370,7 +476375,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.80.8")
476370
476375
  releaseNotes
476371
476376
  };
476372
476377
  }
476373
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.80.8") {
476378
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.80.9") {
476374
476379
  if (process.env.USER_TYPE === "ant") {
476375
476380
  const changelog = "";
476376
476381
  if (changelog) {
@@ -479275,7 +479280,7 @@ function getRecentActivitySync() {
479275
479280
  return cachedActivity;
479276
479281
  }
479277
479282
  function getLogoDisplayData() {
479278
- const version2 = process.env.DEMO_VERSION ?? "1.80.8";
479283
+ const version2 = process.env.DEMO_VERSION ?? "1.80.9";
479279
479284
  const serverUrl = getDirectConnectServerUrl();
479280
479285
  const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd());
479281
479286
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -480143,7 +480148,7 @@ function LogoV2() {
480143
480148
  if ($2[2] === Symbol.for("react.memo_cache_sentinel")) {
480144
480149
  t2 = () => {
480145
480150
  const currentConfig = getGlobalConfig();
480146
- if (currentConfig.lastReleaseNotesSeen === "1.80.8") {
480151
+ if (currentConfig.lastReleaseNotesSeen === "1.80.9") {
480147
480152
  return;
480148
480153
  }
480149
480154
  saveGlobalConfig(_temp325);
@@ -480828,12 +480833,12 @@ function LogoV2() {
480828
480833
  return t41;
480829
480834
  }
480830
480835
  function _temp325(current) {
480831
- if (current.lastReleaseNotesSeen === "1.80.8") {
480836
+ if (current.lastReleaseNotesSeen === "1.80.9") {
480832
480837
  return current;
480833
480838
  }
480834
480839
  return {
480835
480840
  ...current,
480836
- lastReleaseNotesSeen: "1.80.8"
480841
+ lastReleaseNotesSeen: "1.80.9"
480837
480842
  };
480838
480843
  }
480839
480844
  function _temp241(s_0) {
@@ -496925,7 +496930,7 @@ function compileAgenticCiWorkflow(specName = "default", options2 = {}) {
496925
496930
  if (spec.name !== specName) {
496926
496931
  throw new Error("Agentic CI workflow spec name does not match");
496927
496932
  }
496928
- const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.80.8" : "1.80.8");
496933
+ const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.80.9" : "1.80.9");
496929
496934
  if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(packageVersion)) {
496930
496935
  throw new Error("invalid ur-agent package version");
496931
496936
  }
@@ -497918,7 +497923,7 @@ runner; \`ur trigger\` is the inbound parser that decides what to run.
497918
497923
  path: ".github/workflows/ur.yml",
497919
497924
  root: "project",
497920
497925
  content: compileAgenticCiWorkflow("default", {
497921
- packageVersion: typeof MACRO !== "undefined" ? "1.80.8" : "1.80.8"
497926
+ packageVersion: typeof MACRO !== "undefined" ? "1.80.9" : "1.80.9"
497922
497927
  })
497923
497928
  },
497924
497929
  {
@@ -497981,7 +497986,7 @@ function value(tokens, flag) {
497981
497986
  return index2 >= 0 ? tokens[index2 + 1] : undefined;
497982
497987
  }
497983
497988
  function cliVersion() {
497984
- return typeof MACRO !== "undefined" ? "1.80.8" : "1.80.8";
497989
+ return typeof MACRO !== "undefined" ? "1.80.9" : "1.80.9";
497985
497990
  }
497986
497991
  function workflowPath(cwd2) {
497987
497992
  return join168(cwd2, ".github", "workflows", "ur-agentic-ci.yml");
@@ -503837,7 +503842,7 @@ function createAcpStdioApp(deps) {
503837
503842
  }
503838
503843
  },
503839
503844
  authMethods: [],
503840
- agentInfo: { name: "UR-Nexus", version: "1.80.8" }
503845
+ agentInfo: { name: "UR-Nexus", version: "1.80.9" }
503841
503846
  })).onRequest("authenticate", () => ({})).onRequest("session/new", async (context6) => {
503842
503847
  const result = runtime2.newSession(context6.params.cwd, context6.params.mcpServers, context6.params.additionalDirectories);
503843
503848
  await runtime2.announce({
@@ -503934,7 +503939,7 @@ function createAcpStdioAgent(deps) {
503934
503939
  }
503935
503940
  },
503936
503941
  authMethods: [],
503937
- agentInfo: { name: "UR-Nexus", version: "1.80.8" }
503942
+ agentInfo: { name: "UR-Nexus", version: "1.80.9" }
503938
503943
  });
503939
503944
  return;
503940
503945
  case "authenticate":
@@ -715160,7 +715165,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
715160
715165
  smapsRollup,
715161
715166
  platform: process.platform,
715162
715167
  nodeVersion: process.version,
715163
- ccVersion: "1.80.8"
715168
+ ccVersion: "1.80.9"
715164
715169
  };
715165
715170
  }
715166
715171
  async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
@@ -715749,7 +715754,7 @@ var init_bridge_kick = __esm(() => {
715749
715754
  var call154 = async () => {
715750
715755
  return {
715751
715756
  type: "text",
715752
- value: "1.80.8"
715757
+ value: "1.80.9"
715753
715758
  };
715754
715759
  }, version2, version_default;
715755
715760
  var init_version = __esm(() => {
@@ -726992,7 +726997,7 @@ function generateHtmlReport(data, insights) {
726992
726997
  </html>`;
726993
726998
  }
726994
726999
  function buildExportData(data, insights, facets, remoteStats) {
726995
- const version3 = typeof MACRO !== "undefined" ? "1.80.8" : "unknown";
727000
+ const version3 = typeof MACRO !== "undefined" ? "1.80.9" : "unknown";
726996
727001
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
726997
727002
  const facets_summary = {
726998
727003
  total: facets.size,
@@ -731305,7 +731310,7 @@ var init_sessionStorage = __esm(() => {
731305
731310
  init_settings2();
731306
731311
  init_slowOperations();
731307
731312
  init_uuid();
731308
- VERSION7 = typeof MACRO !== "undefined" ? "1.80.8" : "unknown";
731313
+ VERSION7 = typeof MACRO !== "undefined" ? "1.80.9" : "unknown";
731309
731314
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
731310
731315
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
731311
731316
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -732520,7 +732525,7 @@ var init_filesystem = __esm(() => {
732520
732525
  });
732521
732526
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
732522
732527
  const nonce = randomBytes24(16).toString("hex");
732523
- return join243(getURTempDir(), "bundled-skills", "1.80.8", nonce);
732528
+ return join243(getURTempDir(), "bundled-skills", "1.80.9", nonce);
732524
732529
  });
732525
732530
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
732526
732531
  });
@@ -738910,7 +738915,7 @@ function computeFingerprint(messageText2, version3) {
738910
738915
  }
738911
738916
  function computeFingerprintFromMessages(messages) {
738912
738917
  const firstMessageText = extractFirstMessageText(messages);
738913
- return computeFingerprint(firstMessageText, "1.80.8");
738918
+ return computeFingerprint(firstMessageText, "1.80.9");
738914
738919
  }
738915
738920
  var FINGERPRINT_SALT = "59cf53e54c78";
738916
738921
  var init_fingerprint = () => {};
@@ -740835,7 +740840,7 @@ async function sideQuery(opts) {
740835
740840
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
740836
740841
  }
740837
740842
  const messageText2 = extractFirstUserMessageText(messages);
740838
- const fingerprint2 = computeFingerprint(messageText2, "1.80.8");
740843
+ const fingerprint2 = computeFingerprint(messageText2, "1.80.9");
740839
740844
  const attributionHeader = getAttributionHeader(fingerprint2);
740840
740845
  const systemBlocks = [
740841
740846
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -745669,7 +745674,7 @@ function buildSystemInitMessage(inputs) {
745669
745674
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
745670
745675
  apiKeySource: getURHQApiKeyWithSource().source,
745671
745676
  betas: getSdkBetas(),
745672
- ur_version: "1.80.8",
745677
+ ur_version: "1.80.9",
745673
745678
  output_style: outputStyle,
745674
745679
  agents: inputs.agents.map((agent2) => agent2.agentType),
745675
745680
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
@@ -759505,7 +759510,7 @@ var init_useVoiceEnabled = __esm(() => {
759505
759510
  function getSemverPart(version3) {
759506
759511
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
759507
759512
  }
759508
- function useUpdateNotification(updatedVersion, initialVersion = "1.80.8") {
759513
+ function useUpdateNotification(updatedVersion, initialVersion = "1.80.9") {
759509
759514
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react225.useState(() => getSemverPart(initialVersion));
759510
759515
  if (!updatedVersion) {
759511
759516
  return null;
@@ -759554,7 +759559,7 @@ function AutoUpdater({
759554
759559
  return;
759555
759560
  }
759556
759561
  if (false) {}
759557
- const currentVersion = "1.80.8";
759562
+ const currentVersion = "1.80.9";
759558
759563
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
759559
759564
  let latestVersion = await getLatestVersion(channel);
759560
759565
  const isDisabled = isAutoUpdaterDisabled();
@@ -759783,12 +759788,12 @@ function NativeAutoUpdater({
759783
759788
  logEvent("tengu_native_auto_updater_start", {});
759784
759789
  try {
759785
759790
  const maxVersion = await getMaxVersion();
759786
- if (maxVersion && gt("1.80.8", maxVersion)) {
759791
+ if (maxVersion && gt("1.80.9", maxVersion)) {
759787
759792
  const msg = await getMaxVersionMessage();
759788
759793
  setMaxVersionIssue(msg ?? "affects your version");
759789
759794
  }
759790
759795
  const result = await installLatest(channel);
759791
- const currentVersion = "1.80.8";
759796
+ const currentVersion = "1.80.9";
759792
759797
  const latencyMs = Date.now() - startTime;
759793
759798
  if (result.lockFailed) {
759794
759799
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -759925,17 +759930,17 @@ function PackageManagerAutoUpdater(t0) {
759925
759930
  const maxVersion = await getMaxVersion();
759926
759931
  if (maxVersion && latest && gt(latest, maxVersion)) {
759927
759932
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
759928
- if (gte("1.80.8", maxVersion)) {
759929
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.80.8"} 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`);
759930
759935
  setUpdateAvailable(false);
759931
759936
  return;
759932
759937
  }
759933
759938
  latest = maxVersion;
759934
759939
  }
759935
- const hasUpdate = latest && !gte("1.80.8", latest) && !shouldSkipVersion(latest);
759940
+ const hasUpdate = latest && !gte("1.80.9", latest) && !shouldSkipVersion(latest);
759936
759941
  setUpdateAvailable(!!hasUpdate);
759937
759942
  if (hasUpdate) {
759938
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.80.8"} -> ${latest}`);
759943
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.80.9"} -> ${latest}`);
759939
759944
  }
759940
759945
  };
759941
759946
  $2[0] = t1;
@@ -759969,7 +759974,7 @@ function PackageManagerAutoUpdater(t0) {
759969
759974
  wrap: "truncate",
759970
759975
  children: [
759971
759976
  "currentVersion: ",
759972
- "1.80.8"
759977
+ "1.80.9"
759973
759978
  ]
759974
759979
  }, undefined, true, undefined, this);
759975
759980
  $2[3] = verbose;
@@ -770822,7 +770827,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
770822
770827
  project_dir: getOriginalCwd(),
770823
770828
  added_dirs: addedDirs
770824
770829
  },
770825
- version: "1.80.8",
770830
+ version: "1.80.9",
770826
770831
  output_style: {
770827
770832
  name: outputStyleName
770828
770833
  },
@@ -770957,7 +770962,7 @@ function StatusLineInner({
770957
770962
  const attention = customStatusError ?? taskAttention;
770958
770963
  const terminalSize = React133.useContext(TerminalSizeContext);
770959
770964
  const defaultStatusLineText = buildDefaultStatusBar({
770960
- version: "1.80.8",
770965
+ version: "1.80.9",
770961
770966
  providerLabel: providerRuntime.providerLabel,
770962
770967
  authMode: providerRuntime.authLabel,
770963
770968
  model: renderModelName(mainLoopModel) || providerRuntime.model || "",
@@ -783212,7 +783217,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
783212
783217
  } catch {}
783213
783218
  const data = {
783214
783219
  trigger: trigger2,
783215
- version: "1.80.8",
783220
+ version: "1.80.9",
783216
783221
  platform: process.platform,
783217
783222
  transcript,
783218
783223
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -795581,7 +795586,7 @@ function WelcomeV2() {
795581
795586
  dimColor: true,
795582
795587
  children: [
795583
795588
  "v",
795584
- "1.80.8"
795589
+ "1.80.9"
795585
795590
  ]
795586
795591
  }, undefined, true, undefined, this)
795587
795592
  ]
@@ -796841,7 +796846,7 @@ function completeOnboarding() {
796841
796846
  saveGlobalConfig((current) => ({
796842
796847
  ...current,
796843
796848
  hasCompletedOnboarding: true,
796844
- lastOnboardingVersion: "1.80.8"
796849
+ lastOnboardingVersion: "1.80.9"
796845
796850
  }));
796846
796851
  }
796847
796852
  function showDialog(root2, renderer) {
@@ -801987,7 +801992,7 @@ function appendToLog(path28, message) {
801987
801992
  cwd: getFsImplementation().cwd(),
801988
801993
  userType: process.env.USER_TYPE,
801989
801994
  sessionId: getSessionId(),
801990
- version: "1.80.8"
801995
+ version: "1.80.9"
801991
801996
  };
801992
801997
  getLogWriter(path28).write(messageWithTimestamp);
801993
801998
  }
@@ -806151,8 +806156,8 @@ async function getEnvLessBridgeConfig() {
806151
806156
  }
806152
806157
  async function checkEnvLessBridgeMinVersion() {
806153
806158
  const cfg = await getEnvLessBridgeConfig();
806154
- if (cfg.min_version && lt("1.80.8", cfg.min_version)) {
806155
- return `Your version of UR (${"1.80.8"}) 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.
806156
806161
  Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
806157
806162
  }
806158
806163
  return null;
@@ -806626,7 +806631,7 @@ async function initBridgeCore(params) {
806626
806631
  const rawApi = createBridgeApiClient({
806627
806632
  baseUrl,
806628
806633
  getAccessToken,
806629
- runnerVersion: "1.80.8",
806634
+ runnerVersion: "1.80.9",
806630
806635
  onDebug: logForDebugging,
806631
806636
  onAuth401,
806632
806637
  getTrustedDeviceToken
@@ -816099,7 +816104,7 @@ function getAgUiCapabilities() {
816099
816104
  name: "UR-Nexus",
816100
816105
  type: "ur-nexus",
816101
816106
  description: "Provider-flexible, local-first autonomous engineering workflow agent.",
816102
- version: "1.80.8",
816107
+ version: "1.80.9",
816103
816108
  provider: "UR",
816104
816109
  documentationUrl: "https://github.com/Maitham16/UR/blob/master/docs/AG_UI.md"
816105
816110
  },
@@ -817326,7 +817331,7 @@ function createMCPServer(cwd4, debug2, verbose) {
817326
817331
  };
817327
817332
  const server2 = new Server({
817328
817333
  name: "ur-nexus",
817329
- version: "1.80.8"
817334
+ version: "1.80.9"
817330
817335
  }, {
817331
817336
  capabilities: {
817332
817337
  tools: {}
@@ -818530,7 +818535,7 @@ function thrownResponse(error40) {
818530
818535
  }
818531
818536
  async function createUrMcp2026Runtime(options5) {
818532
818537
  const server2 = createMCPServer(options5.cwd, options5.debug === true, options5.verbose === true);
818533
- const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.80.8" }, { capabilities: {} });
818538
+ const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.80.9" }, { capabilities: {} });
818534
818539
  const [clientTransport, serverTransport] = createLinkedTransportPair();
818535
818540
  try {
818536
818541
  await server2.connect(serverTransport);
@@ -818541,7 +818546,7 @@ async function createUrMcp2026Runtime(options5) {
818541
818546
  }
818542
818547
  const runtime2 = new Mcp2026Runtime({
818543
818548
  cwd: options5.cwd,
818544
- version: "1.80.8",
818549
+ version: "1.80.9",
818545
818550
  backend: {
818546
818551
  listTools: async () => {
818547
818552
  const listed = await client2.listTools();
@@ -821276,7 +821281,7 @@ async function update() {
821276
821281
  logEvent("tengu_update_check", {});
821277
821282
  const diagnostic2 = await getDoctorDiagnostic();
821278
821283
  const result = await checkUpgradeStatus({
821279
- currentVersion: "1.80.8",
821284
+ currentVersion: "1.80.9",
821280
821285
  packageName: UR_AGENT_PACKAGE_NAME,
821281
821286
  installationType: diagnostic2.installationType,
821282
821287
  latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
@@ -822604,7 +822609,7 @@ ${customInstructions}` : customInstructions;
822604
822609
  }
822605
822610
  }
822606
822611
  logForDiagnosticsNoPII("info", "started", {
822607
- version: "1.80.8",
822612
+ version: "1.80.9",
822608
822613
  is_native_binary: isInBundledMode()
822609
822614
  });
822610
822615
  registerCleanup(async () => {
@@ -823391,7 +823396,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
823391
823396
  pendingHookMessages
823392
823397
  }, renderAndRun);
823393
823398
  }
823394
- }).version("1.80.8 (UR-Nexus)", "-v, --version", "Output the version number");
823399
+ }).version("1.80.9 (UR-Nexus)", "-v, --version", "Output the version number");
823395
823400
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
823396
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.");
823397
823402
  if (canUserConfigureAdvisor()) {
@@ -824518,7 +824523,7 @@ if (false) {}
824518
824523
  async function main2() {
824519
824524
  const args = process.argv.slice(2);
824520
824525
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
824521
- console.log(`${"1.80.8"} (UR-Nexus)`);
824526
+ console.log(`${"1.80.9"} (UR-Nexus)`);
824522
824527
  return;
824523
824528
  }
824524
824529
  if (args[0] === "a2a" && args[1] === "serve" && !args.includes("--help") && !args.includes("-h")) {
@@ -9,6 +9,12 @@ 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
+
12
18
  ## v1.80.8 Addition
13
19
 
14
20
  | Addition | Surface | What it adds |
@@ -61,9 +61,11 @@ 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
63
  actionable parent task. As provider-independent compatibility, an unnamed
64
- main-session `general-purpose` call whose own prompt explicitly declares both
65
- research intent and no file writes is reduced to the shipped Explore definition
66
- before the gate. It never receives general-purpose tools through this path.
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.
67
69
 
68
70
  ## Model Providers
69
71
 
@@ -108,6 +108,11 @@ ur provider status
108
108
  UR 1.80.8 routes that narrow contract to the protected Explore worker before
109
109
  the gate. A real general-purpose or implementation worker is still expected
110
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.
111
116
 
112
117
  ### Ollama stops with `unavailable tool "WebSearch"`
113
118
 
package/docs/USAGE.md CHANGED
@@ -475,10 +475,12 @@ 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
476
  the parent is in Accept Edits or Approve All. Models are instructed to select
477
477
  `subagent_type="Explore"` for this work. If a provider still labels an explicit
478
- read-only research brief `general-purpose`, UR reduces that main-session call
479
- to the shipped Explore definition before gating. Ordinary general-purpose
480
- work, custom overrides, nested agents, named/team workers, worktrees, and cwd
481
- overrides still require an actionable parent task. When the user approves the plan,
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,
482
484
  `ExitPlanMode` preserves any existing actionable board or creates a bounded set
483
485
  of professional, deduplicated implementation tasks plus a verification task
484
486
  that depends on them. Implementation therefore starts with visible tracking
@@ -19,10 +19,10 @@ You need:
19
19
 
20
20
  ```sh
21
21
  ur --version
22
- # expected for this release: "1.80.8 (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.8)
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,
@@ -33,10 +33,10 @@ should remain blocked until they have an actionable parent task.
33
33
 
34
34
  Repeat with multiple available model families. A model may correctly emit
35
35
  `subagent_type: "Explore"`; if it instead emits `general-purpose` with an
36
- explicit read-only research/no-file-write brief, UR must safely reduce it to
37
- Explore and start without a failed `TaskListRequired` attempt. A
38
- general-purpose implementation brief must remain blocked. The deterministic
39
- regressions are:
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:
40
40
 
41
41
  ```sh
42
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.8</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.8"
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.8",
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.8",
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",