ur-agent 1.68.16 → 1.68.17

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,20 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.68.17
4
+
5
+ - Fixed false `TaskListRequired` failures for observational Bash capability
6
+ checks. Task tracking now has a classification distinct from permission
7
+ auto-approval, so an executable probe can remain permission- and
8
+ sandbox-sensitive without being mislabeled as a workspace change.
9
+ - The Bash classification is category-based rather than tailored to one
10
+ module: known reads, exact help/version checks, command-presence checks, and
11
+ import-only Python probes for any module can run without reopening a
12
+ completed task. Arbitrary interpreter code, output writes, background
13
+ execution, sandbox overrides, and unknown commands remain task-gated.
14
+ - Both the initial call and its final post-permission input are classified.
15
+ Hooks or permission handlers therefore cannot rewrite an observational probe
16
+ into an untracked mutation.
17
+
3
18
  ## 1.68.16
4
19
 
5
20
  - First pieces of the UR Nexus visual identity, as terminal primitives rather
package/dist/cli.js CHANGED
@@ -75717,7 +75717,7 @@ var init_auth = __esm(() => {
75717
75717
 
75718
75718
  // src/utils/userAgent.ts
75719
75719
  function getURCodeUserAgent() {
75720
- return `ur/${"1.68.16"}`;
75720
+ return `ur/${"1.68.17"}`;
75721
75721
  }
75722
75722
 
75723
75723
  // src/utils/workloadContext.ts
@@ -75739,7 +75739,7 @@ function getUserAgent() {
75739
75739
  const clientApp = process.env.UR_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}` : "";
75740
75740
  const workload = getWorkload();
75741
75741
  const workloadSuffix = workload ? `, workload/${workload}` : "";
75742
- return `ur-cli/${"1.68.16"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
75742
+ return `ur-cli/${"1.68.17"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
75743
75743
  }
75744
75744
  function getMCPUserAgent() {
75745
75745
  const parts = [];
@@ -75753,7 +75753,7 @@ function getMCPUserAgent() {
75753
75753
  parts.push(`client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}`);
75754
75754
  }
75755
75755
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
75756
- return `ur/${"1.68.16"}${suffix}`;
75756
+ return `ur/${"1.68.17"}${suffix}`;
75757
75757
  }
75758
75758
  function getWebFetchUserAgent() {
75759
75759
  return `UR-User (${getURCodeUserAgent()})`;
@@ -75891,7 +75891,7 @@ var init_user = __esm(() => {
75891
75891
  deviceId,
75892
75892
  sessionId: getSessionId(),
75893
75893
  email: getEmail(),
75894
- appVersion: "1.68.16",
75894
+ appVersion: "1.68.17",
75895
75895
  platform: getHostPlatformForAnalytics(),
75896
75896
  organizationUuid,
75897
75897
  accountUuid,
@@ -84091,7 +84091,7 @@ var init_metadata = __esm(() => {
84091
84091
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
84092
84092
  WHITESPACE_REGEX = /\s+/;
84093
84093
  getVersionBase = memoize_default(() => {
84094
- const match = "1.68.16".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
84094
+ const match = "1.68.17".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
84095
84095
  return match ? match[0] : undefined;
84096
84096
  });
84097
84097
  buildEnvContext = memoize_default(async () => {
@@ -84131,7 +84131,7 @@ var init_metadata = __esm(() => {
84131
84131
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
84132
84132
  isURCodeAction: isEnvTruthy(process.env.UR_CODE_ACTION),
84133
84133
  isURAiAuth: isURAISubscriber(),
84134
- version: "1.68.16",
84134
+ version: "1.68.17",
84135
84135
  versionBase: getVersionBase(),
84136
84136
  buildTime: "",
84137
84137
  deploymentEnvironment: env2.detectDeploymentEnvironment(),
@@ -84801,7 +84801,7 @@ function initialize1PEventLogging() {
84801
84801
  const platform2 = getPlatform();
84802
84802
  const attributes = {
84803
84803
  [import_semantic_conventions4.ATTR_SERVICE_NAME]: "ur",
84804
- [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.68.16"
84804
+ [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.68.17"
84805
84805
  };
84806
84806
  if (platform2 === "wsl") {
84807
84807
  const wslVersion = getWslVersion();
@@ -84829,7 +84829,7 @@ function initialize1PEventLogging() {
84829
84829
  })
84830
84830
  ]
84831
84831
  });
84832
- firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.68.16");
84832
+ firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.68.17");
84833
84833
  }
84834
84834
  async function reinitialize1PEventLoggingIfConfigChanged() {
84835
84835
  if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
@@ -94717,7 +94717,7 @@ function formatAgentTrendReport(report = buildAgentTrendReport()) {
94717
94717
  function formatA2AAgentCard(options = {}, pretty = true) {
94718
94718
  return JSON.stringify(buildA2AAgentCard(options), null, pretty ? 2 : 0);
94719
94719
  }
94720
- var urVersion = "1.68.16", researchSnapshotDate = "2026-07-15", coverage, priorityRoadmap;
94720
+ var urVersion = "1.68.17", researchSnapshotDate = "2026-07-15", coverage, priorityRoadmap;
94721
94721
  var init_trends = __esm(() => {
94722
94722
  init_a2aCardSignature();
94723
94723
  coverage = [
@@ -97520,7 +97520,7 @@ function getAttributionHeader(fingerprint) {
97520
97520
  if (!isAttributionHeaderEnabled()) {
97521
97521
  return "";
97522
97522
  }
97523
- const version2 = `${"1.68.16"}.${fingerprint}`;
97523
+ const version2 = `${"1.68.17"}.${fingerprint}`;
97524
97524
  const entrypoint = process.env.UR_CODE_ENTRYPOINT ?? "unknown";
97525
97525
  const cch = "";
97526
97526
  const workload = getWorkload();
@@ -155398,7 +155398,7 @@ var init_projectSafety = __esm(() => {
155398
155398
  function getInstruments() {
155399
155399
  if (instruments)
155400
155400
  return instruments;
155401
- const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.68.16");
155401
+ const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.68.17");
155402
155402
  instruments = {
155403
155403
  operationDuration: meter.createHistogram("gen_ai.client.operation.duration", {
155404
155404
  description: "GenAI operation duration.",
@@ -155496,7 +155496,7 @@ function genAiAgentAttributes() {
155496
155496
  "gen_ai.operation.name": GEN_AI_OPERATION_INVOKE_AGENT,
155497
155497
  "gen_ai.provider.name": "ur",
155498
155498
  "gen_ai.agent.name": "UR-Nexus",
155499
- "gen_ai.agent.version": "1.68.16"
155499
+ "gen_ai.agent.version": "1.68.17"
155500
155500
  };
155501
155501
  }
155502
155502
  function genAiWorkflowAttributes(workflowName) {
@@ -155512,7 +155512,7 @@ function genAiWorkflowAttributes(workflowName) {
155512
155512
  function startGenAiWorkflowSpan(workflowName) {
155513
155513
  const attributes = genAiWorkflowAttributes(workflowName);
155514
155514
  const name = typeof attributes["gen_ai.workflow.name"] === "string" ? `invoke_workflow ${attributes["gen_ai.workflow.name"]}` : GEN_AI_OPERATION_INVOKE_WORKFLOW;
155515
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.68.16").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
155515
+ return import_api10.trace.getTracer("ur-agent.gen_ai", "1.68.17").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
155516
155516
  }
155517
155517
  function endGenAiWorkflowSpan(span, options2 = {}) {
155518
155518
  try {
@@ -155550,7 +155550,7 @@ function startGenAiMemorySpan(operation, options2 = {}) {
155550
155550
  if (options2.recordCount !== undefined && Number.isInteger(options2.recordCount) && options2.recordCount >= 0) {
155551
155551
  attributes["gen_ai.memory.record.count"] = options2.recordCount;
155552
155552
  }
155553
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.68.16").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
155553
+ return import_api10.trace.getTracer("ur-agent.gen_ai", "1.68.17").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
155554
155554
  }
155555
155555
  function endGenAiMemorySpan(span, options2 = {}) {
155556
155556
  try {
@@ -249033,7 +249033,7 @@ function getTelemetryAttributes() {
249033
249033
  attributes["session.id"] = sessionId;
249034
249034
  }
249035
249035
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
249036
- attributes["app.version"] = "1.68.16";
249036
+ attributes["app.version"] = "1.68.17";
249037
249037
  }
249038
249038
  const oauthAccount = getOauthAccountInfo();
249039
249039
  if (oauthAccount) {
@@ -295513,7 +295513,7 @@ function getInstallationEnv() {
295513
295513
  return;
295514
295514
  }
295515
295515
  function getURCodeVersion() {
295516
- return "1.68.16";
295516
+ return "1.68.17";
295517
295517
  }
295518
295518
  async function getInstalledVSCodeExtensionVersion(command) {
295519
295519
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -302844,7 +302844,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
302844
302844
  const client2 = new Client({
302845
302845
  name: "ur",
302846
302846
  title: "UR",
302847
- version: "1.68.16",
302847
+ version: "1.68.17",
302848
302848
  description: "UR-Nexus autonomous engineering workflow engine",
302849
302849
  websiteUrl: PRODUCT_URL
302850
302850
  }, {
@@ -303204,7 +303204,7 @@ var init_client5 = __esm(() => {
303204
303204
  const client2 = new Client({
303205
303205
  name: "ur",
303206
303206
  title: "UR",
303207
- version: "1.68.16",
303207
+ version: "1.68.17",
303208
303208
  description: "UR-Nexus autonomous engineering workflow engine",
303209
303209
  websiteUrl: PRODUCT_URL
303210
303210
  }, {
@@ -315743,7 +315743,7 @@ async function createRuntime() {
315743
315743
  bootstrapTelemetry();
315744
315744
  const resource = defaultResource().merge(detectResources({ detectors: [envDetector] })).merge(resourceFromAttributes({
315745
315745
  [import_semantic_conventions7.ATTR_SERVICE_NAME]: "ur-agent",
315746
- [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.68.16"
315746
+ [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.68.17"
315747
315747
  }));
315748
315748
  const tracerProvider = exporters.traces.length > 0 ? new BasicTracerProvider({
315749
315749
  resource,
@@ -315776,11 +315776,11 @@ async function createRuntime() {
315776
315776
  setMeterProvider(meterProvider);
315777
315777
  setLoggerProvider(loggerProvider);
315778
315778
  if (meterProvider) {
315779
- const meter = meterProvider.getMeter("ur-agent", "1.68.16");
315779
+ const meter = meterProvider.getMeter("ur-agent", "1.68.17");
315780
315780
  setMeter(meter, (name, options2) => meter.createCounter(name, options2));
315781
315781
  }
315782
315782
  if (loggerProvider) {
315783
- setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.68.16"));
315783
+ setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.68.17"));
315784
315784
  }
315785
315785
  if (!cleanupRegistered2) {
315786
315786
  cleanupRegistered2 = true;
@@ -316442,9 +316442,9 @@ async function assertMinVersion() {
316442
316442
  if (false) {}
316443
316443
  try {
316444
316444
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
316445
- if (versionConfig.minVersion && lt("1.68.16", versionConfig.minVersion)) {
316445
+ if (versionConfig.minVersion && lt("1.68.17", versionConfig.minVersion)) {
316446
316446
  console.error(`
316447
- It looks like your version of UR (${"1.68.16"}) needs an update.
316447
+ It looks like your version of UR (${"1.68.17"}) needs an update.
316448
316448
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
316449
316449
 
316450
316450
  To update, please run:
@@ -316660,7 +316660,7 @@ async function installGlobalPackage(specificVersion) {
316660
316660
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
316661
316661
  logEvent("tengu_auto_updater_lock_contention", {
316662
316662
  pid: process.pid,
316663
- currentVersion: "1.68.16"
316663
+ currentVersion: "1.68.17"
316664
316664
  });
316665
316665
  return "in_progress";
316666
316666
  }
@@ -316669,7 +316669,7 @@ async function installGlobalPackage(specificVersion) {
316669
316669
  if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
316670
316670
  logError2(new Error("Windows NPM detected in WSL environment"));
316671
316671
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
316672
- currentVersion: "1.68.16"
316672
+ currentVersion: "1.68.17"
316673
316673
  });
316674
316674
  console.error(`
316675
316675
  Error: Windows NPM detected in WSL
@@ -317204,7 +317204,7 @@ function detectLinuxGlobPatternWarnings() {
317204
317204
  }
317205
317205
  async function getDoctorDiagnostic() {
317206
317206
  const installationType = await getCurrentInstallationType();
317207
- const version2 = typeof MACRO !== "undefined" ? "1.68.16" : "unknown";
317207
+ const version2 = typeof MACRO !== "undefined" ? "1.68.17" : "unknown";
317208
317208
  const installationPath = await getInstallationPath();
317209
317209
  const invokedBinary = getInvokedBinary();
317210
317210
  const multipleInstallations = await detectMultipleInstallations();
@@ -318139,8 +318139,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
318139
318139
  const maxVersion = await getMaxVersion();
318140
318140
  if (maxVersion && gt(version2, maxVersion)) {
318141
318141
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
318142
- if (gte("1.68.16", maxVersion)) {
318143
- logForDebugging(`Native installer: current version ${"1.68.16"} is already at or above maxVersion ${maxVersion}, skipping update`);
318142
+ if (gte("1.68.17", maxVersion)) {
318143
+ logForDebugging(`Native installer: current version ${"1.68.17"} is already at or above maxVersion ${maxVersion}, skipping update`);
318144
318144
  logEvent("tengu_native_update_skipped_max_version", {
318145
318145
  latency_ms: Date.now() - startTime,
318146
318146
  max_version: maxVersion,
@@ -318151,7 +318151,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
318151
318151
  version2 = maxVersion;
318152
318152
  }
318153
318153
  }
318154
- if (!forceReinstall && version2 === "1.68.16" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
318154
+ if (!forceReinstall && version2 === "1.68.17" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
318155
318155
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
318156
318156
  logEvent("tengu_native_update_complete", {
318157
318157
  latency_ms: Date.now() - startTime,
@@ -385637,6 +385637,59 @@ var init_prompt22 = __esm(() => {
385637
385637
  init_prompt2();
385638
385638
  });
385639
385639
 
385640
+ // src/tools/BashTool/taskListReadOnly.ts
385641
+ function isPurePythonImportScript(script) {
385642
+ const statements = script.split(";").map((statement) => statement.trim()).filter(Boolean);
385643
+ return statements.length > 0 && statements.every((statement) => IMPORT_STATEMENT.test(statement) || FROM_IMPORT_STATEMENT.test(statement));
385644
+ }
385645
+ function isCapabilityProbeCommand(command) {
385646
+ const parsed = tryParseShellCommand(command);
385647
+ if (!parsed.success || parsed.tokens.some((token) => typeof token !== "string")) {
385648
+ return false;
385649
+ }
385650
+ const argv = parsed.tokens;
385651
+ if (argv.length === 2) {
385652
+ const [executable2, flag] = argv;
385653
+ if (executable2 && /^[A-Za-z0-9_./+-]+$/.test(executable2) && ["--help", "--version", "-h", "-V", "-v"].includes(flag ?? "")) {
385654
+ return true;
385655
+ }
385656
+ }
385657
+ if (argv.length >= 3 && argv[0] === "command" && (argv[1] === "-v" || argv[1] === "-V") && argv.slice(2).every((name) => /^[A-Za-z0-9_.+-]+$/.test(name))) {
385658
+ return true;
385659
+ }
385660
+ if (argv.length !== 3 || argv[1] !== "-c")
385661
+ return false;
385662
+ const executable = argv[0]?.split("/").pop();
385663
+ return Boolean(executable && /^python(?:\d+(?:\.\d+)*)?$/.test(executable) && isPurePythonImportScript(argv[2] ?? ""));
385664
+ }
385665
+ function isBashTaskListReadOnly(input) {
385666
+ if (typeof input.command !== "string" || input.command.trim() === "" || input.run_in_background === true || input.dangerouslyDisableSandbox === true || input._simulatedSedEdit !== undefined || /[\0\r\n]/.test(input.command)) {
385667
+ return false;
385668
+ }
385669
+ const output = extractOutputRedirections(input.command);
385670
+ if (output.hasDangerousRedirection || output.redirections.some(({ target }) => target !== "/dev/null")) {
385671
+ return false;
385672
+ }
385673
+ const subcommands = splitCommand_DEPRECATED(input.command);
385674
+ if (subcommands.length === 0)
385675
+ return false;
385676
+ return subcommands.every((command) => {
385677
+ const readOnly = checkReadOnlyConstraints({ command }, false);
385678
+ return readOnly.behavior === "allow" || isCapabilityProbeCommand(command);
385679
+ });
385680
+ }
385681
+ var IDENTIFIER = "[A-Za-z_][A-Za-z0-9_]*", DOTTED_NAME, IMPORT_ITEM, FROM_IMPORT_ITEM, IMPORT_STATEMENT, FROM_IMPORT_STATEMENT;
385682
+ var init_taskListReadOnly = __esm(() => {
385683
+ init_commands();
385684
+ init_shellQuote();
385685
+ init_readOnlyValidation();
385686
+ DOTTED_NAME = `${IDENTIFIER}(?:\\.${IDENTIFIER})*`;
385687
+ IMPORT_ITEM = `${DOTTED_NAME}(?:[ \\t]+as[ \\t]+${IDENTIFIER})?`;
385688
+ FROM_IMPORT_ITEM = `(?:${IDENTIFIER}|\\*)(?:[ \\t]+as[ \\t]+${IDENTIFIER})?`;
385689
+ IMPORT_STATEMENT = new RegExp(`^import[ \\t]+${IMPORT_ITEM}(?:[ \\t]*,[ \\t]*${IMPORT_ITEM})*$`);
385690
+ FROM_IMPORT_STATEMENT = new RegExp(`^from[ \\t]+${DOTTED_NAME}[ \\t]+import[ \\t]+` + `(?:${FROM_IMPORT_ITEM}(?:[ \\t]*,[ \\t]*${FROM_IMPORT_ITEM})*|` + `\\([ \\t]*${FROM_IMPORT_ITEM}` + `(?:[ \\t]*,[ \\t]*${FROM_IMPORT_ITEM})*[ \\t]*\\))$`);
385691
+ });
385692
+
385640
385693
  // src/tools/BashTool/BashTool.tsx
385641
385694
  import { copyFile as copyFile6, stat as fsStat2, truncate as fsTruncate2, link as link5 } from "fs/promises";
385642
385695
  function isSearchOrReadBashCommand(command) {
@@ -386082,6 +386135,7 @@ var init_BashTool = __esm(() => {
386082
386135
  init_readOnlyValidation();
386083
386136
  init_sedEditParser();
386084
386137
  init_shouldUseSandbox();
386138
+ init_taskListReadOnly();
386085
386139
  init_UI6();
386086
386140
  init_utils9();
386087
386141
  jsx_dev_runtime154 = __toESM(require_jsx_dev_runtime(), 1);
@@ -386181,6 +386235,9 @@ For commands that are harder to parse at a glance (piped commands, obscure flags
386181
386235
  const result = checkReadOnlyConstraints(input, compoundCommandHasCd);
386182
386236
  return result.behavior === "allow";
386183
386237
  },
386238
+ isTaskListReadOnly(input) {
386239
+ return isBashTaskListReadOnly(input);
386240
+ },
386184
386241
  toAutoClassifierInput(input) {
386185
386242
  return input.command;
386186
386243
  },
@@ -388362,7 +388419,7 @@ function isAnyTracingEnabled() {
388362
388419
  return isTelemetryEnabled() || isEnhancedTelemetryEnabled() || isBetaTracingEnabled();
388363
388420
  }
388364
388421
  function getTracer() {
388365
- return import_api39.trace.getTracer("ur-agent.gen_ai", "1.68.16");
388422
+ return import_api39.trace.getTracer("ur-agent.gen_ai", "1.68.17");
388366
388423
  }
388367
388424
  function createSpanAttributes(spanType, customAttributes = {}) {
388368
388425
  const baseAttributes = getTelemetryAttributes();
@@ -391011,10 +391068,16 @@ async function checkPermissionsAndCallTool(tool, toolUseID, input, toolUseContex
391011
391068
  isMutating = true;
391012
391069
  }
391013
391070
  const isPlanArtifactMutation = isCurrentPlanArtifactMutation(tool.name, parsedInput.data, toolUseContext);
391071
+ let isTaskListReadOnly = false;
391072
+ try {
391073
+ isTaskListReadOnly = Boolean(tool.isTaskListReadOnly?.(parsedInput.data));
391074
+ } catch {
391075
+ isTaskListReadOnly = false;
391076
+ }
391014
391077
  const isTaskListGatedMutation = isMutationRequiringTaskList({
391015
391078
  toolName: tool.name,
391016
391079
  toolInput: parsedInput.data,
391017
- isMutating
391080
+ isMutating: isMutating && !isTaskListReadOnly
391018
391081
  });
391019
391082
  if (isMutating && isBuiltInReadOnlyPlanningSubagent(toolUseContext)) {
391020
391083
  recordCallFailure(callSig);
@@ -391398,10 +391461,16 @@ async function checkPermissionsAndCallTool(tool, toolUseID, input, toolUseContex
391398
391461
  finalIsMutating = true;
391399
391462
  }
391400
391463
  const finalIsPlanArtifactMutation = isCurrentPlanArtifactMutation(tool.name, finalParsedInput.data, toolUseContext);
391464
+ let finalIsTaskListReadOnly = false;
391465
+ try {
391466
+ finalIsTaskListReadOnly = Boolean(tool.isTaskListReadOnly?.(finalParsedInput.data));
391467
+ } catch {
391468
+ finalIsTaskListReadOnly = false;
391469
+ }
391401
391470
  const finalIsTaskListGatedMutation = isMutationRequiringTaskList({
391402
391471
  toolName: tool.name,
391403
391472
  toolInput: finalParsedInput.data,
391404
- isMutating: finalIsMutating
391473
+ isMutating: finalIsMutating && !finalIsTaskListReadOnly
391405
391474
  });
391406
391475
  if (finalIsMutating && isBuiltInReadOnlyPlanningSubagent(toolUseContext)) {
391407
391476
  recordCallFailure(callSig);
@@ -419606,7 +419675,7 @@ function Feedback({
419606
419675
  platform: env2.platform,
419607
419676
  gitRepo: envInfo.isGit,
419608
419677
  terminal: env2.terminal,
419609
- version: "1.68.16",
419678
+ version: "1.68.17",
419610
419679
  transcript: normalizeMessagesForAPI(messages),
419611
419680
  errors: sanitizedErrors,
419612
419681
  lastApiRequest: getLastAPIRequest(),
@@ -419798,7 +419867,7 @@ function Feedback({
419798
419867
  ", ",
419799
419868
  env2.terminal,
419800
419869
  ", v",
419801
- "1.68.16"
419870
+ "1.68.17"
419802
419871
  ]
419803
419872
  }, undefined, true, undefined, this)
419804
419873
  ]
@@ -419904,7 +419973,7 @@ ${sanitizedDescription}
419904
419973
  ` + `**Environment Info**
419905
419974
  ` + `- Platform: ${env2.platform}
419906
419975
  ` + `- Terminal: ${env2.terminal}
419907
- ` + `- Version: ${"1.68.16"}
419976
+ ` + `- Version: ${"1.68.17"}
419908
419977
  ` + `- Feedback ID: ${feedbackId}
419909
419978
  ` + `
419910
419979
  **Errors**
@@ -423014,7 +423083,7 @@ function buildPrimarySection() {
423014
423083
  }, undefined, false, undefined, this);
423015
423084
  return [{
423016
423085
  label: "Version",
423017
- value: "1.68.16"
423086
+ value: "1.68.17"
423018
423087
  }, {
423019
423088
  label: "Session name",
423020
423089
  value: nameValue
@@ -426344,7 +426413,7 @@ function Config({
426344
426413
  }
426345
426414
  }, undefined, false, undefined, this)
426346
426415
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime179.jsxDEV(ChannelDowngradeDialog, {
426347
- currentVersion: "1.68.16",
426416
+ currentVersion: "1.68.17",
426348
426417
  onChoice: (choice) => {
426349
426418
  setShowSubmenu(null);
426350
426419
  setTabsHidden(false);
@@ -426356,7 +426425,7 @@ function Config({
426356
426425
  autoUpdatesChannel: "stable"
426357
426426
  };
426358
426427
  if (choice === "stay") {
426359
- newSettings.minimumVersion = "1.68.16";
426428
+ newSettings.minimumVersion = "1.68.17";
426360
426429
  }
426361
426430
  updateSettingsForSource("userSettings", newSettings);
426362
426431
  setSettingsData((prev_27) => ({
@@ -434430,7 +434499,7 @@ function HelpV2(t0) {
434430
434499
  let t6;
434431
434500
  if ($2[31] !== tabs) {
434432
434501
  t6 = /* @__PURE__ */ jsx_dev_runtime206.jsxDEV(Tabs, {
434433
- title: `UR v${"1.68.16"}`,
434502
+ title: `UR v${"1.68.17"}`,
434434
434503
  color: "professionalBlue",
434435
434504
  defaultTab: "general",
434436
434505
  children: tabs
@@ -435363,7 +435432,7 @@ function buildToolUseContext(tools, readFileStateCache, toolPermissionContext, a
435363
435432
  async function handleInitialize(options2) {
435364
435433
  return {
435365
435434
  name: "UR",
435366
- version: "1.68.16",
435435
+ version: "1.68.17",
435367
435436
  protocolVersion: "0.1.0",
435368
435437
  workspaceRoot: options2.cwd,
435369
435438
  capabilities: {
@@ -452471,7 +452540,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
452471
452540
  return [];
452472
452541
  }
452473
452542
  }
452474
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.68.16") {
452543
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.68.17") {
452475
452544
  if (process.env.USER_TYPE === "ant") {
452476
452545
  const changelog = "";
452477
452546
  if (changelog) {
@@ -452498,7 +452567,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.68.16")
452498
452567
  releaseNotes
452499
452568
  };
452500
452569
  }
452501
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.68.16") {
452570
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.68.17") {
452502
452571
  if (process.env.USER_TYPE === "ant") {
452503
452572
  const changelog = "";
452504
452573
  if (changelog) {
@@ -455364,7 +455433,7 @@ function getRecentActivitySync() {
455364
455433
  return cachedActivity;
455365
455434
  }
455366
455435
  function getLogoDisplayData() {
455367
- const version2 = process.env.DEMO_VERSION ?? "1.68.16";
455436
+ const version2 = process.env.DEMO_VERSION ?? "1.68.17";
455368
455437
  const serverUrl = getDirectConnectServerUrl();
455369
455438
  const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd());
455370
455439
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -456231,7 +456300,7 @@ function LogoV2() {
456231
456300
  if ($2[2] === Symbol.for("react.memo_cache_sentinel")) {
456232
456301
  t2 = () => {
456233
456302
  const currentConfig2 = getGlobalConfig();
456234
- if (currentConfig2.lastReleaseNotesSeen === "1.68.16") {
456303
+ if (currentConfig2.lastReleaseNotesSeen === "1.68.17") {
456235
456304
  return;
456236
456305
  }
456237
456306
  saveGlobalConfig(_temp325);
@@ -456916,12 +456985,12 @@ function LogoV2() {
456916
456985
  return t41;
456917
456986
  }
456918
456987
  function _temp325(current) {
456919
- if (current.lastReleaseNotesSeen === "1.68.16") {
456988
+ if (current.lastReleaseNotesSeen === "1.68.17") {
456920
456989
  return current;
456921
456990
  }
456922
456991
  return {
456923
456992
  ...current,
456924
- lastReleaseNotesSeen: "1.68.16"
456993
+ lastReleaseNotesSeen: "1.68.17"
456925
456994
  };
456926
456995
  }
456927
456996
  function _temp241(s_0) {
@@ -473867,7 +473936,7 @@ function compileAgenticCiWorkflow(specName = "default", options2 = {}) {
473867
473936
  if (spec.name !== specName) {
473868
473937
  throw new Error("Agentic CI workflow spec name does not match");
473869
473938
  }
473870
- const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.68.16" : "1.68.16");
473939
+ const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.68.17" : "1.68.17");
473871
473940
  if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(packageVersion)) {
473872
473941
  throw new Error("invalid ur-agent package version");
473873
473942
  }
@@ -474860,7 +474929,7 @@ runner; \`ur trigger\` is the inbound parser that decides what to run.
474860
474929
  path: ".github/workflows/ur.yml",
474861
474930
  root: "project",
474862
474931
  content: compileAgenticCiWorkflow("default", {
474863
- packageVersion: typeof MACRO !== "undefined" ? "1.68.16" : "1.68.16"
474932
+ packageVersion: typeof MACRO !== "undefined" ? "1.68.17" : "1.68.17"
474864
474933
  })
474865
474934
  },
474866
474935
  {
@@ -474930,7 +474999,7 @@ function value(tokens, flag) {
474930
474999
  return index2 >= 0 ? tokens[index2 + 1] : undefined;
474931
475000
  }
474932
475001
  function cliVersion() {
474933
- return typeof MACRO !== "undefined" ? "1.68.16" : "1.68.16";
475002
+ return typeof MACRO !== "undefined" ? "1.68.17" : "1.68.17";
474934
475003
  }
474935
475004
  function workflowPath(cwd2) {
474936
475005
  return join159(cwd2, ".github", "workflows", "ur-agentic-ci.yml");
@@ -480795,7 +480864,7 @@ function createAcpStdioApp(deps) {
480795
480864
  }
480796
480865
  },
480797
480866
  authMethods: [],
480798
- agentInfo: { name: "UR-Nexus", version: "1.68.16" }
480867
+ agentInfo: { name: "UR-Nexus", version: "1.68.17" }
480799
480868
  })).onRequest("authenticate", () => ({})).onRequest("session/new", async (context6) => {
480800
480869
  const result = runtime2.newSession(context6.params.cwd, context6.params.mcpServers, context6.params.additionalDirectories);
480801
480870
  await runtime2.announce({
@@ -480892,7 +480961,7 @@ function createAcpStdioAgent(deps) {
480892
480961
  }
480893
480962
  },
480894
480963
  authMethods: [],
480895
- agentInfo: { name: "UR-Nexus", version: "1.68.16" }
480964
+ agentInfo: { name: "UR-Nexus", version: "1.68.17" }
480896
480965
  });
480897
480966
  return;
480898
480967
  case "authenticate":
@@ -692052,7 +692121,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
692052
692121
  smapsRollup,
692053
692122
  platform: process.platform,
692054
692123
  nodeVersion: process.version,
692055
- ccVersion: "1.68.16"
692124
+ ccVersion: "1.68.17"
692056
692125
  };
692057
692126
  }
692058
692127
  async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
@@ -692632,7 +692701,7 @@ var init_bridge_kick = __esm(() => {
692632
692701
  var call153 = async () => {
692633
692702
  return {
692634
692703
  type: "text",
692635
- value: "1.68.16"
692704
+ value: "1.68.17"
692636
692705
  };
692637
692706
  }, version2, version_default;
692638
692707
  var init_version = __esm(() => {
@@ -703812,7 +703881,7 @@ function generateHtmlReport(data, insights) {
703812
703881
  </html>`;
703813
703882
  }
703814
703883
  function buildExportData(data, insights, facets, remoteStats) {
703815
- const version3 = typeof MACRO !== "undefined" ? "1.68.16" : "unknown";
703884
+ const version3 = typeof MACRO !== "undefined" ? "1.68.17" : "unknown";
703816
703885
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
703817
703886
  const facets_summary = {
703818
703887
  total: facets.size,
@@ -708139,7 +708208,7 @@ var init_sessionStorage = __esm(() => {
708139
708208
  init_settings2();
708140
708209
  init_slowOperations();
708141
708210
  init_uuid();
708142
- VERSION7 = typeof MACRO !== "undefined" ? "1.68.16" : "unknown";
708211
+ VERSION7 = typeof MACRO !== "undefined" ? "1.68.17" : "unknown";
708143
708212
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
708144
708213
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
708145
708214
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -709356,7 +709425,7 @@ var init_filesystem = __esm(() => {
709356
709425
  });
709357
709426
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
709358
709427
  const nonce = randomBytes20(16).toString("hex");
709359
- return join230(getURTempDir(), "bundled-skills", "1.68.16", nonce);
709428
+ return join230(getURTempDir(), "bundled-skills", "1.68.17", nonce);
709360
709429
  });
709361
709430
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
709362
709431
  });
@@ -715662,7 +715731,7 @@ function computeFingerprint(messageText2, version3) {
715662
715731
  }
715663
715732
  function computeFingerprintFromMessages(messages) {
715664
715733
  const firstMessageText = extractFirstMessageText(messages);
715665
- return computeFingerprint(firstMessageText, "1.68.16");
715734
+ return computeFingerprint(firstMessageText, "1.68.17");
715666
715735
  }
715667
715736
  var FINGERPRINT_SALT = "59cf53e54c78";
715668
715737
  var init_fingerprint = () => {};
@@ -717561,7 +717630,7 @@ async function sideQuery(opts) {
717561
717630
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
717562
717631
  }
717563
717632
  const messageText2 = extractFirstUserMessageText(messages);
717564
- const fingerprint2 = computeFingerprint(messageText2, "1.68.16");
717633
+ const fingerprint2 = computeFingerprint(messageText2, "1.68.17");
717565
717634
  const attributionHeader = getAttributionHeader(fingerprint2);
717566
717635
  const systemBlocks = [
717567
717636
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -722348,7 +722417,7 @@ function buildSystemInitMessage(inputs) {
722348
722417
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
722349
722418
  apiKeySource: getURHQApiKeyWithSource().source,
722350
722419
  betas: getSdkBetas(),
722351
- ur_version: "1.68.16",
722420
+ ur_version: "1.68.17",
722352
722421
  output_style: outputStyle2,
722353
722422
  agents: inputs.agents.map((agent2) => agent2.agentType),
722354
722423
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
@@ -736299,7 +736368,7 @@ var init_useVoiceEnabled = __esm(() => {
736299
736368
  function getSemverPart(version3) {
736300
736369
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
736301
736370
  }
736302
- function useUpdateNotification(updatedVersion, initialVersion = "1.68.16") {
736371
+ function useUpdateNotification(updatedVersion, initialVersion = "1.68.17") {
736303
736372
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react222.useState(() => getSemverPart(initialVersion));
736304
736373
  if (!updatedVersion) {
736305
736374
  return null;
@@ -736348,7 +736417,7 @@ function AutoUpdater({
736348
736417
  return;
736349
736418
  }
736350
736419
  if (false) {}
736351
- const currentVersion = "1.68.16";
736420
+ const currentVersion = "1.68.17";
736352
736421
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
736353
736422
  let latestVersion = await getLatestVersion(channel);
736354
736423
  const isDisabled = isAutoUpdaterDisabled();
@@ -736577,12 +736646,12 @@ function NativeAutoUpdater({
736577
736646
  logEvent("tengu_native_auto_updater_start", {});
736578
736647
  try {
736579
736648
  const maxVersion = await getMaxVersion();
736580
- if (maxVersion && gt("1.68.16", maxVersion)) {
736649
+ if (maxVersion && gt("1.68.17", maxVersion)) {
736581
736650
  const msg = await getMaxVersionMessage();
736582
736651
  setMaxVersionIssue(msg ?? "affects your version");
736583
736652
  }
736584
736653
  const result = await installLatest(channel);
736585
- const currentVersion = "1.68.16";
736654
+ const currentVersion = "1.68.17";
736586
736655
  const latencyMs = Date.now() - startTime;
736587
736656
  if (result.lockFailed) {
736588
736657
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -736719,17 +736788,17 @@ function PackageManagerAutoUpdater(t0) {
736719
736788
  const maxVersion = await getMaxVersion();
736720
736789
  if (maxVersion && latest && gt(latest, maxVersion)) {
736721
736790
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
736722
- if (gte("1.68.16", maxVersion)) {
736723
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.68.16"} is already at or above maxVersion ${maxVersion}, skipping update`);
736791
+ if (gte("1.68.17", maxVersion)) {
736792
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.68.17"} is already at or above maxVersion ${maxVersion}, skipping update`);
736724
736793
  setUpdateAvailable(false);
736725
736794
  return;
736726
736795
  }
736727
736796
  latest = maxVersion;
736728
736797
  }
736729
- const hasUpdate = latest && !gte("1.68.16", latest) && !shouldSkipVersion(latest);
736798
+ const hasUpdate = latest && !gte("1.68.17", latest) && !shouldSkipVersion(latest);
736730
736799
  setUpdateAvailable(!!hasUpdate);
736731
736800
  if (hasUpdate) {
736732
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.68.16"} -> ${latest}`);
736801
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.68.17"} -> ${latest}`);
736733
736802
  }
736734
736803
  };
736735
736804
  $2[0] = t1;
@@ -736763,7 +736832,7 @@ function PackageManagerAutoUpdater(t0) {
736763
736832
  wrap: "truncate",
736764
736833
  children: [
736765
736834
  "currentVersion: ",
736766
- "1.68.16"
736835
+ "1.68.17"
736767
736836
  ]
736768
736837
  }, undefined, true, undefined, this);
736769
736838
  $2[3] = verbose;
@@ -747473,7 +747542,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
747473
747542
  project_dir: getOriginalCwd(),
747474
747543
  added_dirs: addedDirs
747475
747544
  },
747476
- version: "1.68.16",
747545
+ version: "1.68.17",
747477
747546
  output_style: {
747478
747547
  name: outputStyleName
747479
747548
  },
@@ -747552,7 +747621,7 @@ function StatusLineInner({
747552
747621
  const taskRunningCount = countActiveBackgroundTasks(taskValues);
747553
747622
  const agentRunningCount = countActiveForegroundAgents(taskValues);
747554
747623
  const defaultStatusLineText = buildDefaultStatusBar({
747555
- version: "1.68.16",
747624
+ version: "1.68.17",
747556
747625
  providerLabel: providerRuntime.providerLabel,
747557
747626
  authMode: providerRuntime.authLabel,
747558
747627
  model: renderModelName(mainLoopModel) || providerRuntime.model || "",
@@ -759733,7 +759802,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
759733
759802
  } catch {}
759734
759803
  const data = {
759735
759804
  trigger: trigger2,
759736
- version: "1.68.16",
759805
+ version: "1.68.17",
759737
759806
  platform: process.platform,
759738
759807
  transcript,
759739
759808
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -772101,7 +772170,7 @@ function WelcomeV2() {
772101
772170
  dimColor: true,
772102
772171
  children: [
772103
772172
  "v",
772104
- "1.68.16"
772173
+ "1.68.17"
772105
772174
  ]
772106
772175
  }, undefined, true, undefined, this)
772107
772176
  ]
@@ -773361,7 +773430,7 @@ function completeOnboarding() {
773361
773430
  saveGlobalConfig((current) => ({
773362
773431
  ...current,
773363
773432
  hasCompletedOnboarding: true,
773364
- lastOnboardingVersion: "1.68.16"
773433
+ lastOnboardingVersion: "1.68.17"
773365
773434
  }));
773366
773435
  }
773367
773436
  function showDialog(root2, renderer) {
@@ -778405,7 +778474,7 @@ function appendToLog(path24, message) {
778405
778474
  cwd: getFsImplementation().cwd(),
778406
778475
  userType: process.env.USER_TYPE,
778407
778476
  sessionId: getSessionId(),
778408
- version: "1.68.16"
778477
+ version: "1.68.17"
778409
778478
  };
778410
778479
  getLogWriter(path24).write(messageWithTimestamp);
778411
778480
  }
@@ -782569,8 +782638,8 @@ async function getEnvLessBridgeConfig() {
782569
782638
  }
782570
782639
  async function checkEnvLessBridgeMinVersion() {
782571
782640
  const cfg = await getEnvLessBridgeConfig();
782572
- if (cfg.min_version && lt("1.68.16", cfg.min_version)) {
782573
- return `Your version of UR (${"1.68.16"}) is too old for Remote Control.
782641
+ if (cfg.min_version && lt("1.68.17", cfg.min_version)) {
782642
+ return `Your version of UR (${"1.68.17"}) is too old for Remote Control.
782574
782643
  Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
782575
782644
  }
782576
782645
  return null;
@@ -783044,7 +783113,7 @@ async function initBridgeCore(params) {
783044
783113
  const rawApi = createBridgeApiClient({
783045
783114
  baseUrl,
783046
783115
  getAccessToken,
783047
- runnerVersion: "1.68.16",
783116
+ runnerVersion: "1.68.17",
783048
783117
  onDebug: logForDebugging,
783049
783118
  onAuth401,
783050
783119
  getTrustedDeviceToken
@@ -792517,7 +792586,7 @@ function getAgUiCapabilities() {
792517
792586
  name: "UR-Nexus",
792518
792587
  type: "ur-nexus",
792519
792588
  description: "Provider-flexible, local-first autonomous engineering workflow agent.",
792520
- version: "1.68.16",
792589
+ version: "1.68.17",
792521
792590
  provider: "UR",
792522
792591
  documentationUrl: "https://github.com/Maitham16/UR/blob/master/docs/AG_UI.md"
792523
792592
  },
@@ -793657,7 +793726,7 @@ function createMCPServer(cwd4, debug2, verbose) {
793657
793726
  };
793658
793727
  const server2 = new Server({
793659
793728
  name: "ur-nexus",
793660
- version: "1.68.16"
793729
+ version: "1.68.17"
793661
793730
  }, {
793662
793731
  capabilities: {
793663
793732
  tools: {}
@@ -794815,7 +794884,7 @@ function thrownResponse(error40) {
794815
794884
  }
794816
794885
  async function createUrMcp2026Runtime(options4) {
794817
794886
  const server2 = createMCPServer(options4.cwd, options4.debug === true, options4.verbose === true);
794818
- const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.68.16" }, { capabilities: {} });
794887
+ const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.68.17" }, { capabilities: {} });
794819
794888
  const [clientTransport, serverTransport] = createLinkedTransportPair();
794820
794889
  try {
794821
794890
  await server2.connect(serverTransport);
@@ -794826,7 +794895,7 @@ async function createUrMcp2026Runtime(options4) {
794826
794895
  }
794827
794896
  const runtime2 = new Mcp2026Runtime({
794828
794897
  cwd: options4.cwd,
794829
- version: "1.68.16",
794898
+ version: "1.68.17",
794830
794899
  backend: {
794831
794900
  listTools: async () => {
794832
794901
  const listed = await client2.listTools();
@@ -796959,7 +797028,7 @@ async function update() {
796959
797028
  logEvent("tengu_update_check", {});
796960
797029
  const diagnostic2 = await getDoctorDiagnostic();
796961
797030
  const result = await checkUpgradeStatus({
796962
- currentVersion: "1.68.16",
797031
+ currentVersion: "1.68.17",
796963
797032
  packageName: UR_AGENT_PACKAGE_NAME,
796964
797033
  installationType: diagnostic2.installationType,
796965
797034
  latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
@@ -798275,7 +798344,7 @@ ${customInstructions}` : customInstructions;
798275
798344
  }
798276
798345
  }
798277
798346
  logForDiagnosticsNoPII("info", "started", {
798278
- version: "1.68.16",
798347
+ version: "1.68.17",
798279
798348
  is_native_binary: isInBundledMode()
798280
798349
  });
798281
798350
  registerCleanup(async () => {
@@ -799061,7 +799130,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
799061
799130
  pendingHookMessages
799062
799131
  }, renderAndRun);
799063
799132
  }
799064
- }).version("1.68.16 (UR-Nexus)", "-v, --version", "Output the version number");
799133
+ }).version("1.68.17 (UR-Nexus)", "-v, --version", "Output the version number");
799065
799134
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
799066
799135
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
799067
799136
  if (canUserConfigureAdvisor()) {
@@ -800120,7 +800189,7 @@ if (false) {}
800120
800189
  async function main2() {
800121
800190
  const args = process.argv.slice(2);
800122
800191
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
800123
- console.log(`${"1.68.16"} (UR-Nexus)`);
800192
+ console.log(`${"1.68.17"} (UR-Nexus)`);
800124
800193
  return;
800125
800194
  }
800126
800195
  if (args[0] === "a2a" && args[1] === "serve" && !args.includes("--help") && !args.includes("-h")) {
@@ -19,7 +19,7 @@ You need:
19
19
 
20
20
  ```sh
21
21
  ur --version
22
- # expected for this release: "1.68.16 (UR-Nexus)"
22
+ # expected for this release: "1.68.17 (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.68.16</p>
48
+ <p class="eyebrow">Version 1.68.17</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.68.16"
10
+ version = "1.68.17"
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.68.16",
5
+ "version": "1.68.17",
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.68.16",
3
+ "version": "1.68.17",
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",
@@ -60,7 +60,9 @@ This is enforced beyond prompt wording:
60
60
 
61
61
  - `src/services/tools/taskListGate.ts` blocks state-changing calls once the initial
62
62
  lightweight allowance is consumed unless an actionable task exists. Delegation and
63
- subagent mutations always require a parent task. Reads remain unrestricted.
63
+ subagent mutations always require a parent task. Reads remain unrestricted. Tool
64
+ implementations can classify task-only observation separately from stricter
65
+ permission auto-approval; both classifications are re-evaluated after rewrites.
64
66
  - `src/services/tools/repeatedFailureGuard.ts` tracks canonicalized failing calls, refuses
65
67
  repeated identical failures, then aborts the stuck turn at a bounded threshold.
66
68
  - the tool execution boundary revalidates the final input after hook rewrites; a hook cannot
@@ -140,6 +140,17 @@ expansion, backgrounding, sandbox overrides, and permission-time rewrites do
140
140
  not qualify. Node remains non-read-only for Bash permission and sandbox
141
141
  purposes, so this compatibility path cannot become a general execution bypass.
142
142
 
143
+ Task tracking no longer equates "not safe to auto-approve" with "changes the
144
+ workspace." Tools may expose a separate `isTaskListReadOnly` classification;
145
+ permissions, sandboxing, concurrency, and read-only planning agents still use
146
+ the stricter `isReadOnly` result. Bash uses the task-only classification for
147
+ known read commands and generic capability inspection: exact help/version
148
+ queries, `command -v`/`which`-style presence checks, and import-only Python
149
+ probes for any syntactically valid module name. This is category-based rather
150
+ than a module allowlist. Arbitrary interpreter statements, output redirects
151
+ outside `/dev/null`, background execution, sandbox overrides, simulated edits,
152
+ unknown commands, and permission-time rewrites to mutations remain gated.
153
+
143
154
  Task completion also protects that lifecycle boundary. When the final
144
155
  actionable `in_progress` task has a successful `Write`/`Edit`/`MultiEdit`/
145
156
  `NotebookEdit` after its recorded start but no later successful inspection,
@@ -1,6 +1,6 @@
1
1
  # UR-Nexus — Technical Specifications
2
2
 
3
- > Audited against the executable source and tests for `ur-agent` v1.68.16.
3
+ > Audited against the executable source and tests for `ur-agent` v1.68.17.
4
4
  > Command, tool, flag, provider, and setting claims are checked against the
5
5
  > implementation rather than copied from product prose. Release validation
6
6
  > keeps this version synchronized and packages the complete `technical/`