ur-agent 1.80.2 → 1.80.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.80.3
4
+
5
+ - Restored visible task planning with a strict-hybrid default. Atomic,
6
+ low-risk requests still execute directly; requests with multiple outcomes,
7
+ sequencing, plan mode, delegation, project-sized work, or release/security/
8
+ migration/production risk must create an actionable task before the first
9
+ mutation. Read-only investigation remains unrestricted.
10
+ - The task gate now uses deterministic user-turn classification instead of
11
+ treating conversation length as complexity. It fails closed when task state
12
+ is unreadable, rechecks permission-rewritten tool input, preserves active
13
+ interrupted boards, and never deadlocks a custom tool profile that omits
14
+ `TaskCreate`.
15
+ - Operators can keep task tracking advisory with
16
+ `tasks.requireBeforeChanges.enabled=false`, or set `freeReads=0` to require a
17
+ task before every mutation. Approve All remains unchanged.
18
+
3
19
  ## 1.80.2
4
20
 
5
21
  - Repaired repeated `AskUserQuestion` validation loops when a model emits one
package/README.md CHANGED
@@ -81,6 +81,13 @@ useful. Each task records id, order, title, description, status, dependencies,
81
81
  assigned logical agent role, input, expected output, verification criteria, file
82
82
  targets, risk level, and whether approval is required.
83
83
 
84
+ Inside the interactive agent, task tracking uses a strict-hybrid default:
85
+ atomic low-risk work stays direct, while multi-outcome, sequenced, planned,
86
+ delegated, project-sized, and high-risk lifecycle work must create a visible
87
+ task before the first mutation. Reads stay unrestricted. Configure the gate
88
+ with `tasks.requireBeforeChanges`; `enabled=false` makes it advisory and
89
+ `freeReads=0` requires a task before every mutation.
90
+
84
91
  During real `ur exec` runs the task board streams when a task status changes,
85
92
  then appears again in the final report. Quiet/non-interactive runs can suppress
86
93
  streaming while preserving the final board. Public status labels are
package/dist/cli.js CHANGED
@@ -107784,7 +107784,7 @@ var init_auth = __esm(() => {
107784
107784
 
107785
107785
  // src/utils/userAgent.ts
107786
107786
  function getURCodeUserAgent() {
107787
- return `ur/${"1.80.2"}`;
107787
+ return `ur/${"1.80.3"}`;
107788
107788
  }
107789
107789
 
107790
107790
  // src/utils/workloadContext.ts
@@ -107806,7 +107806,7 @@ function getUserAgent() {
107806
107806
  const clientApp = process.env.UR_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}` : "";
107807
107807
  const workload = getWorkload();
107808
107808
  const workloadSuffix = workload ? `, workload/${workload}` : "";
107809
- return `ur-cli/${"1.80.2"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
107809
+ return `ur-cli/${"1.80.3"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
107810
107810
  }
107811
107811
  function getMCPUserAgent() {
107812
107812
  const parts = [];
@@ -107820,7 +107820,7 @@ function getMCPUserAgent() {
107820
107820
  parts.push(`client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}`);
107821
107821
  }
107822
107822
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
107823
- return `ur/${"1.80.2"}${suffix}`;
107823
+ return `ur/${"1.80.3"}${suffix}`;
107824
107824
  }
107825
107825
  function getWebFetchUserAgent() {
107826
107826
  return `UR-User (${getURCodeUserAgent()})`;
@@ -107958,7 +107958,7 @@ var init_user = __esm(() => {
107958
107958
  deviceId,
107959
107959
  sessionId: getSessionId(),
107960
107960
  email: getEmail(),
107961
- appVersion: "1.80.2",
107961
+ appVersion: "1.80.3",
107962
107962
  platform: getHostPlatformForAnalytics(),
107963
107963
  organizationUuid,
107964
107964
  accountUuid,
@@ -115845,7 +115845,7 @@ var init_metadata = __esm(() => {
115845
115845
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
115846
115846
  WHITESPACE_REGEX = /\s+/;
115847
115847
  getVersionBase = memoize_default(() => {
115848
- const match = "1.80.2".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
115848
+ const match = "1.80.3".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
115849
115849
  return match ? match[0] : undefined;
115850
115850
  });
115851
115851
  buildEnvContext = memoize_default(async () => {
@@ -115885,7 +115885,7 @@ var init_metadata = __esm(() => {
115885
115885
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
115886
115886
  isURCodeAction: isEnvTruthy(process.env.UR_CODE_ACTION),
115887
115887
  isURAiAuth: isURAISubscriber(),
115888
- version: "1.80.2",
115888
+ version: "1.80.3",
115889
115889
  versionBase: getVersionBase(),
115890
115890
  buildTime: "",
115891
115891
  deploymentEnvironment: env2.detectDeploymentEnvironment(),
@@ -116555,7 +116555,7 @@ function initialize1PEventLogging() {
116555
116555
  const platform2 = getPlatform();
116556
116556
  const attributes = {
116557
116557
  [import_semantic_conventions4.ATTR_SERVICE_NAME]: "ur",
116558
- [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.80.2"
116558
+ [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.80.3"
116559
116559
  };
116560
116560
  if (platform2 === "wsl") {
116561
116561
  const wslVersion = getWslVersion();
@@ -116583,7 +116583,7 @@ function initialize1PEventLogging() {
116583
116583
  })
116584
116584
  ]
116585
116585
  });
116586
- firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.80.2");
116586
+ firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.80.3");
116587
116587
  }
116588
116588
  async function reinitialize1PEventLoggingIfConfigChanged() {
116589
116589
  if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
@@ -119068,7 +119068,7 @@ var init_types2 = __esm(() => {
119068
119068
  requireBeforeChanges: exports_external.object({
119069
119069
  enabled: exports_external.boolean().optional(),
119070
119070
  freeReads: exports_external.number().optional()
119071
- }).optional().describe("Require a task list before any tool that changes the workspace (Edit, Write, Bash, ...). " + "Reads are never blocked, so the agent can investigate before planning; freeReads is how many " + "tool calls may run before the gate applies at all. Set enabled=false to make the task list advisory again.")
119071
+ }).optional().describe("Require a task list before any tool that changes the workspace (Edit, Write, Bash, ...). " + "The default strict-hybrid policy enforces classified multi-step, risky, delegated, and release work " + "while allowing positively classified atomic changes to proceed directly. Reads are never blocked. " + "Set freeReads=0 to require a task before every mutation, or enabled=false to make task tracking advisory.")
119072
119072
  }).optional().describe("Task list behaviour."),
119073
119073
  context: exports_external.object({
119074
119074
  pruneToolResults: exports_external.object({
@@ -126542,7 +126542,7 @@ function formatAgentTrendReport(report = buildAgentTrendReport()) {
126542
126542
  function formatA2AAgentCard(options = {}, pretty = true) {
126543
126543
  return JSON.stringify(buildA2AAgentCard(options), null, pretty ? 2 : 0);
126544
126544
  }
126545
- var urVersion = "1.80.2", researchSnapshotDate = "2026-08-10", coverage, priorityRoadmap;
126545
+ var urVersion = "1.80.3", researchSnapshotDate = "2026-08-10", coverage, priorityRoadmap;
126546
126546
  var init_trends = __esm(() => {
126547
126547
  init_a2aCardSignature();
126548
126548
  coverage = [
@@ -129432,7 +129432,7 @@ function getAttributionHeader(fingerprint) {
129432
129432
  if (!isAttributionHeaderEnabled()) {
129433
129433
  return "";
129434
129434
  }
129435
- const version2 = `${"1.80.2"}.${fingerprint}`;
129435
+ const version2 = `${"1.80.3"}.${fingerprint}`;
129436
129436
  const entrypoint = process.env.UR_CODE_ENTRYPOINT ?? "unknown";
129437
129437
  const cch = "";
129438
129438
  const workload = getWorkload();
@@ -184625,7 +184625,7 @@ var init_projectSafety = __esm(() => {
184625
184625
  function getInstruments() {
184626
184626
  if (instruments)
184627
184627
  return instruments;
184628
- const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.80.2");
184628
+ const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.80.3");
184629
184629
  instruments = {
184630
184630
  operationDuration: meter.createHistogram("gen_ai.client.operation.duration", {
184631
184631
  description: "GenAI operation duration.",
@@ -184723,7 +184723,7 @@ function genAiAgentAttributes() {
184723
184723
  "gen_ai.operation.name": GEN_AI_OPERATION_INVOKE_AGENT,
184724
184724
  "gen_ai.provider.name": "ur",
184725
184725
  "gen_ai.agent.name": "UR-Nexus",
184726
- "gen_ai.agent.version": "1.80.2"
184726
+ "gen_ai.agent.version": "1.80.3"
184727
184727
  };
184728
184728
  }
184729
184729
  function genAiWorkflowAttributes(workflowName, workflowRunId) {
@@ -184744,7 +184744,7 @@ function genAiWorkflowAttributes(workflowName, workflowRunId) {
184744
184744
  function startGenAiWorkflowSpan(workflowName, workflowRunId) {
184745
184745
  const attributes = genAiWorkflowAttributes(workflowName, workflowRunId);
184746
184746
  const name = typeof attributes["gen_ai.workflow.name"] === "string" ? `invoke_workflow ${attributes["gen_ai.workflow.name"]}` : GEN_AI_OPERATION_INVOKE_WORKFLOW;
184747
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.80.2").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
184747
+ return import_api10.trace.getTracer("ur-agent.gen_ai", "1.80.3").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
184748
184748
  }
184749
184749
  function endGenAiWorkflowSpan(span, options2 = {}) {
184750
184750
  try {
@@ -184782,7 +184782,7 @@ function startGenAiMemorySpan(operation, options2 = {}) {
184782
184782
  if (options2.recordCount !== undefined && Number.isInteger(options2.recordCount) && options2.recordCount >= 0) {
184783
184783
  attributes["gen_ai.memory.record.count"] = options2.recordCount;
184784
184784
  }
184785
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.80.2").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
184785
+ return import_api10.trace.getTracer("ur-agent.gen_ai", "1.80.3").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
184786
184786
  }
184787
184787
  function endGenAiMemorySpan(span, options2 = {}) {
184788
184788
  try {
@@ -278497,7 +278497,7 @@ function getTelemetryAttributes() {
278497
278497
  attributes["session.id"] = sessionId;
278498
278498
  }
278499
278499
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
278500
- attributes["app.version"] = "1.80.2";
278500
+ attributes["app.version"] = "1.80.3";
278501
278501
  }
278502
278502
  const oauthAccount = getOauthAccountInfo();
278503
278503
  if (oauthAccount) {
@@ -319488,7 +319488,7 @@ function getInstallationEnv() {
319488
319488
  return;
319489
319489
  }
319490
319490
  function getURCodeVersion() {
319491
- return "1.80.2";
319491
+ return "1.80.3";
319492
319492
  }
319493
319493
  async function getInstalledVSCodeExtensionVersion(command) {
319494
319494
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -326858,7 +326858,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
326858
326858
  const client2 = new Client({
326859
326859
  name: "ur",
326860
326860
  title: "UR",
326861
- version: "1.80.2",
326861
+ version: "1.80.3",
326862
326862
  description: "UR-Nexus autonomous engineering workflow engine",
326863
326863
  websiteUrl: PRODUCT_URL
326864
326864
  }, {
@@ -327219,7 +327219,7 @@ var init_client5 = __esm(() => {
327219
327219
  const client2 = new Client({
327220
327220
  name: "ur",
327221
327221
  title: "UR",
327222
- version: "1.80.2",
327222
+ version: "1.80.3",
327223
327223
  description: "UR-Nexus autonomous engineering workflow engine",
327224
327224
  websiteUrl: PRODUCT_URL
327225
327225
  }, {
@@ -339957,7 +339957,7 @@ async function createRuntime() {
339957
339957
  bootstrapTelemetry();
339958
339958
  const resource = defaultResource().merge(detectResources({ detectors: [envDetector] })).merge(resourceFromAttributes({
339959
339959
  [import_semantic_conventions7.ATTR_SERVICE_NAME]: "ur-agent",
339960
- [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.80.2"
339960
+ [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.80.3"
339961
339961
  }));
339962
339962
  const tracerProvider = exporters.traces.length > 0 ? new BasicTracerProvider({
339963
339963
  resource,
@@ -339990,11 +339990,11 @@ async function createRuntime() {
339990
339990
  setMeterProvider(meterProvider);
339991
339991
  setLoggerProvider(loggerProvider);
339992
339992
  if (meterProvider) {
339993
- const meter = meterProvider.getMeter("ur-agent", "1.80.2");
339993
+ const meter = meterProvider.getMeter("ur-agent", "1.80.3");
339994
339994
  setMeter(meter, (name, options2) => meter.createCounter(name, options2));
339995
339995
  }
339996
339996
  if (loggerProvider) {
339997
- setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.80.2"));
339997
+ setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.80.3"));
339998
339998
  }
339999
339999
  if (!cleanupRegistered3) {
340000
340000
  cleanupRegistered3 = true;
@@ -340656,9 +340656,9 @@ async function assertMinVersion() {
340656
340656
  if (false) {}
340657
340657
  try {
340658
340658
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
340659
- if (versionConfig.minVersion && lt("1.80.2", versionConfig.minVersion)) {
340659
+ if (versionConfig.minVersion && lt("1.80.3", versionConfig.minVersion)) {
340660
340660
  console.error(`
340661
- It looks like your version of UR (${"1.80.2"}) needs an update.
340661
+ It looks like your version of UR (${"1.80.3"}) needs an update.
340662
340662
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
340663
340663
 
340664
340664
  To update, please run:
@@ -340874,7 +340874,7 @@ async function installGlobalPackage(specificVersion) {
340874
340874
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
340875
340875
  logEvent("tengu_auto_updater_lock_contention", {
340876
340876
  pid: process.pid,
340877
- currentVersion: "1.80.2"
340877
+ currentVersion: "1.80.3"
340878
340878
  });
340879
340879
  return "in_progress";
340880
340880
  }
@@ -340883,7 +340883,7 @@ async function installGlobalPackage(specificVersion) {
340883
340883
  if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
340884
340884
  logError2(new Error("Windows NPM detected in WSL environment"));
340885
340885
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
340886
- currentVersion: "1.80.2"
340886
+ currentVersion: "1.80.3"
340887
340887
  });
340888
340888
  console.error(`
340889
340889
  Error: Windows NPM detected in WSL
@@ -341418,7 +341418,7 @@ function detectLinuxGlobPatternWarnings() {
341418
341418
  }
341419
341419
  async function getDoctorDiagnostic() {
341420
341420
  const installationType = await getCurrentInstallationType();
341421
- const version2 = typeof MACRO !== "undefined" ? "1.80.2" : "unknown";
341421
+ const version2 = typeof MACRO !== "undefined" ? "1.80.3" : "unknown";
341422
341422
  const installationPath = await getInstallationPath();
341423
341423
  const invokedBinary = getInvokedBinary();
341424
341424
  const multipleInstallations = await detectMultipleInstallations();
@@ -342353,8 +342353,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
342353
342353
  const maxVersion = await getMaxVersion();
342354
342354
  if (maxVersion && gt(version2, maxVersion)) {
342355
342355
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
342356
- if (gte("1.80.2", maxVersion)) {
342357
- logForDebugging(`Native installer: current version ${"1.80.2"} is already at or above maxVersion ${maxVersion}, skipping update`);
342356
+ if (gte("1.80.3", maxVersion)) {
342357
+ logForDebugging(`Native installer: current version ${"1.80.3"} is already at or above maxVersion ${maxVersion}, skipping update`);
342358
342358
  logEvent("tengu_native_update_skipped_max_version", {
342359
342359
  latency_ms: Date.now() - startTime,
342360
342360
  max_version: maxVersion,
@@ -342365,7 +342365,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
342365
342365
  version2 = maxVersion;
342366
342366
  }
342367
342367
  }
342368
- if (!forceReinstall && version2 === "1.80.2" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
342368
+ if (!forceReinstall && version2 === "1.80.3" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
342369
342369
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
342370
342370
  logEvent("tengu_native_update_complete", {
342371
342371
  latency_ms: Date.now() - startTime,
@@ -402101,6 +402101,52 @@ function requestsRevisionOfCurrentTaskList(input) {
402101
402101
  function shouldKeepCurrentTaskList(input) {
402102
402102
  return requestsAppendToCurrentTaskList(input) || requestsContinueCurrentTaskList(input) || requestsRevisionOfCurrentTaskList(input);
402103
402103
  }
402104
+ function withoutCode(input) {
402105
+ return input.replace(/```[\s\S]*?```/gu, " ").replace(/`[^`\n]*`/gu, " ");
402106
+ }
402107
+ function proseOnly(input) {
402108
+ return withoutCode(input).replace(/\s+/gu, " ").trim();
402109
+ }
402110
+ function taskListRequirementReason(input) {
402111
+ const text2 = proseOnly(input);
402112
+ if (!text2)
402113
+ return;
402114
+ const optsOut = /\b(?:do not|don't)\s+(?:(?:create|make|maintain|show|start|use)\s+)?(?:a\s+)?(?:task|todo)(?:\s+(?:list|board))?\b/iu.test(text2) || /\bwithout\s+(?:(?:creating|making|maintaining|showing|starting|using)\s+)?(?:a\s+)?(?:task|todo)(?:\s+(?:list|board))?\b/iu.test(text2) || /\b(?:skip|no)\s+(?:the\s+|a\s+)?(?:task|todo)(?:\s+(?:list|board))?\b/iu.test(text2);
402115
+ if (optsOut)
402116
+ return;
402117
+ if (/\b(?:create|make|maintain|show|start|use|keep|track|add|append|put|queue)\b[^.!?]{0,100}\b(?:task|todo)\s+(?:list|board)\b/iu.test(text2) || /\b(?:add|append|put|queue)\s+(?:this|it)?\s*(?:to|on)?\s*(?:my|the|your)?\s*(?:tasks?|todos?)\b/iu.test(text2) || /\b(?:add|append|put|queue)\s+(?:this|it)\s+(?:to|on)\s+(?:the\s+|your\s+|my\s+)?(?:current|existing)\s+list\b/iu.test(text2) || /\b(?:create|make|use|track)\s+(?:the\s+|a\s+|your\s+)?(?:tasks?|todos?)\b/iu.test(text2) || /\b(?:tasks?|todos?)\s+first\b/iu.test(text2)) {
402118
+ return "explicit task tracking request";
402119
+ }
402120
+ if (/^\/plan(?:\s|$)/iu.test(text2) || /\b(?:enter|start|use|switch\s+to)\s+plan\s+mode\b/iu.test(text2) || /\bplan\s+(?:this|the\s+work|first)\b/iu.test(text2)) {
402121
+ return "planning workflow";
402122
+ }
402123
+ if (/\b(?:delegate|delegation|sub[ -]?agents?|parallel\s+agents?|agent\s+team|team\s+of\s+agents?|fan[ -]?out)\b/iu.test(text2)) {
402124
+ return "delegation or parallel agent work";
402125
+ }
402126
+ const hasAction = new RegExp(String.raw`\b${ACTION_WORD}\b`, "iu").test(text2);
402127
+ if (hasAction && /\b(?:publish|release|deploy|production|migrat(?:e|ion)|database\s+schema|credentials?|secrets?|permissions?|sandbox|security|authentication|authorization|payments?|billing|version\s+bump|git\s+tag)\b/iu.test(text2)) {
402128
+ return "release, security, migration, or production risk";
402129
+ }
402130
+ const structuralText = withoutCode(input);
402131
+ const enumeratedItems = structuralText.match(/(?:^|\n)\s*(?:[-*+]\s+|\d+[.)]\s+)\S/gu);
402132
+ const actionLines = structuralText.split(/\r?\n/gu).filter((line) => new RegExp(String.raw`\b${ACTION_WORD}\b`, "iu").test(line));
402133
+ if ((enumeratedItems?.length ?? 0) >= 2 || actionLines.length >= 2 || SEQUENCED_ACTION_RE.test(text2)) {
402134
+ return "multiple requested outcomes";
402135
+ }
402136
+ const targetList = new RegExp(String.raw`\b${ACTION_WORD}\b[^.!?]{0,120}\b(?:docs?|tests?|code|implementation|configuration|config|workflow|release notes?|technical docs?|readme|ui|api|cli|database|schema|sandbox|permissions?)\b[^.!?]{0,80}(?:,|\band\b|\bplus\b)[^.!?]{0,80}\b(?:docs?|tests?|code|implementation|configuration|config|workflow|release notes?|technical docs?|readme|ui|api|cli|database|schema|sandbox|permissions?)\b`, "iu");
402137
+ if (targetList.test(text2))
402138
+ return "multiple requested outcomes";
402139
+ const projectScope = /\b(?:app|application|agent|system|platform|website|dashboard|service|integration|workflow|codebase|project|plugin|extension|3d\s+(?:scene|design|pipeline))\b/iu;
402140
+ const projectAction = /\b(?:build(?:ing|s)?|built|creat(?:e|ed|es|ing)|design(?:ed|ing|s)?|implement(?:ed|ing|s)?|integrat(?:e|ed|es|ing)|refactor(?:ed|ing|s)?|rewrit(?:e|ing|ten)|overhaul(?:ed|ing|s)?|audit(?:ed|ing|s)?|research(?:ed|es|ing)?)\b/iu;
402141
+ if (projectScope.test(text2) && projectAction.test(text2)) {
402142
+ return "large project scope";
402143
+ }
402144
+ ACTION_RE.lastIndex = 0;
402145
+ if (text2.length >= 600 && ACTION_RE.test(text2)) {
402146
+ return "detailed multi-step request";
402147
+ }
402148
+ return;
402149
+ }
402104
402150
  function getTaskListRunForCommand(command, options2 = {}) {
402105
402151
  if (!command || command.mode !== "prompt" || command.isMeta)
402106
402152
  return;
@@ -402108,9 +402154,12 @@ function getTaskListRunForCommand(command, options2 = {}) {
402108
402154
  if (!options2.allowSlashCommand && !command.skipSlashCommands && text2.trimStart().startsWith("/")) {
402109
402155
  return;
402110
402156
  }
402157
+ const requirementReason = taskListRequirementReason(text2);
402111
402158
  return {
402112
402159
  generationId: String(command.uuid ?? randomUUID40()),
402113
- appendToCurrent: shouldKeepCurrentTaskList(text2)
402160
+ appendToCurrent: shouldKeepCurrentTaskList(text2),
402161
+ requiresTaskList: requirementReason !== undefined,
402162
+ ...requirementReason ? { requirementReason } : {}
402114
402163
  };
402115
402164
  }
402116
402165
  function getTaskListRunFromMessages(messages) {
@@ -402118,14 +402167,21 @@ function getTaskListRunFromMessages(messages) {
402118
402167
  if (!message || typeof message.uuid !== "string" || !message.uuid) {
402119
402168
  return;
402120
402169
  }
402170
+ const text2 = textFromMessage(message);
402171
+ const requirementReason = taskListRequirementReason(text2);
402121
402172
  return {
402122
402173
  generationId: message.uuid,
402123
- appendToCurrent: shouldKeepCurrentTaskList(textFromMessage(message))
402174
+ appendToCurrent: shouldKeepCurrentTaskList(text2),
402175
+ requiresTaskList: requirementReason !== undefined,
402176
+ ...requirementReason ? { requirementReason } : {}
402124
402177
  };
402125
402178
  }
402126
- var taskListRunStorage;
402179
+ var taskListRunStorage, ACTION_WORD, ACTION_RE, SEQUENCED_ACTION_RE;
402127
402180
  var init_taskListRunContext = __esm(() => {
402128
402181
  taskListRunStorage = new AsyncLocalStorage5;
402182
+ ACTION_WORD = String.raw`(?:add(?:ed|ing|s)?|audit(?:ed|ing|s)?|build(?:ing|s)?|built|bump(?:ed|ing|s)?|chang(?:e|ed|es|ing)|clean(?:ed|ing|s)?|creat(?:e|ed|es|ing)|debug(?:ged|ging|s)?|delet(?:e|ed|es|ing)|deploy(?:ed|ing|s)?|design(?:ed|ing|s)?|document(?:ed|ing|s)?|fix(?:ed|es|ing)?|implement(?:ed|ing|s)?|integrat(?:e|ed|es|ing)|migrat(?:e|ed|es|ing)|publish(?:ed|es|ing)?|push(?:ed|es|ing)?|refactor(?:ed|ing|s)?|releas(?:e|ed|es|ing)|remov(?:e|ed|es|ing)|renam(?:e|ed|es|ing)|repair(?:ed|ing|s)?|research(?:ed|es|ing)?|review(?:ed|ing|s)?|secur(?:e|ed|es|ing)|test(?:ed|ing|s)?|updat(?:e|ed|es|ing)|upgrad(?:e|ed|es|ing)|verif(?:y|ied|ies|ying)|writ(?:e|es|ing)|wrote)`;
402183
+ ACTION_RE = new RegExp(String.raw`\b${ACTION_WORD}\b`, "giu");
402184
+ SEQUENCED_ACTION_RE = new RegExp(String.raw`\b${ACTION_WORD}\b[^.!?\n]{0,180}(?:\band\b|\bthen\b|\balso\b|\bplus\b|;|\n)[^.!?\n]{0,100}\b${ACTION_WORD}\b`, "iu");
402129
402185
  });
402130
402186
 
402131
402187
  // src/tools/TaskCreateTool/prompt.ts
@@ -402141,9 +402197,11 @@ It also helps the user understand the progress of the task and overall progress
402141
402197
 
402142
402198
  Use this tool proactively in these scenarios:
402143
402199
 
402144
- - Complex multi-step tasks - When a request requires 3 or more distinct steps or actions
402200
+ - Multi-outcome work - When a request has 2 or more distinct requested outcomes, deliverables, or sequenced actions
402145
402201
  - Non-trivial and complex tasks - Tasks that require careful planning or multiple operations${teammateContext}
402146
402202
  - Multiple independently verifiable outcomes, dependency ordering, delegation, or parallel work
402203
+ - High-risk lifecycle work - Releases, publishing, deployment, migrations, security, credentials, permissions, sandboxing, or production changes
402204
+ - Project-sized builds, integrations, workflows, refactors, and audits
402147
402205
  - Plan mode - When using plan mode, create a task list to track the work
402148
402206
  - User explicitly requests todo list - When the user directly asks you to use the todo list
402149
402207
  - User asks to queue work - When the user says "add to your tasks", "add this to your task list", "put this on the list", "queue this up", or anything similar, IMMEDIATELY call this tool with that request \u2014 even if you are in the middle of other work and even if the item sounds small. The user is watching the live task panel and expects the item to appear there right away. Acknowledge briefly and continue what you were doing unless asked to switch.
@@ -402154,7 +402212,7 @@ Use this tool proactively in these scenarios:
402154
402212
 
402155
402213
  Skip using this tool when:
402156
402214
  - The task is purely conversational or informational
402157
- - The request is one direct, low-risk action that can be completed and verified as one operation
402215
+ - The request is one genuinely atomic, low-risk action with one outcome that can be completed and verified directly
402158
402216
  - The user sends a short acknowledgement, correction, or clarification that does not add a distinct outcome to an existing board
402159
402217
 
402160
402218
  Do not create a task merely because a user sent a message or because the request is actionable. Task subjects must describe concrete outcomes chosen after understanding the work; never copy the raw prompt into a task title.
@@ -412385,7 +412443,7 @@ function isAnyTracingEnabled() {
412385
412443
  return isTelemetryEnabled() || isEnhancedTelemetryEnabled() || isBetaTracingEnabled();
412386
412444
  }
412387
412445
  function getTracer() {
412388
- return import_api39.trace.getTracer("ur-agent.gen_ai", "1.80.2");
412446
+ return import_api39.trace.getTracer("ur-agent.gen_ai", "1.80.3");
412389
412447
  }
412390
412448
  function createSpanAttributes(spanType, customAttributes = {}) {
412391
412449
  const baseAttributes = getTelemetryAttributes();
@@ -413066,6 +413124,8 @@ function checkTaskListGate(input) {
413066
413124
  const config3 = input.config ?? getTaskListGateConfig();
413067
413125
  if (!config3.enabled)
413068
413126
  return { allowed: true };
413127
+ if (input.taskListWriterAvailable === false)
413128
+ return { allowed: true };
413069
413129
  if (isTaskListGateExempt(input.toolName))
413070
413130
  return { allowed: true };
413071
413131
  const isMutating = input.isMutating ?? isMutatingTool2(input.toolName);
@@ -413074,23 +413134,29 @@ function checkTaskListGate(input) {
413074
413134
  if (input.taskCount !== null && input.taskCount > 0) {
413075
413135
  return { allowed: true };
413076
413136
  }
413137
+ const inherentlyRequiresTaskList = input.isSubagent || ALWAYS_REQUIRE_PLAN_TOOLS.has(input.toolName);
413138
+ const classifiedRequirement = input.requiresTaskList === true;
413139
+ const forceEveryMutation = config3.freeReads === 0;
413140
+ const unclassifiedAllowanceExpired = input.requiresTaskList === undefined && input.readsSoFar >= config3.freeReads;
413141
+ const gateRequired = inherentlyRequiresTaskList || classifiedRequirement || forceEveryMutation || unclassifiedAllowanceExpired;
413142
+ const requirementContext = input.requirementReason ? ` This turn requires task tracking because it contains ${input.requirementReason}.` : "";
413077
413143
  if (input.taskCount === null) {
413078
413144
  return {
413079
413145
  allowed: false,
413080
- reason: `The task list could not be read, so ${input.toolName} was not allowed ` + `to change state without a verifiable plan. Retry TaskList or ` + `TaskCreate, then retry this call. Disable with ` + `tasks.requireBeforeChanges.enabled=false in settings.`
413146
+ reason: `The task list could not be read, so ${input.toolName} was not allowed ` + `to change state without a verifiable plan.${requirementContext} Retry TaskList or ` + `TaskCreate, then retry this call. Disable with ` + `tasks.requireBeforeChanges.enabled=false in settings.`
413081
413147
  };
413082
413148
  }
413083
- if (input.isSubagent || ALWAYS_REQUIRE_PLAN_TOOLS.has(input.toolName)) {
413149
+ if (!gateRequired)
413150
+ return { allowed: true };
413151
+ if (inherentlyRequiresTaskList) {
413084
413152
  return {
413085
413153
  allowed: false,
413086
413154
  reason: `No actionable parent task exists for ${input.toolName}. Call ` + `TaskCreate before delegating or changing state, then retry this call. ` + `Disable with tasks.requireBeforeChanges.enabled=false in settings.`
413087
413155
  };
413088
413156
  }
413089
- if (input.readsSoFar < config3.freeReads)
413090
- return { allowed: true };
413091
413157
  return {
413092
413158
  allowed: false,
413093
- reason: `No task list exists, and ${input.toolName} changes the workspace. ` + `Call TaskCreate first with the steps you intend to take, then retry ` + `this call. Reads are unrestricted, so investigate as much as you need ` + `before writing the list. ` + `Disable with tasks.requireBeforeChanges.enabled=false in settings.`
413159
+ reason: `No task list exists, and ${input.toolName} changes the workspace. ` + `${requirementContext.trim()}${requirementContext ? " " : ""}` + `Call TaskCreate first with the steps you intend to take, then retry ` + `this call. Reads are unrestricted, so investigate as much as you need ` + `before writing the list. ` + `Disable with tasks.requireBeforeChanges.enabled=false in settings.`
413094
413160
  };
413095
413161
  }
413096
413162
  var TASK_LIST_GATE_DEFAULTS, KNOWN_MUTATING_TOOLS, GATE_EXEMPT_TOOLS, ALWAYS_REQUIRE_PLAN_TOOLS;
@@ -413098,7 +413164,7 @@ var init_taskListGate = __esm(() => {
413098
413164
  init_settings2();
413099
413165
  init_tasks();
413100
413166
  TASK_LIST_GATE_DEFAULTS = {
413101
- enabled: false,
413167
+ enabled: true,
413102
413168
  freeReads: 3
413103
413169
  };
413104
413170
  KNOWN_MUTATING_TOOLS = new Set([
@@ -414638,12 +414704,16 @@ async function checkPermissionsAndCallTool(tool, toolUseID, input, toolUseContex
414638
414704
  } catch {
414639
414705
  isMutating = true;
414640
414706
  }
414707
+ const taskListRun = getTaskListRunContext() ?? (toolUseContext.agentId ? undefined : getTaskListRunFromMessages(toolUseContext.messages ?? []));
414641
414708
  const gate = checkTaskListGate({
414642
414709
  toolName: tool.name,
414643
414710
  taskCount: await countTasksForGate(),
414644
414711
  readsSoFar: countToolCallsBeforeCurrent(toolUseContext.messages, assistantMessage, toolUseID),
414645
414712
  isSubagent: Boolean(toolUseContext.agentId),
414646
- isMutating
414713
+ isMutating,
414714
+ requiresTaskList: taskListRun?.requiresTaskList,
414715
+ requirementReason: taskListRun?.requirementReason,
414716
+ taskListWriterAvailable: toolUseContext.options.tools.some((candidate) => candidate.name === "TaskCreate")
414647
414717
  });
414648
414718
  if (gate.allowed === false) {
414649
414719
  recordCallFailure(callSig);
@@ -415000,7 +415070,10 @@ async function checkPermissionsAndCallTool(tool, toolUseID, input, toolUseContex
415000
415070
  taskCount: await countTasksForGate(),
415001
415071
  readsSoFar: countToolCallsBeforeCurrent(toolUseContext.messages, assistantMessage, toolUseID),
415002
415072
  isSubagent: Boolean(toolUseContext.agentId),
415003
- isMutating: finalIsMutating
415073
+ isMutating: finalIsMutating,
415074
+ requiresTaskList: taskListRun?.requiresTaskList,
415075
+ requirementReason: taskListRun?.requirementReason,
415076
+ taskListWriterAvailable: toolUseContext.options.tools.some((candidate) => candidate.name === "TaskCreate")
415004
415077
  });
415005
415078
  if (finalGate.allowed === false) {
415006
415079
  recordCallFailure(callSig);
@@ -415438,6 +415511,7 @@ var init_toolExecution = __esm(() => {
415438
415511
  init_genAiSemantics();
415439
415512
  init_toolErrors();
415440
415513
  init_toolResultStorage();
415514
+ init_taskListRunContext();
415441
415515
  init_toolSearch();
415442
415516
  init_taskListGate();
415443
415517
  init_repeatedFailureGuard();
@@ -442817,7 +442891,7 @@ function Feedback({
442817
442891
  platform: env2.platform,
442818
442892
  gitRepo: envInfo.isGit,
442819
442893
  terminal: env2.terminal,
442820
- version: "1.80.2",
442894
+ version: "1.80.3",
442821
442895
  transcript: normalizeMessagesForAPI(messages),
442822
442896
  errors: sanitizedErrors,
442823
442897
  lastApiRequest: getLastAPIRequest(),
@@ -443009,7 +443083,7 @@ function Feedback({
443009
443083
  ", ",
443010
443084
  env2.terminal,
443011
443085
  ", v",
443012
- "1.80.2"
443086
+ "1.80.3"
443013
443087
  ]
443014
443088
  }, undefined, true, undefined, this)
443015
443089
  ]
@@ -443115,7 +443189,7 @@ ${sanitizedDescription}
443115
443189
  ` + `**Environment Info**
443116
443190
  ` + `- Platform: ${env2.platform}
443117
443191
  ` + `- Terminal: ${env2.terminal}
443118
- ` + `- Version: ${"1.80.2"}
443192
+ ` + `- Version: ${"1.80.3"}
443119
443193
  ` + `- Feedback ID: ${feedbackId}
443120
443194
  ` + `
443121
443195
  **Errors**
@@ -446225,7 +446299,7 @@ function buildPrimarySection() {
446225
446299
  }, undefined, false, undefined, this);
446226
446300
  return [{
446227
446301
  label: "Version",
446228
- value: "1.80.2"
446302
+ value: "1.80.3"
446229
446303
  }, {
446230
446304
  label: "Session name",
446231
446305
  value: nameValue
@@ -449607,7 +449681,7 @@ function Config({
449607
449681
  }
449608
449682
  }, undefined, false, undefined, this)
449609
449683
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime179.jsxDEV(ChannelDowngradeDialog, {
449610
- currentVersion: "1.80.2",
449684
+ currentVersion: "1.80.3",
449611
449685
  onChoice: (choice) => {
449612
449686
  setShowSubmenu(null);
449613
449687
  setTabsHidden(false);
@@ -449619,7 +449693,7 @@ function Config({
449619
449693
  autoUpdatesChannel: "stable"
449620
449694
  };
449621
449695
  if (choice === "stay") {
449622
- newSettings.minimumVersion = "1.80.2";
449696
+ newSettings.minimumVersion = "1.80.3";
449623
449697
  }
449624
449698
  updateSettingsForSource("userSettings", newSettings);
449625
449699
  setSettingsData((prev_27) => ({
@@ -457877,7 +457951,7 @@ function HelpV2(t0) {
457877
457951
  let t6;
457878
457952
  if ($2[31] !== tabs) {
457879
457953
  t6 = /* @__PURE__ */ jsx_dev_runtime206.jsxDEV(Tabs, {
457880
- title: `UR v${"1.80.2"}`,
457954
+ title: `UR v${"1.80.3"}`,
457881
457955
  color: "professionalBlue",
457882
457956
  defaultTab: "general",
457883
457957
  children: tabs
@@ -458810,7 +458884,7 @@ function buildToolUseContext(tools, readFileStateCache, toolPermissionContext, a
458810
458884
  async function handleInitialize(options2) {
458811
458885
  return {
458812
458886
  name: "UR",
458813
- version: "1.80.2",
458887
+ version: "1.80.3",
458814
458888
  protocolVersion: "0.1.0",
458815
458889
  workspaceRoot: options2.cwd,
458816
458890
  capabilities: {
@@ -475918,7 +475992,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
475918
475992
  return [];
475919
475993
  }
475920
475994
  }
475921
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.80.2") {
475995
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.80.3") {
475922
475996
  if (process.env.USER_TYPE === "ant") {
475923
475997
  const changelog = "";
475924
475998
  if (changelog) {
@@ -475945,7 +476019,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.80.2")
475945
476019
  releaseNotes
475946
476020
  };
475947
476021
  }
475948
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.80.2") {
476022
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.80.3") {
475949
476023
  if (process.env.USER_TYPE === "ant") {
475950
476024
  const changelog = "";
475951
476025
  if (changelog) {
@@ -478850,7 +478924,7 @@ function getRecentActivitySync() {
478850
478924
  return cachedActivity;
478851
478925
  }
478852
478926
  function getLogoDisplayData() {
478853
- const version2 = process.env.DEMO_VERSION ?? "1.80.2";
478927
+ const version2 = process.env.DEMO_VERSION ?? "1.80.3";
478854
478928
  const serverUrl = getDirectConnectServerUrl();
478855
478929
  const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd());
478856
478930
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -479718,7 +479792,7 @@ function LogoV2() {
479718
479792
  if ($2[2] === Symbol.for("react.memo_cache_sentinel")) {
479719
479793
  t2 = () => {
479720
479794
  const currentConfig = getGlobalConfig();
479721
- if (currentConfig.lastReleaseNotesSeen === "1.80.2") {
479795
+ if (currentConfig.lastReleaseNotesSeen === "1.80.3") {
479722
479796
  return;
479723
479797
  }
479724
479798
  saveGlobalConfig(_temp325);
@@ -480403,12 +480477,12 @@ function LogoV2() {
480403
480477
  return t41;
480404
480478
  }
480405
480479
  function _temp325(current) {
480406
- if (current.lastReleaseNotesSeen === "1.80.2") {
480480
+ if (current.lastReleaseNotesSeen === "1.80.3") {
480407
480481
  return current;
480408
480482
  }
480409
480483
  return {
480410
480484
  ...current,
480411
- lastReleaseNotesSeen: "1.80.2"
480485
+ lastReleaseNotesSeen: "1.80.3"
480412
480486
  };
480413
480487
  }
480414
480488
  function _temp241(s_0) {
@@ -496500,7 +496574,7 @@ function compileAgenticCiWorkflow(specName = "default", options2 = {}) {
496500
496574
  if (spec.name !== specName) {
496501
496575
  throw new Error("Agentic CI workflow spec name does not match");
496502
496576
  }
496503
- const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.80.2" : "1.80.2");
496577
+ const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.80.3" : "1.80.3");
496504
496578
  if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(packageVersion)) {
496505
496579
  throw new Error("invalid ur-agent package version");
496506
496580
  }
@@ -497493,7 +497567,7 @@ runner; \`ur trigger\` is the inbound parser that decides what to run.
497493
497567
  path: ".github/workflows/ur.yml",
497494
497568
  root: "project",
497495
497569
  content: compileAgenticCiWorkflow("default", {
497496
- packageVersion: typeof MACRO !== "undefined" ? "1.80.2" : "1.80.2"
497570
+ packageVersion: typeof MACRO !== "undefined" ? "1.80.3" : "1.80.3"
497497
497571
  })
497498
497572
  },
497499
497573
  {
@@ -497556,7 +497630,7 @@ function value(tokens, flag) {
497556
497630
  return index2 >= 0 ? tokens[index2 + 1] : undefined;
497557
497631
  }
497558
497632
  function cliVersion() {
497559
- return typeof MACRO !== "undefined" ? "1.80.2" : "1.80.2";
497633
+ return typeof MACRO !== "undefined" ? "1.80.3" : "1.80.3";
497560
497634
  }
497561
497635
  function workflowPath(cwd2) {
497562
497636
  return join168(cwd2, ".github", "workflows", "ur-agentic-ci.yml");
@@ -503412,7 +503486,7 @@ function createAcpStdioApp(deps) {
503412
503486
  }
503413
503487
  },
503414
503488
  authMethods: [],
503415
- agentInfo: { name: "UR-Nexus", version: "1.80.2" }
503489
+ agentInfo: { name: "UR-Nexus", version: "1.80.3" }
503416
503490
  })).onRequest("authenticate", () => ({})).onRequest("session/new", async (context6) => {
503417
503491
  const result = runtime2.newSession(context6.params.cwd, context6.params.mcpServers, context6.params.additionalDirectories);
503418
503492
  await runtime2.announce({
@@ -503509,7 +503583,7 @@ function createAcpStdioAgent(deps) {
503509
503583
  }
503510
503584
  },
503511
503585
  authMethods: [],
503512
- agentInfo: { name: "UR-Nexus", version: "1.80.2" }
503586
+ agentInfo: { name: "UR-Nexus", version: "1.80.3" }
503513
503587
  });
503514
503588
  return;
503515
503589
  case "authenticate":
@@ -714735,7 +714809,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
714735
714809
  smapsRollup,
714736
714810
  platform: process.platform,
714737
714811
  nodeVersion: process.version,
714738
- ccVersion: "1.80.2"
714812
+ ccVersion: "1.80.3"
714739
714813
  };
714740
714814
  }
714741
714815
  async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
@@ -715324,7 +715398,7 @@ var init_bridge_kick = __esm(() => {
715324
715398
  var call154 = async () => {
715325
715399
  return {
715326
715400
  type: "text",
715327
- value: "1.80.2"
715401
+ value: "1.80.3"
715328
715402
  };
715329
715403
  }, version2, version_default;
715330
715404
  var init_version = __esm(() => {
@@ -726567,7 +726641,7 @@ function generateHtmlReport(data, insights) {
726567
726641
  </html>`;
726568
726642
  }
726569
726643
  function buildExportData(data, insights, facets, remoteStats) {
726570
- const version3 = typeof MACRO !== "undefined" ? "1.80.2" : "unknown";
726644
+ const version3 = typeof MACRO !== "undefined" ? "1.80.3" : "unknown";
726571
726645
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
726572
726646
  const facets_summary = {
726573
726647
  total: facets.size,
@@ -730880,7 +730954,7 @@ var init_sessionStorage = __esm(() => {
730880
730954
  init_settings2();
730881
730955
  init_slowOperations();
730882
730956
  init_uuid();
730883
- VERSION7 = typeof MACRO !== "undefined" ? "1.80.2" : "unknown";
730957
+ VERSION7 = typeof MACRO !== "undefined" ? "1.80.3" : "unknown";
730884
730958
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
730885
730959
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
730886
730960
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -732095,7 +732169,7 @@ var init_filesystem = __esm(() => {
732095
732169
  });
732096
732170
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
732097
732171
  const nonce = randomBytes24(16).toString("hex");
732098
- return join243(getURTempDir(), "bundled-skills", "1.80.2", nonce);
732172
+ return join243(getURTempDir(), "bundled-skills", "1.80.3", nonce);
732099
732173
  });
732100
732174
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
732101
732175
  });
@@ -737551,13 +737625,13 @@ function getTaskToolGuidance(enabledTools) {
737551
737625
  const canUpdate = enabledTools.has(TASK_UPDATE_TOOL_NAME);
737552
737626
  const canList = enabledTools.has(TASK_LIST_TOOL_NAME);
737553
737627
  if (canCreate && canUpdate) {
737554
- return `For a request with 3+ distinct steps, multiple independently verifiable outcomes, delegation, dependency ordering, or an explicit user request for a task list, you MUST use ${TASK_CREATE_TOOL_NAME} to maintain the visible task list. Do not create a task merely because a message is actionable: a direct one-step change, informational answer, acknowledgement, or small correction can proceed without a board. Decompose a large request into 2-8 bounded outcomes (never more than 12), each with one observable result, likely file scope, and acceptance evidence; never copy the raw user prompt as a task title. Create tasks first without guessed or forward dependency IDs. After each real ID is returned, use ${TASK_UPDATE_TOOL_NAME} to add dependencies only to tasks that already exist; never reference a future task, and never create a self-dependency. Keep the final graph dependency-ordered; independent branches stay dependency-free. If the user interrupts while tasks are pending or in progress, inspect the active list, preserve still-relevant work, update the affected task, add a task only for a genuinely distinct new outcome, and mark superseded work skipped rather than starting from an empty list. Mark each unblocked task in_progress when work starts and completed immediately after implementation and relevant verification succeed; use failed for attempted work that did not finish, skipped only for explicitly inapplicable work, and leave dependency-blocked work open with its blocker recorded.${canList ? ` Use ${TASK_LIST_TOOL_NAME} after every interruption and to select the next unblocked task; when all work succeeds, show the final list with every task completed before finishing.` : ""}`;
737628
+ return `UR uses a strict-hybrid task policy. Before the first mutation, you MUST use ${TASK_CREATE_TOOL_NAME} for 2+ distinct requested outcomes, enumerated or sequenced work, multiple independently verifiable deliverables, plan-mode implementation, delegation or parallel agents, dependency ordering, project-sized builds/refactors, and release, publishing, deployment, migration, security, credential, permission, sandbox, production, or other high-risk work. An explicit user request for tasks always wins. Only a genuinely atomic, low-risk change with one outcome may proceed directly; informational answers, acknowledgements, and small corrections need no board. Read-only investigation is always allowed before planning. Decompose tracked work into 2-8 bounded outcomes (never more than 12), each with one observable result, likely file scope, and acceptance evidence; never copy the raw user prompt as a task title. Create tasks first without guessed or forward dependency IDs. After each real ID is returned, use ${TASK_UPDATE_TOOL_NAME} to add dependencies only to tasks that already exist; never reference a future task, and never create a self-dependency. Keep the final graph dependency-ordered; independent branches stay dependency-free. If the user interrupts while tasks are pending or in progress, inspect the active list, preserve still-relevant work, update the affected task, add a task only for a genuinely distinct new outcome, and mark superseded work skipped rather than starting from an empty list. Mark each unblocked task in_progress when work starts and completed immediately after implementation and relevant verification succeed; use failed for attempted work that did not finish, skipped only for explicitly inapplicable work, and leave dependency-blocked work open with its blocker recorded.${canList ? ` Use ${TASK_LIST_TOOL_NAME} after every interruption and to select the next unblocked task; when all work succeeds, show the final list with every task completed before finishing.` : ""}`;
737555
737629
  }
737556
737630
  if (canUpdate) {
737557
737631
  return `Keep assigned tasks current with ${TASK_UPDATE_TOOL_NAME}: mark the task in_progress when starting, completed only after implementation and relevant verification succeed, and leave blocked or partial work open with its blocker recorded.${canList ? ` Use ${TASK_LIST_TOOL_NAME} to select the next unblocked task.` : ""}`;
737558
737632
  }
737559
737633
  if (canCreate) {
737560
- return `Use ${TASK_CREATE_TOOL_NAME} for 3+ distinct steps, multiple independently verifiable outcomes, delegation, dependency ordering, or an explicit user request for a task list. A large request should have 2-8 bounded outcomes (never more than 12). Do not create a task merely because a message is actionable; skip a board for direct one-step work, informational answers, acknowledgements, and small corrections. Never copy the raw prompt as a task title. Create tasks without guessed or forward IDs; dependencies may name only tasks whose real IDs have already been returned. Preserve pending or in-progress work after an interruption, update affected work, and add only genuinely distinct new outcomes.`;
737634
+ return `Use ${TASK_CREATE_TOOL_NAME} before mutation for 2+ distinct outcomes, sequenced work, project-sized changes, delegation, dependencies, releases/deployments/migrations, security-sensitive work, or an explicit task-list request. Only a genuinely atomic low-risk change may proceed directly. A tracked request should have 2-8 bounded outcomes (never more than 12). Never copy the raw prompt as a task title. Create tasks without guessed or forward IDs; dependencies may name only tasks whose real IDs have already been returned. Preserve pending or in-progress work after an interruption, update affected work, and add only genuinely distinct new outcomes.`;
737561
737635
  }
737562
737636
  if (enabledTools.has(TODO_WRITE_TOOL_NAME)) {
737563
737637
  return `Track multi-step work with ${TODO_WRITE_TOOL_NAME}. Keep items dependency-ordered and mark each item completed immediately after its implementation and relevant verification succeed.`;
@@ -738484,7 +738558,7 @@ function computeFingerprint(messageText2, version3) {
738484
738558
  }
738485
738559
  function computeFingerprintFromMessages(messages) {
738486
738560
  const firstMessageText = extractFirstMessageText(messages);
738487
- return computeFingerprint(firstMessageText, "1.80.2");
738561
+ return computeFingerprint(firstMessageText, "1.80.3");
738488
738562
  }
738489
738563
  var FINGERPRINT_SALT = "59cf53e54c78";
738490
738564
  var init_fingerprint = () => {};
@@ -740409,7 +740483,7 @@ async function sideQuery(opts) {
740409
740483
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
740410
740484
  }
740411
740485
  const messageText2 = extractFirstUserMessageText(messages);
740412
- const fingerprint2 = computeFingerprint(messageText2, "1.80.2");
740486
+ const fingerprint2 = computeFingerprint(messageText2, "1.80.3");
740413
740487
  const attributionHeader = getAttributionHeader(fingerprint2);
740414
740488
  const systemBlocks = [
740415
740489
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -745243,7 +745317,7 @@ function buildSystemInitMessage(inputs) {
745243
745317
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
745244
745318
  apiKeySource: getURHQApiKeyWithSource().source,
745245
745319
  betas: getSdkBetas(),
745246
- ur_version: "1.80.2",
745320
+ ur_version: "1.80.3",
745247
745321
  output_style: outputStyle,
745248
745322
  agents: inputs.agents.map((agent2) => agent2.agentType),
745249
745323
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
@@ -759079,7 +759153,7 @@ var init_useVoiceEnabled = __esm(() => {
759079
759153
  function getSemverPart(version3) {
759080
759154
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
759081
759155
  }
759082
- function useUpdateNotification(updatedVersion, initialVersion = "1.80.2") {
759156
+ function useUpdateNotification(updatedVersion, initialVersion = "1.80.3") {
759083
759157
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react225.useState(() => getSemverPart(initialVersion));
759084
759158
  if (!updatedVersion) {
759085
759159
  return null;
@@ -759128,7 +759202,7 @@ function AutoUpdater({
759128
759202
  return;
759129
759203
  }
759130
759204
  if (false) {}
759131
- const currentVersion = "1.80.2";
759205
+ const currentVersion = "1.80.3";
759132
759206
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
759133
759207
  let latestVersion = await getLatestVersion(channel);
759134
759208
  const isDisabled = isAutoUpdaterDisabled();
@@ -759357,12 +759431,12 @@ function NativeAutoUpdater({
759357
759431
  logEvent("tengu_native_auto_updater_start", {});
759358
759432
  try {
759359
759433
  const maxVersion = await getMaxVersion();
759360
- if (maxVersion && gt("1.80.2", maxVersion)) {
759434
+ if (maxVersion && gt("1.80.3", maxVersion)) {
759361
759435
  const msg = await getMaxVersionMessage();
759362
759436
  setMaxVersionIssue(msg ?? "affects your version");
759363
759437
  }
759364
759438
  const result = await installLatest(channel);
759365
- const currentVersion = "1.80.2";
759439
+ const currentVersion = "1.80.3";
759366
759440
  const latencyMs = Date.now() - startTime;
759367
759441
  if (result.lockFailed) {
759368
759442
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -759499,17 +759573,17 @@ function PackageManagerAutoUpdater(t0) {
759499
759573
  const maxVersion = await getMaxVersion();
759500
759574
  if (maxVersion && latest && gt(latest, maxVersion)) {
759501
759575
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
759502
- if (gte("1.80.2", maxVersion)) {
759503
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.80.2"} is already at or above maxVersion ${maxVersion}, skipping update`);
759576
+ if (gte("1.80.3", maxVersion)) {
759577
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.80.3"} is already at or above maxVersion ${maxVersion}, skipping update`);
759504
759578
  setUpdateAvailable(false);
759505
759579
  return;
759506
759580
  }
759507
759581
  latest = maxVersion;
759508
759582
  }
759509
- const hasUpdate = latest && !gte("1.80.2", latest) && !shouldSkipVersion(latest);
759583
+ const hasUpdate = latest && !gte("1.80.3", latest) && !shouldSkipVersion(latest);
759510
759584
  setUpdateAvailable(!!hasUpdate);
759511
759585
  if (hasUpdate) {
759512
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.80.2"} -> ${latest}`);
759586
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.80.3"} -> ${latest}`);
759513
759587
  }
759514
759588
  };
759515
759589
  $2[0] = t1;
@@ -759543,7 +759617,7 @@ function PackageManagerAutoUpdater(t0) {
759543
759617
  wrap: "truncate",
759544
759618
  children: [
759545
759619
  "currentVersion: ",
759546
- "1.80.2"
759620
+ "1.80.3"
759547
759621
  ]
759548
759622
  }, undefined, true, undefined, this);
759549
759623
  $2[3] = verbose;
@@ -770396,7 +770470,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
770396
770470
  project_dir: getOriginalCwd(),
770397
770471
  added_dirs: addedDirs
770398
770472
  },
770399
- version: "1.80.2",
770473
+ version: "1.80.3",
770400
770474
  output_style: {
770401
770475
  name: outputStyleName
770402
770476
  },
@@ -770531,7 +770605,7 @@ function StatusLineInner({
770531
770605
  const attention = customStatusError ?? taskAttention;
770532
770606
  const terminalSize = React133.useContext(TerminalSizeContext);
770533
770607
  const defaultStatusLineText = buildDefaultStatusBar({
770534
- version: "1.80.2",
770608
+ version: "1.80.3",
770535
770609
  providerLabel: providerRuntime.providerLabel,
770536
770610
  authMode: providerRuntime.authLabel,
770537
770611
  model: renderModelName(mainLoopModel) || providerRuntime.model || "",
@@ -782786,7 +782860,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
782786
782860
  } catch {}
782787
782861
  const data = {
782788
782862
  trigger: trigger2,
782789
- version: "1.80.2",
782863
+ version: "1.80.3",
782790
782864
  platform: process.platform,
782791
782865
  transcript,
782792
782866
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -795155,7 +795229,7 @@ function WelcomeV2() {
795155
795229
  dimColor: true,
795156
795230
  children: [
795157
795231
  "v",
795158
- "1.80.2"
795232
+ "1.80.3"
795159
795233
  ]
795160
795234
  }, undefined, true, undefined, this)
795161
795235
  ]
@@ -796415,7 +796489,7 @@ function completeOnboarding() {
796415
796489
  saveGlobalConfig((current) => ({
796416
796490
  ...current,
796417
796491
  hasCompletedOnboarding: true,
796418
- lastOnboardingVersion: "1.80.2"
796492
+ lastOnboardingVersion: "1.80.3"
796419
796493
  }));
796420
796494
  }
796421
796495
  function showDialog(root2, renderer) {
@@ -801561,7 +801635,7 @@ function appendToLog(path28, message) {
801561
801635
  cwd: getFsImplementation().cwd(),
801562
801636
  userType: process.env.USER_TYPE,
801563
801637
  sessionId: getSessionId(),
801564
- version: "1.80.2"
801638
+ version: "1.80.3"
801565
801639
  };
801566
801640
  getLogWriter(path28).write(messageWithTimestamp);
801567
801641
  }
@@ -805725,8 +805799,8 @@ async function getEnvLessBridgeConfig() {
805725
805799
  }
805726
805800
  async function checkEnvLessBridgeMinVersion() {
805727
805801
  const cfg = await getEnvLessBridgeConfig();
805728
- if (cfg.min_version && lt("1.80.2", cfg.min_version)) {
805729
- return `Your version of UR (${"1.80.2"}) is too old for Remote Control.
805802
+ if (cfg.min_version && lt("1.80.3", cfg.min_version)) {
805803
+ return `Your version of UR (${"1.80.3"}) is too old for Remote Control.
805730
805804
  Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
805731
805805
  }
805732
805806
  return null;
@@ -806200,7 +806274,7 @@ async function initBridgeCore(params) {
806200
806274
  const rawApi = createBridgeApiClient({
806201
806275
  baseUrl,
806202
806276
  getAccessToken,
806203
- runnerVersion: "1.80.2",
806277
+ runnerVersion: "1.80.3",
806204
806278
  onDebug: logForDebugging,
806205
806279
  onAuth401,
806206
806280
  getTrustedDeviceToken
@@ -815673,7 +815747,7 @@ function getAgUiCapabilities() {
815673
815747
  name: "UR-Nexus",
815674
815748
  type: "ur-nexus",
815675
815749
  description: "Provider-flexible, local-first autonomous engineering workflow agent.",
815676
- version: "1.80.2",
815750
+ version: "1.80.3",
815677
815751
  provider: "UR",
815678
815752
  documentationUrl: "https://github.com/Maitham16/UR/blob/master/docs/AG_UI.md"
815679
815753
  },
@@ -816804,7 +816878,7 @@ function createMCPServer(cwd4, debug2, verbose) {
816804
816878
  };
816805
816879
  const server2 = new Server({
816806
816880
  name: "ur-nexus",
816807
- version: "1.80.2"
816881
+ version: "1.80.3"
816808
816882
  }, {
816809
816883
  capabilities: {
816810
816884
  tools: {}
@@ -818008,7 +818082,7 @@ function thrownResponse(error40) {
818008
818082
  }
818009
818083
  async function createUrMcp2026Runtime(options5) {
818010
818084
  const server2 = createMCPServer(options5.cwd, options5.debug === true, options5.verbose === true);
818011
- const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.80.2" }, { capabilities: {} });
818085
+ const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.80.3" }, { capabilities: {} });
818012
818086
  const [clientTransport, serverTransport] = createLinkedTransportPair();
818013
818087
  try {
818014
818088
  await server2.connect(serverTransport);
@@ -818019,7 +818093,7 @@ async function createUrMcp2026Runtime(options5) {
818019
818093
  }
818020
818094
  const runtime2 = new Mcp2026Runtime({
818021
818095
  cwd: options5.cwd,
818022
- version: "1.80.2",
818096
+ version: "1.80.3",
818023
818097
  backend: {
818024
818098
  listTools: async () => {
818025
818099
  const listed = await client2.listTools();
@@ -820621,7 +820695,7 @@ async function update() {
820621
820695
  logEvent("tengu_update_check", {});
820622
820696
  const diagnostic2 = await getDoctorDiagnostic();
820623
820697
  const result = await checkUpgradeStatus({
820624
- currentVersion: "1.80.2",
820698
+ currentVersion: "1.80.3",
820625
820699
  packageName: UR_AGENT_PACKAGE_NAME,
820626
820700
  installationType: diagnostic2.installationType,
820627
820701
  latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
@@ -821949,7 +822023,7 @@ ${customInstructions}` : customInstructions;
821949
822023
  }
821950
822024
  }
821951
822025
  logForDiagnosticsNoPII("info", "started", {
821952
- version: "1.80.2",
822026
+ version: "1.80.3",
821953
822027
  is_native_binary: isInBundledMode()
821954
822028
  });
821955
822029
  registerCleanup(async () => {
@@ -822736,7 +822810,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
822736
822810
  pendingHookMessages
822737
822811
  }, renderAndRun);
822738
822812
  }
822739
- }).version("1.80.2 (UR-Nexus)", "-v, --version", "Output the version number");
822813
+ }).version("1.80.3 (UR-Nexus)", "-v, --version", "Output the version number");
822740
822814
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
822741
822815
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
822742
822816
  if (canUserConfigureAdvisor()) {
@@ -823844,7 +823918,7 @@ if (false) {}
823844
823918
  async function main2() {
823845
823919
  const args = process.argv.slice(2);
823846
823920
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
823847
- console.log(`${"1.80.2"} (UR-Nexus)`);
823921
+ console.log(`${"1.80.3"} (UR-Nexus)`);
823848
823922
  return;
823849
823923
  }
823850
823924
  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.3 Addition
13
+
14
+ | Addition | Surface | What it adds |
15
+ | --- | --- | --- |
16
+ | Strict-hybrid task planning | Interactive `TaskCreate` lifecycle, `tasks.requireBeforeChanges` | Keeps atomic low-risk work direct, but requires a visible actionable task before mutation for multi-outcome, sequenced, planned, delegated, project-sized, and high-risk lifecycle work. Reads stay open, custom profiles without `TaskCreate` cannot deadlock, and operators retain advisory and fully strict modes. |
17
+
12
18
  ## v1.80.0 Additions
13
19
 
14
20
  | Addition | Surface | What it adds |
@@ -17,6 +17,31 @@ Start UR with `--screen-reader`, set `UR_SCREEN_READER=1`, or use
17
17
  edits, and reduced animation. `vimEscape` accepts 2–8 printable non-whitespace
18
18
  characters or `off`.
19
19
 
20
+ ## Interactive task planning
21
+
22
+ UR uses strict-hybrid task tracking by default: one atomic, low-risk outcome
23
+ can proceed directly, while multi-outcome, sequenced, planned, delegated,
24
+ project-sized, release, migration, security, sandbox, and production work must
25
+ create a visible task before the first mutation. Read-only investigation is
26
+ never blocked.
27
+
28
+ ```jsonc
29
+ {
30
+ "tasks": {
31
+ "requireBeforeChanges": {
32
+ "enabled": true,
33
+ "freeReads": 3
34
+ }
35
+ }
36
+ }
37
+ ```
38
+
39
+ `freeReads` is a compatibility allowance for non-interactive integrations that
40
+ do not carry a classified user turn; it is not a limit on investigation. Set
41
+ it to `0` to require a task before every mutation. Set `enabled` to `false` to
42
+ return to advisory task tracking. Profiles that omit `TaskCreate` are not
43
+ gated, because they could not satisfy the requirement.
44
+
20
45
  ## Model Providers
21
46
 
22
47
  UR-Nexus supports official provider access paths only:
package/docs/USAGE.md CHANGED
@@ -428,6 +428,33 @@ in dependency order. `ur exec` materializes this graph deterministically; the
428
428
  interactive agent follows the same lifecycle and its task/agent tools enforce
429
429
  the concurrency boundary.
430
430
 
431
+ Interactive work uses a strict-hybrid task policy by default. One atomic,
432
+ low-risk outcome can be implemented directly. Before the first mutation, UR
433
+ requires a visible task for requests with two or more outcomes, enumerated or
434
+ sequenced work, plan mode, delegation, dependencies, project-sized work, and
435
+ release, publishing, deployment, migration, security, credential, permission,
436
+ sandbox, or production risk. Read-only inspection never needs a task, so the
437
+ agent can understand the repository before it creates the board. A custom tool
438
+ profile without `TaskCreate` remains usable and does not deadlock.
439
+
440
+ The default can be tuned in `.ur/settings.json` or user settings:
441
+
442
+ ```json
443
+ {
444
+ "tasks": {
445
+ "requireBeforeChanges": {
446
+ "enabled": true,
447
+ "freeReads": 3
448
+ }
449
+ }
450
+ }
451
+ ```
452
+
453
+ Set `enabled` to `false` for advisory task tracking. Set `freeReads` to `0` for
454
+ the fully strict policy that requires a task before every mutation, including
455
+ an atomic change. The positive atomic classification otherwise stays direct
456
+ regardless of how many read-only tools were needed.
457
+
431
458
  A user prompt does not create a placeholder task. The task panel stays quiet
432
459
  for informational conversation, direct one-step changes, acknowledgements, and
433
460
  small corrections. For genuinely multi-step work, multiple independently
@@ -19,7 +19,7 @@ You need:
19
19
 
20
20
  ```sh
21
21
  ur --version
22
- # expected for this release: "1.80.2 (UR-Nexus)"
22
+ # expected for this release: "1.80.3 (UR-Nexus)"
23
23
  ```
24
24
 
25
25
  ## 0.1 First-workspace model selection (1.45.4)
@@ -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.2</p>
48
+ <p class="eyebrow">Version 1.80.3</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.2"
10
+ version = "1.80.3"
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.2",
5
+ "version": "1.80.3",
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.2",
3
+ "version": "1.80.3",
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",