ur-agent 1.79.0 → 1.79.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.79.1
4
+
5
+ - Bash execution now survives external cleanup of its session task-output
6
+ directory. UR ensures the directory before every launch, opens stdout and
7
+ stderr as one recoverable pair, and recreates/retries once on `ENOENT`
8
+ instead of leaving every later Bash call broken until restart.
9
+ - Unix temp storage now defaults to the platform directory returned by
10
+ `os.tmpdir()` instead of assuming `/tmp` exists. This keeps task output,
11
+ sandbox temp files, and permission allowlists aligned on macOS systems where
12
+ `/tmp` is a missing or dangling compatibility symlink. A production-shell
13
+ regression test deletes the live task directory between commands and proves
14
+ that the next command completes with intact stdout, stderr, and exit status.
15
+
3
16
  ## 1.79.0
4
17
 
5
18
  - Plugin discovery now searches managed, personal, workspace, implicit,
package/dist/cli.js CHANGED
@@ -107606,7 +107606,7 @@ var init_auth = __esm(() => {
107606
107606
 
107607
107607
  // src/utils/userAgent.ts
107608
107608
  function getURCodeUserAgent() {
107609
- return `ur/${"1.79.0"}`;
107609
+ return `ur/${"1.79.1"}`;
107610
107610
  }
107611
107611
 
107612
107612
  // src/utils/workloadContext.ts
@@ -107628,7 +107628,7 @@ function getUserAgent() {
107628
107628
  const clientApp = process.env.UR_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}` : "";
107629
107629
  const workload = getWorkload();
107630
107630
  const workloadSuffix = workload ? `, workload/${workload}` : "";
107631
- return `ur-cli/${"1.79.0"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
107631
+ return `ur-cli/${"1.79.1"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
107632
107632
  }
107633
107633
  function getMCPUserAgent() {
107634
107634
  const parts = [];
@@ -107642,7 +107642,7 @@ function getMCPUserAgent() {
107642
107642
  parts.push(`client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}`);
107643
107643
  }
107644
107644
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
107645
- return `ur/${"1.79.0"}${suffix}`;
107645
+ return `ur/${"1.79.1"}${suffix}`;
107646
107646
  }
107647
107647
  function getWebFetchUserAgent() {
107648
107648
  return `UR-User (${getURCodeUserAgent()})`;
@@ -107780,7 +107780,7 @@ var init_user = __esm(() => {
107780
107780
  deviceId,
107781
107781
  sessionId: getSessionId(),
107782
107782
  email: getEmail(),
107783
- appVersion: "1.79.0",
107783
+ appVersion: "1.79.1",
107784
107784
  platform: getHostPlatformForAnalytics(),
107785
107785
  organizationUuid,
107786
107786
  accountUuid,
@@ -115667,7 +115667,7 @@ var init_metadata = __esm(() => {
115667
115667
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
115668
115668
  WHITESPACE_REGEX = /\s+/;
115669
115669
  getVersionBase = memoize_default(() => {
115670
- const match = "1.79.0".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
115670
+ const match = "1.79.1".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
115671
115671
  return match ? match[0] : undefined;
115672
115672
  });
115673
115673
  buildEnvContext = memoize_default(async () => {
@@ -115707,7 +115707,7 @@ var init_metadata = __esm(() => {
115707
115707
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
115708
115708
  isURCodeAction: isEnvTruthy(process.env.UR_CODE_ACTION),
115709
115709
  isURAiAuth: isURAISubscriber(),
115710
- version: "1.79.0",
115710
+ version: "1.79.1",
115711
115711
  versionBase: getVersionBase(),
115712
115712
  buildTime: "",
115713
115713
  deploymentEnvironment: env2.detectDeploymentEnvironment(),
@@ -116377,7 +116377,7 @@ function initialize1PEventLogging() {
116377
116377
  const platform2 = getPlatform();
116378
116378
  const attributes = {
116379
116379
  [import_semantic_conventions4.ATTR_SERVICE_NAME]: "ur",
116380
- [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.79.0"
116380
+ [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.79.1"
116381
116381
  };
116382
116382
  if (platform2 === "wsl") {
116383
116383
  const wslVersion = getWslVersion();
@@ -116405,7 +116405,7 @@ function initialize1PEventLogging() {
116405
116405
  })
116406
116406
  ]
116407
116407
  });
116408
- firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.79.0");
116408
+ firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.79.1");
116409
116409
  }
116410
116410
  async function reinitialize1PEventLoggingIfConfigChanged() {
116411
116411
  if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
@@ -126305,7 +126305,7 @@ function formatAgentTrendReport(report = buildAgentTrendReport()) {
126305
126305
  function formatA2AAgentCard(options = {}, pretty = true) {
126306
126306
  return JSON.stringify(buildA2AAgentCard(options), null, pretty ? 2 : 0);
126307
126307
  }
126308
- var urVersion = "1.79.0", researchSnapshotDate = "2026-08-10", coverage, priorityRoadmap;
126308
+ var urVersion = "1.79.1", researchSnapshotDate = "2026-08-10", coverage, priorityRoadmap;
126309
126309
  var init_trends = __esm(() => {
126310
126310
  init_a2aCardSignature();
126311
126311
  coverage = [
@@ -129195,7 +129195,7 @@ function getAttributionHeader(fingerprint) {
129195
129195
  if (!isAttributionHeaderEnabled()) {
129196
129196
  return "";
129197
129197
  }
129198
- const version2 = `${"1.79.0"}.${fingerprint}`;
129198
+ const version2 = `${"1.79.1"}.${fingerprint}`;
129199
129199
  const entrypoint = process.env.UR_CODE_ENTRYPOINT ?? "unknown";
129200
129200
  const cch = "";
129201
129201
  const workload = getWorkload();
@@ -157199,7 +157199,7 @@ var init_projectSafety = __esm(() => {
157199
157199
  function getInstruments() {
157200
157200
  if (instruments)
157201
157201
  return instruments;
157202
- const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.79.0");
157202
+ const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.79.1");
157203
157203
  instruments = {
157204
157204
  operationDuration: meter.createHistogram("gen_ai.client.operation.duration", {
157205
157205
  description: "GenAI operation duration.",
@@ -157297,7 +157297,7 @@ function genAiAgentAttributes() {
157297
157297
  "gen_ai.operation.name": GEN_AI_OPERATION_INVOKE_AGENT,
157298
157298
  "gen_ai.provider.name": "ur",
157299
157299
  "gen_ai.agent.name": "UR-Nexus",
157300
- "gen_ai.agent.version": "1.79.0"
157300
+ "gen_ai.agent.version": "1.79.1"
157301
157301
  };
157302
157302
  }
157303
157303
  function genAiWorkflowAttributes(workflowName) {
@@ -157313,7 +157313,7 @@ function genAiWorkflowAttributes(workflowName) {
157313
157313
  function startGenAiWorkflowSpan(workflowName) {
157314
157314
  const attributes = genAiWorkflowAttributes(workflowName);
157315
157315
  const name = typeof attributes["gen_ai.workflow.name"] === "string" ? `invoke_workflow ${attributes["gen_ai.workflow.name"]}` : GEN_AI_OPERATION_INVOKE_WORKFLOW;
157316
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.79.0").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
157316
+ return import_api10.trace.getTracer("ur-agent.gen_ai", "1.79.1").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
157317
157317
  }
157318
157318
  function endGenAiWorkflowSpan(span, options2 = {}) {
157319
157319
  try {
@@ -157351,7 +157351,7 @@ function startGenAiMemorySpan(operation, options2 = {}) {
157351
157351
  if (options2.recordCount !== undefined && Number.isInteger(options2.recordCount) && options2.recordCount >= 0) {
157352
157352
  attributes["gen_ai.memory.record.count"] = options2.recordCount;
157353
157353
  }
157354
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.79.0").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
157354
+ return import_api10.trace.getTracer("ur-agent.gen_ai", "1.79.1").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
157355
157355
  }
157356
157356
  function endGenAiMemorySpan(span, options2 = {}) {
157357
157357
  try {
@@ -251066,7 +251066,7 @@ function getTelemetryAttributes() {
251066
251066
  attributes["session.id"] = sessionId;
251067
251067
  }
251068
251068
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
251069
- attributes["app.version"] = "1.79.0";
251069
+ attributes["app.version"] = "1.79.1";
251070
251070
  }
251071
251071
  const oauthAccount = getOauthAccountInfo();
251072
251072
  if (oauthAccount) {
@@ -292335,7 +292335,7 @@ function getInstallationEnv() {
292335
292335
  return;
292336
292336
  }
292337
292337
  function getURCodeVersion() {
292338
- return "1.79.0";
292338
+ return "1.79.1";
292339
292339
  }
292340
292340
  async function getInstalledVSCodeExtensionVersion(command) {
292341
292341
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -299666,7 +299666,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
299666
299666
  const client2 = new Client({
299667
299667
  name: "ur",
299668
299668
  title: "UR",
299669
- version: "1.79.0",
299669
+ version: "1.79.1",
299670
299670
  description: "UR-Nexus autonomous engineering workflow engine",
299671
299671
  websiteUrl: PRODUCT_URL
299672
299672
  }, {
@@ -300026,7 +300026,7 @@ var init_client5 = __esm(() => {
300026
300026
  const client2 = new Client({
300027
300027
  name: "ur",
300028
300028
  title: "UR",
300029
- version: "1.79.0",
300029
+ version: "1.79.1",
300030
300030
  description: "UR-Nexus autonomous engineering workflow engine",
300031
300031
  websiteUrl: PRODUCT_URL
300032
300032
  }, {
@@ -312747,7 +312747,7 @@ async function createRuntime() {
312747
312747
  bootstrapTelemetry();
312748
312748
  const resource = defaultResource().merge(detectResources({ detectors: [envDetector] })).merge(resourceFromAttributes({
312749
312749
  [import_semantic_conventions7.ATTR_SERVICE_NAME]: "ur-agent",
312750
- [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.79.0"
312750
+ [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.79.1"
312751
312751
  }));
312752
312752
  const tracerProvider = exporters.traces.length > 0 ? new BasicTracerProvider({
312753
312753
  resource,
@@ -312780,11 +312780,11 @@ async function createRuntime() {
312780
312780
  setMeterProvider(meterProvider);
312781
312781
  setLoggerProvider(loggerProvider);
312782
312782
  if (meterProvider) {
312783
- const meter = meterProvider.getMeter("ur-agent", "1.79.0");
312783
+ const meter = meterProvider.getMeter("ur-agent", "1.79.1");
312784
312784
  setMeter(meter, (name, options2) => meter.createCounter(name, options2));
312785
312785
  }
312786
312786
  if (loggerProvider) {
312787
- setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.79.0"));
312787
+ setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.79.1"));
312788
312788
  }
312789
312789
  if (!cleanupRegistered2) {
312790
312790
  cleanupRegistered2 = true;
@@ -313446,9 +313446,9 @@ async function assertMinVersion() {
313446
313446
  if (false) {}
313447
313447
  try {
313448
313448
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
313449
- if (versionConfig.minVersion && lt("1.79.0", versionConfig.minVersion)) {
313449
+ if (versionConfig.minVersion && lt("1.79.1", versionConfig.minVersion)) {
313450
313450
  console.error(`
313451
- It looks like your version of UR (${"1.79.0"}) needs an update.
313451
+ It looks like your version of UR (${"1.79.1"}) needs an update.
313452
313452
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
313453
313453
 
313454
313454
  To update, please run:
@@ -313664,7 +313664,7 @@ async function installGlobalPackage(specificVersion) {
313664
313664
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
313665
313665
  logEvent("tengu_auto_updater_lock_contention", {
313666
313666
  pid: process.pid,
313667
- currentVersion: "1.79.0"
313667
+ currentVersion: "1.79.1"
313668
313668
  });
313669
313669
  return "in_progress";
313670
313670
  }
@@ -313673,7 +313673,7 @@ async function installGlobalPackage(specificVersion) {
313673
313673
  if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
313674
313674
  logError2(new Error("Windows NPM detected in WSL environment"));
313675
313675
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
313676
- currentVersion: "1.79.0"
313676
+ currentVersion: "1.79.1"
313677
313677
  });
313678
313678
  console.error(`
313679
313679
  Error: Windows NPM detected in WSL
@@ -314208,7 +314208,7 @@ function detectLinuxGlobPatternWarnings() {
314208
314208
  }
314209
314209
  async function getDoctorDiagnostic() {
314210
314210
  const installationType = await getCurrentInstallationType();
314211
- const version2 = typeof MACRO !== "undefined" ? "1.79.0" : "unknown";
314211
+ const version2 = typeof MACRO !== "undefined" ? "1.79.1" : "unknown";
314212
314212
  const installationPath = await getInstallationPath();
314213
314213
  const invokedBinary = getInvokedBinary();
314214
314214
  const multipleInstallations = await detectMultipleInstallations();
@@ -315143,8 +315143,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
315143
315143
  const maxVersion = await getMaxVersion();
315144
315144
  if (maxVersion && gt(version2, maxVersion)) {
315145
315145
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
315146
- if (gte("1.79.0", maxVersion)) {
315147
- logForDebugging(`Native installer: current version ${"1.79.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
315146
+ if (gte("1.79.1", maxVersion)) {
315147
+ logForDebugging(`Native installer: current version ${"1.79.1"} is already at or above maxVersion ${maxVersion}, skipping update`);
315148
315148
  logEvent("tengu_native_update_skipped_max_version", {
315149
315149
  latency_ms: Date.now() - startTime,
315150
315150
  max_version: maxVersion,
@@ -315155,7 +315155,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
315155
315155
  version2 = maxVersion;
315156
315156
  }
315157
315157
  }
315158
- if (!forceReinstall && version2 === "1.79.0" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
315158
+ if (!forceReinstall && version2 === "1.79.1" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
315159
315159
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
315160
315160
  logEvent("tengu_native_update_complete", {
315161
315161
  latency_ms: Date.now() - startTime,
@@ -349364,7 +349364,6 @@ import { execFileSync as execFileSync2, spawn as spawn9 } from "child_process";
349364
349364
  import { constants as fsConstants5, readFileSync as readFileSync25, unlinkSync as unlinkSync7 } from "fs";
349365
349365
  import { mkdir as mkdir20, open as open11, realpath as realpath10 } from "fs/promises";
349366
349366
  import { isAbsolute as isAbsolute21, resolve as resolve32 } from "path";
349367
- import { join as posixJoin3 } from "path/posix";
349368
349367
  import { accessSync } from "fs";
349369
349368
  function isExecutable(shellPath) {
349370
349369
  try {
@@ -349428,13 +349427,31 @@ async function getShellConfigImpl() {
349428
349427
  return { provider };
349429
349428
  }
349430
349429
  function ensureTaskOutputDir() {
349431
- taskOutputDirReady ??= mkdir20(getTaskOutputDir(), { recursive: true }).then(() => {
349430
+ return mkdir20(getTaskOutputDir(), { recursive: true, mode: 448 }).then(() => {
349432
349431
  return;
349433
- }, (error40) => {
349434
- taskOutputDirReady = undefined;
349435
- throw error40;
349436
349432
  });
349437
- return taskOutputDirReady;
349433
+ }
349434
+ async function openTaskOutputHandles(taskOutput) {
349435
+ for (let attempt = 0;attempt < 2; attempt += 1) {
349436
+ await ensureTaskOutputDir();
349437
+ let outputHandle;
349438
+ try {
349439
+ outputHandle = await open11(taskOutput.path, process.platform === "win32" ? "w" : fsConstants5.O_WRONLY | fsConstants5.O_CREAT | fsConstants5.O_APPEND | (fsConstants5.O_NOFOLLOW ?? 0));
349440
+ const stderrHandle = await open11(taskOutput.stderrPath, process.platform === "win32" ? "w" : fsConstants5.O_WRONLY | fsConstants5.O_CREAT | fsConstants5.O_APPEND | (fsConstants5.O_NOFOLLOW ?? 0));
349441
+ return { outputHandle, stderrHandle };
349442
+ } catch (error40) {
349443
+ if (outputHandle !== undefined) {
349444
+ try {
349445
+ await outputHandle.close();
349446
+ } catch {}
349447
+ }
349448
+ if (!isENOENT(error40) || attempt === 1) {
349449
+ throw error40;
349450
+ }
349451
+ logForDebugging(`Task output directory disappeared during shell launch; recreating ${getTaskOutputDir()}`);
349452
+ }
349453
+ }
349454
+ throw new Error("Failed to open task output files");
349438
349455
  }
349439
349456
  async function exec3(command, abortSignal, shellType, options2) {
349440
349457
  const {
@@ -349448,7 +349465,7 @@ async function exec3(command, abortSignal, shellType, options2) {
349448
349465
  const commandTimeout = timeout ?? DEFAULT_TIMEOUT;
349449
349466
  const provider = await resolveProvider[shellType]();
349450
349467
  const id = Math.floor(Math.random() * 65536).toString(16).padStart(4, "0");
349451
- const sandboxTmpDir = posixJoin3(process.env.UR_CODE_TMPDIR || "/tmp", getURTempDirName());
349468
+ const sandboxTmpDir = getURTempDir();
349452
349469
  const { commandString: builtCommand, cwdFilePath } = await provider.buildExecCommand(command, {
349453
349470
  id,
349454
349471
  sandboxTmpDir: shouldUseSandbox ? sandboxTmpDir : undefined,
@@ -349492,13 +349509,12 @@ async function exec3(command, abortSignal, shellType, options2) {
349492
349509
  const usePipeMode = !!onStdout;
349493
349510
  const taskId = generateTaskId("local_bash");
349494
349511
  const taskOutput = new TaskOutput(taskId, onProgress ?? null, !usePipeMode);
349495
- await ensureTaskOutputDir();
349496
349512
  let outputHandle;
349497
349513
  let stderrHandle;
349498
349514
  if (!usePipeMode) {
349499
- const O_NOFOLLOW = fsConstants5.O_NOFOLLOW ?? 0;
349500
- outputHandle = await open11(taskOutput.path, process.platform === "win32" ? "w" : fsConstants5.O_WRONLY | fsConstants5.O_CREAT | fsConstants5.O_APPEND | O_NOFOLLOW);
349501
- stderrHandle = await open11(taskOutput.stderrPath, process.platform === "win32" ? "w" : fsConstants5.O_WRONLY | fsConstants5.O_CREAT | fsConstants5.O_APPEND | O_NOFOLLOW);
349515
+ const handles = await openTaskOutputHandles(taskOutput);
349516
+ outputHandle = handles.outputHandle;
349517
+ stderrHandle = handles.stderrHandle;
349502
349518
  }
349503
349519
  try {
349504
349520
  const childProcess = spawn9(spawnBinary, shellArgs, {
@@ -349598,7 +349614,7 @@ function setCwd(path13, relativeTo) {
349598
349614
  } catch (_error) {}
349599
349615
  }
349600
349616
  }
349601
- var DEFAULT_TIMEOUT, getShellConfig, getPsProvider, resolveProvider, taskOutputDirReady;
349617
+ var DEFAULT_TIMEOUT, getShellConfig, getPsProvider, resolveProvider;
349602
349618
  var init_Shell = __esm(() => {
349603
349619
  init_memoize();
349604
349620
  init_analytics();
@@ -384994,7 +385010,7 @@ function isAnyTracingEnabled() {
384994
385010
  return isTelemetryEnabled() || isEnhancedTelemetryEnabled() || isBetaTracingEnabled();
384995
385011
  }
384996
385012
  function getTracer() {
384997
- return import_api39.trace.getTracer("ur-agent.gen_ai", "1.79.0");
385013
+ return import_api39.trace.getTracer("ur-agent.gen_ai", "1.79.1");
384998
385014
  }
384999
385015
  function createSpanAttributes(spanType, customAttributes = {}) {
385000
385016
  const baseAttributes = getTelemetryAttributes();
@@ -415284,7 +415300,7 @@ function Feedback({
415284
415300
  platform: env2.platform,
415285
415301
  gitRepo: envInfo.isGit,
415286
415302
  terminal: env2.terminal,
415287
- version: "1.79.0",
415303
+ version: "1.79.1",
415288
415304
  transcript: normalizeMessagesForAPI(messages),
415289
415305
  errors: sanitizedErrors,
415290
415306
  lastApiRequest: getLastAPIRequest(),
@@ -415476,7 +415492,7 @@ function Feedback({
415476
415492
  ", ",
415477
415493
  env2.terminal,
415478
415494
  ", v",
415479
- "1.79.0"
415495
+ "1.79.1"
415480
415496
  ]
415481
415497
  }, undefined, true, undefined, this)
415482
415498
  ]
@@ -415582,7 +415598,7 @@ ${sanitizedDescription}
415582
415598
  ` + `**Environment Info**
415583
415599
  ` + `- Platform: ${env2.platform}
415584
415600
  ` + `- Terminal: ${env2.terminal}
415585
- ` + `- Version: ${"1.79.0"}
415601
+ ` + `- Version: ${"1.79.1"}
415586
415602
  ` + `- Feedback ID: ${feedbackId}
415587
415603
  ` + `
415588
415604
  **Errors**
@@ -418692,7 +418708,7 @@ function buildPrimarySection() {
418692
418708
  }, undefined, false, undefined, this);
418693
418709
  return [{
418694
418710
  label: "Version",
418695
- value: "1.79.0"
418711
+ value: "1.79.1"
418696
418712
  }, {
418697
418713
  label: "Session name",
418698
418714
  value: nameValue
@@ -422074,7 +422090,7 @@ function Config({
422074
422090
  }
422075
422091
  }, undefined, false, undefined, this)
422076
422092
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime179.jsxDEV(ChannelDowngradeDialog, {
422077
- currentVersion: "1.79.0",
422093
+ currentVersion: "1.79.1",
422078
422094
  onChoice: (choice) => {
422079
422095
  setShowSubmenu(null);
422080
422096
  setTabsHidden(false);
@@ -422086,7 +422102,7 @@ function Config({
422086
422102
  autoUpdatesChannel: "stable"
422087
422103
  };
422088
422104
  if (choice === "stay") {
422089
- newSettings.minimumVersion = "1.79.0";
422105
+ newSettings.minimumVersion = "1.79.1";
422090
422106
  }
422091
422107
  updateSettingsForSource("userSettings", newSettings);
422092
422108
  setSettingsData((prev_27) => ({
@@ -430150,7 +430166,7 @@ function HelpV2(t0) {
430150
430166
  let t6;
430151
430167
  if ($2[31] !== tabs) {
430152
430168
  t6 = /* @__PURE__ */ jsx_dev_runtime206.jsxDEV(Tabs, {
430153
- title: `UR v${"1.79.0"}`,
430169
+ title: `UR v${"1.79.1"}`,
430154
430170
  color: "professionalBlue",
430155
430171
  defaultTab: "general",
430156
430172
  children: tabs
@@ -431083,7 +431099,7 @@ function buildToolUseContext(tools, readFileStateCache, toolPermissionContext, a
431083
431099
  async function handleInitialize(options2) {
431084
431100
  return {
431085
431101
  name: "UR",
431086
- version: "1.79.0",
431102
+ version: "1.79.1",
431087
431103
  protocolVersion: "0.1.0",
431088
431104
  workspaceRoot: options2.cwd,
431089
431105
  capabilities: {
@@ -448191,7 +448207,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
448191
448207
  return [];
448192
448208
  }
448193
448209
  }
448194
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.79.0") {
448210
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.79.1") {
448195
448211
  if (process.env.USER_TYPE === "ant") {
448196
448212
  const changelog = "";
448197
448213
  if (changelog) {
@@ -448218,7 +448234,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.79.0")
448218
448234
  releaseNotes
448219
448235
  };
448220
448236
  }
448221
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.79.0") {
448237
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.79.1") {
448222
448238
  if (process.env.USER_TYPE === "ant") {
448223
448239
  const changelog = "";
448224
448240
  if (changelog) {
@@ -451123,7 +451139,7 @@ function getRecentActivitySync() {
451123
451139
  return cachedActivity;
451124
451140
  }
451125
451141
  function getLogoDisplayData() {
451126
- const version2 = process.env.DEMO_VERSION ?? "1.79.0";
451142
+ const version2 = process.env.DEMO_VERSION ?? "1.79.1";
451127
451143
  const serverUrl = getDirectConnectServerUrl();
451128
451144
  const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd());
451129
451145
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -451990,7 +452006,7 @@ function LogoV2() {
451990
452006
  if ($2[2] === Symbol.for("react.memo_cache_sentinel")) {
451991
452007
  t2 = () => {
451992
452008
  const currentConfig2 = getGlobalConfig();
451993
- if (currentConfig2.lastReleaseNotesSeen === "1.79.0") {
452009
+ if (currentConfig2.lastReleaseNotesSeen === "1.79.1") {
451994
452010
  return;
451995
452011
  }
451996
452012
  saveGlobalConfig(_temp325);
@@ -452675,12 +452691,12 @@ function LogoV2() {
452675
452691
  return t41;
452676
452692
  }
452677
452693
  function _temp325(current) {
452678
- if (current.lastReleaseNotesSeen === "1.79.0") {
452694
+ if (current.lastReleaseNotesSeen === "1.79.1") {
452679
452695
  return current;
452680
452696
  }
452681
452697
  return {
452682
452698
  ...current,
452683
- lastReleaseNotesSeen: "1.79.0"
452699
+ lastReleaseNotesSeen: "1.79.1"
452684
452700
  };
452685
452701
  }
452686
452702
  function _temp241(s_0) {
@@ -469517,7 +469533,7 @@ function compileAgenticCiWorkflow(specName = "default", options2 = {}) {
469517
469533
  if (spec.name !== specName) {
469518
469534
  throw new Error("Agentic CI workflow spec name does not match");
469519
469535
  }
469520
- const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.79.0" : "1.79.0");
469536
+ const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.79.1" : "1.79.1");
469521
469537
  if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(packageVersion)) {
469522
469538
  throw new Error("invalid ur-agent package version");
469523
469539
  }
@@ -470510,7 +470526,7 @@ runner; \`ur trigger\` is the inbound parser that decides what to run.
470510
470526
  path: ".github/workflows/ur.yml",
470511
470527
  root: "project",
470512
470528
  content: compileAgenticCiWorkflow("default", {
470513
- packageVersion: typeof MACRO !== "undefined" ? "1.79.0" : "1.79.0"
470529
+ packageVersion: typeof MACRO !== "undefined" ? "1.79.1" : "1.79.1"
470514
470530
  })
470515
470531
  },
470516
470532
  {
@@ -470573,7 +470589,7 @@ function value(tokens, flag) {
470573
470589
  return index2 >= 0 ? tokens[index2 + 1] : undefined;
470574
470590
  }
470575
470591
  function cliVersion() {
470576
- return typeof MACRO !== "undefined" ? "1.79.0" : "1.79.0";
470592
+ return typeof MACRO !== "undefined" ? "1.79.1" : "1.79.1";
470577
470593
  }
470578
470594
  function workflowPath(cwd2) {
470579
470595
  return join159(cwd2, ".github", "workflows", "ur-agentic-ci.yml");
@@ -476429,7 +476445,7 @@ function createAcpStdioApp(deps) {
476429
476445
  }
476430
476446
  },
476431
476447
  authMethods: [],
476432
- agentInfo: { name: "UR-Nexus", version: "1.79.0" }
476448
+ agentInfo: { name: "UR-Nexus", version: "1.79.1" }
476433
476449
  })).onRequest("authenticate", () => ({})).onRequest("session/new", async (context6) => {
476434
476450
  const result = runtime2.newSession(context6.params.cwd, context6.params.mcpServers, context6.params.additionalDirectories);
476435
476451
  await runtime2.announce({
@@ -476526,7 +476542,7 @@ function createAcpStdioAgent(deps) {
476526
476542
  }
476527
476543
  },
476528
476544
  authMethods: [],
476529
- agentInfo: { name: "UR-Nexus", version: "1.79.0" }
476545
+ agentInfo: { name: "UR-Nexus", version: "1.79.1" }
476530
476546
  });
476531
476547
  return;
476532
476548
  case "authenticate":
@@ -687752,7 +687768,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
687752
687768
  smapsRollup,
687753
687769
  platform: process.platform,
687754
687770
  nodeVersion: process.version,
687755
- ccVersion: "1.79.0"
687771
+ ccVersion: "1.79.1"
687756
687772
  };
687757
687773
  }
687758
687774
  async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
@@ -688332,7 +688348,7 @@ var init_bridge_kick = __esm(() => {
688332
688348
  var call155 = async () => {
688333
688349
  return {
688334
688350
  type: "text",
688335
- value: "1.79.0"
688351
+ value: "1.79.1"
688336
688352
  };
688337
688353
  }, version2, version_default;
688338
688354
  var init_version = __esm(() => {
@@ -699599,7 +699615,7 @@ function generateHtmlReport(data, insights) {
699599
699615
  </html>`;
699600
699616
  }
699601
699617
  function buildExportData(data, insights, facets, remoteStats) {
699602
- const version3 = typeof MACRO !== "undefined" ? "1.79.0" : "unknown";
699618
+ const version3 = typeof MACRO !== "undefined" ? "1.79.1" : "unknown";
699603
699619
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
699604
699620
  const facets_summary = {
699605
699621
  total: facets.size,
@@ -703915,7 +703931,7 @@ var init_sessionStorage = __esm(() => {
703915
703931
  init_settings2();
703916
703932
  init_slowOperations();
703917
703933
  init_uuid();
703918
- VERSION7 = typeof MACRO !== "undefined" ? "1.79.0" : "unknown";
703934
+ VERSION7 = typeof MACRO !== "undefined" ? "1.79.1" : "unknown";
703919
703935
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
703920
703936
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
703921
703937
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -705120,7 +705136,7 @@ var init_filesystem = __esm(() => {
705120
705136
  ];
705121
705137
  DIR_SEP = posix10.sep;
705122
705138
  getURTempDir = memoize_default(function getURTempDir2() {
705123
- const baseTmpDir = process.env.UR_CODE_TMPDIR || (getPlatform() === "windows" ? tmpdir19() : "/tmp");
705139
+ const baseTmpDir = process.env.UR_CODE_TMPDIR || tmpdir19();
705124
705140
  const fs12 = getFsImplementation();
705125
705141
  let resolvedBaseTmpDir = baseTmpDir;
705126
705142
  try {
@@ -705130,7 +705146,7 @@ var init_filesystem = __esm(() => {
705130
705146
  });
705131
705147
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
705132
705148
  const nonce = randomBytes20(16).toString("hex");
705133
- return join234(getURTempDir(), "bundled-skills", "1.79.0", nonce);
705149
+ return join234(getURTempDir(), "bundled-skills", "1.79.1", nonce);
705134
705150
  });
705135
705151
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
705136
705152
  });
@@ -711505,7 +711521,7 @@ function computeFingerprint(messageText2, version3) {
711505
711521
  }
711506
711522
  function computeFingerprintFromMessages(messages) {
711507
711523
  const firstMessageText = extractFirstMessageText(messages);
711508
- return computeFingerprint(firstMessageText, "1.79.0");
711524
+ return computeFingerprint(firstMessageText, "1.79.1");
711509
711525
  }
711510
711526
  var FINGERPRINT_SALT = "59cf53e54c78";
711511
711527
  var init_fingerprint = () => {};
@@ -713427,7 +713443,7 @@ async function sideQuery(opts) {
713427
713443
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
713428
713444
  }
713429
713445
  const messageText2 = extractFirstUserMessageText(messages);
713430
- const fingerprint2 = computeFingerprint(messageText2, "1.79.0");
713446
+ const fingerprint2 = computeFingerprint(messageText2, "1.79.1");
713431
713447
  const attributionHeader = getAttributionHeader(fingerprint2);
713432
713448
  const systemBlocks = [
713433
713449
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -718264,7 +718280,7 @@ function buildSystemInitMessage(inputs) {
718264
718280
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
718265
718281
  apiKeySource: getURHQApiKeyWithSource().source,
718266
718282
  betas: getSdkBetas(),
718267
- ur_version: "1.79.0",
718283
+ ur_version: "1.79.1",
718268
718284
  output_style: outputStyle2,
718269
718285
  agents: inputs.agents.map((agent2) => agent2.agentType),
718270
718286
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
@@ -732136,7 +732152,7 @@ var init_useVoiceEnabled = __esm(() => {
732136
732152
  function getSemverPart(version3) {
732137
732153
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
732138
732154
  }
732139
- function useUpdateNotification(updatedVersion, initialVersion = "1.79.0") {
732155
+ function useUpdateNotification(updatedVersion, initialVersion = "1.79.1") {
732140
732156
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react224.useState(() => getSemverPart(initialVersion));
732141
732157
  if (!updatedVersion) {
732142
732158
  return null;
@@ -732185,7 +732201,7 @@ function AutoUpdater({
732185
732201
  return;
732186
732202
  }
732187
732203
  if (false) {}
732188
- const currentVersion = "1.79.0";
732204
+ const currentVersion = "1.79.1";
732189
732205
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
732190
732206
  let latestVersion = await getLatestVersion(channel);
732191
732207
  const isDisabled = isAutoUpdaterDisabled();
@@ -732414,12 +732430,12 @@ function NativeAutoUpdater({
732414
732430
  logEvent("tengu_native_auto_updater_start", {});
732415
732431
  try {
732416
732432
  const maxVersion = await getMaxVersion();
732417
- if (maxVersion && gt("1.79.0", maxVersion)) {
732433
+ if (maxVersion && gt("1.79.1", maxVersion)) {
732418
732434
  const msg = await getMaxVersionMessage();
732419
732435
  setMaxVersionIssue(msg ?? "affects your version");
732420
732436
  }
732421
732437
  const result = await installLatest(channel);
732422
- const currentVersion = "1.79.0";
732438
+ const currentVersion = "1.79.1";
732423
732439
  const latencyMs = Date.now() - startTime;
732424
732440
  if (result.lockFailed) {
732425
732441
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -732556,17 +732572,17 @@ function PackageManagerAutoUpdater(t0) {
732556
732572
  const maxVersion = await getMaxVersion();
732557
732573
  if (maxVersion && latest && gt(latest, maxVersion)) {
732558
732574
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
732559
- if (gte("1.79.0", maxVersion)) {
732560
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.79.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
732575
+ if (gte("1.79.1", maxVersion)) {
732576
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.79.1"} is already at or above maxVersion ${maxVersion}, skipping update`);
732561
732577
  setUpdateAvailable(false);
732562
732578
  return;
732563
732579
  }
732564
732580
  latest = maxVersion;
732565
732581
  }
732566
- const hasUpdate = latest && !gte("1.79.0", latest) && !shouldSkipVersion(latest);
732582
+ const hasUpdate = latest && !gte("1.79.1", latest) && !shouldSkipVersion(latest);
732567
732583
  setUpdateAvailable(!!hasUpdate);
732568
732584
  if (hasUpdate) {
732569
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.79.0"} -> ${latest}`);
732585
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.79.1"} -> ${latest}`);
732570
732586
  }
732571
732587
  };
732572
732588
  $2[0] = t1;
@@ -732600,7 +732616,7 @@ function PackageManagerAutoUpdater(t0) {
732600
732616
  wrap: "truncate",
732601
732617
  children: [
732602
732618
  "currentVersion: ",
732603
- "1.79.0"
732619
+ "1.79.1"
732604
732620
  ]
732605
732621
  }, undefined, true, undefined, this);
732606
732622
  $2[3] = verbose;
@@ -743400,7 +743416,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
743400
743416
  project_dir: getOriginalCwd(),
743401
743417
  added_dirs: addedDirs
743402
743418
  },
743403
- version: "1.79.0",
743419
+ version: "1.79.1",
743404
743420
  output_style: {
743405
743421
  name: outputStyleName
743406
743422
  },
@@ -743535,7 +743551,7 @@ function StatusLineInner({
743535
743551
  const attention = customStatusError ?? taskAttention;
743536
743552
  const terminalSize = React133.useContext(TerminalSizeContext);
743537
743553
  const defaultStatusLineText = buildDefaultStatusBar({
743538
- version: "1.79.0",
743554
+ version: "1.79.1",
743539
743555
  providerLabel: providerRuntime.providerLabel,
743540
743556
  authMode: providerRuntime.authLabel,
743541
743557
  model: renderModelName(mainLoopModel) || providerRuntime.model || "",
@@ -755832,7 +755848,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
755832
755848
  } catch {}
755833
755849
  const data = {
755834
755850
  trigger: trigger2,
755835
- version: "1.79.0",
755851
+ version: "1.79.1",
755836
755852
  platform: process.platform,
755837
755853
  transcript,
755838
755854
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -768212,7 +768228,7 @@ function WelcomeV2() {
768212
768228
  dimColor: true,
768213
768229
  children: [
768214
768230
  "v",
768215
- "1.79.0"
768231
+ "1.79.1"
768216
768232
  ]
768217
768233
  }, undefined, true, undefined, this)
768218
768234
  ]
@@ -769472,7 +769488,7 @@ function completeOnboarding() {
769472
769488
  saveGlobalConfig((current) => ({
769473
769489
  ...current,
769474
769490
  hasCompletedOnboarding: true,
769475
- lastOnboardingVersion: "1.79.0"
769491
+ lastOnboardingVersion: "1.79.1"
769476
769492
  }));
769477
769493
  }
769478
769494
  function showDialog(root2, renderer) {
@@ -774619,7 +774635,7 @@ function appendToLog(path24, message) {
774619
774635
  cwd: getFsImplementation().cwd(),
774620
774636
  userType: process.env.USER_TYPE,
774621
774637
  sessionId: getSessionId(),
774622
- version: "1.79.0"
774638
+ version: "1.79.1"
774623
774639
  };
774624
774640
  getLogWriter(path24).write(messageWithTimestamp);
774625
774641
  }
@@ -778778,8 +778794,8 @@ async function getEnvLessBridgeConfig() {
778778
778794
  }
778779
778795
  async function checkEnvLessBridgeMinVersion() {
778780
778796
  const cfg = await getEnvLessBridgeConfig();
778781
- if (cfg.min_version && lt("1.79.0", cfg.min_version)) {
778782
- return `Your version of UR (${"1.79.0"}) is too old for Remote Control.
778797
+ if (cfg.min_version && lt("1.79.1", cfg.min_version)) {
778798
+ return `Your version of UR (${"1.79.1"}) is too old for Remote Control.
778783
778799
  Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
778784
778800
  }
778785
778801
  return null;
@@ -779253,7 +779269,7 @@ async function initBridgeCore(params) {
779253
779269
  const rawApi = createBridgeApiClient({
779254
779270
  baseUrl,
779255
779271
  getAccessToken,
779256
- runnerVersion: "1.79.0",
779272
+ runnerVersion: "1.79.1",
779257
779273
  onDebug: logForDebugging,
779258
779274
  onAuth401,
779259
779275
  getTrustedDeviceToken
@@ -788726,7 +788742,7 @@ function getAgUiCapabilities() {
788726
788742
  name: "UR-Nexus",
788727
788743
  type: "ur-nexus",
788728
788744
  description: "Provider-flexible, local-first autonomous engineering workflow agent.",
788729
- version: "1.79.0",
788745
+ version: "1.79.1",
788730
788746
  provider: "UR",
788731
788747
  documentationUrl: "https://github.com/Maitham16/UR/blob/master/docs/AG_UI.md"
788732
788748
  },
@@ -789857,7 +789873,7 @@ function createMCPServer(cwd4, debug2, verbose) {
789857
789873
  };
789858
789874
  const server2 = new Server({
789859
789875
  name: "ur-nexus",
789860
- version: "1.79.0"
789876
+ version: "1.79.1"
789861
789877
  }, {
789862
789878
  capabilities: {
789863
789879
  tools: {}
@@ -791015,7 +791031,7 @@ function thrownResponse(error40) {
791015
791031
  }
791016
791032
  async function createUrMcp2026Runtime(options5) {
791017
791033
  const server2 = createMCPServer(options5.cwd, options5.debug === true, options5.verbose === true);
791018
- const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.79.0" }, { capabilities: {} });
791034
+ const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.79.1" }, { capabilities: {} });
791019
791035
  const [clientTransport, serverTransport] = createLinkedTransportPair();
791020
791036
  try {
791021
791037
  await server2.connect(serverTransport);
@@ -791026,7 +791042,7 @@ async function createUrMcp2026Runtime(options5) {
791026
791042
  }
791027
791043
  const runtime2 = new Mcp2026Runtime({
791028
791044
  cwd: options5.cwd,
791029
- version: "1.79.0",
791045
+ version: "1.79.1",
791030
791046
  backend: {
791031
791047
  listTools: async () => {
791032
791048
  const listed = await client2.listTools();
@@ -793624,7 +793640,7 @@ async function update() {
793624
793640
  logEvent("tengu_update_check", {});
793625
793641
  const diagnostic2 = await getDoctorDiagnostic();
793626
793642
  const result = await checkUpgradeStatus({
793627
- currentVersion: "1.79.0",
793643
+ currentVersion: "1.79.1",
793628
793644
  packageName: UR_AGENT_PACKAGE_NAME,
793629
793645
  installationType: diagnostic2.installationType,
793630
793646
  latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
@@ -794940,7 +794956,7 @@ ${customInstructions}` : customInstructions;
794940
794956
  }
794941
794957
  }
794942
794958
  logForDiagnosticsNoPII("info", "started", {
794943
- version: "1.79.0",
794959
+ version: "1.79.1",
794944
794960
  is_native_binary: isInBundledMode()
794945
794961
  });
794946
794962
  registerCleanup(async () => {
@@ -795726,7 +795742,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
795726
795742
  pendingHookMessages
795727
795743
  }, renderAndRun);
795728
795744
  }
795729
- }).version("1.79.0 (UR-Nexus)", "-v, --version", "Output the version number");
795745
+ }).version("1.79.1 (UR-Nexus)", "-v, --version", "Output the version number");
795730
795746
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
795731
795747
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
795732
795748
  if (canUserConfigureAdvisor()) {
@@ -796798,7 +796814,7 @@ if (false) {}
796798
796814
  async function main2() {
796799
796815
  const args = process.argv.slice(2);
796800
796816
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
796801
- console.log(`${"1.79.0"} (UR-Nexus)`);
796817
+ console.log(`${"1.79.1"} (UR-Nexus)`);
796802
796818
  return;
796803
796819
  }
796804
796820
  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.79.1 Addition
13
+
14
+ | Addition | Surface | What it adds |
15
+ | --- | --- | --- |
16
+ | Self-healing Bash task output | `src/utils/Shell.ts`, `src/utils/permissions/filesystem.ts`, `test/shellExecutionIntegration.test.ts` | Uses the platform temp directory instead of assuming `/tmp`, aligns sandbox and permission roots, re-ensures temporary output storage for every launch, and atomically retries stdout/stderr creation after external directory cleanup so Bash recovers without restarting UR. |
17
+
12
18
  ## v1.79.0 Additions
13
19
 
14
20
  | Addition | Surface | What it adds |
@@ -0,0 +1,180 @@
1
+ # UR Gap Analysis — 2026-08-11 Research Snapshot
2
+
3
+ Baseline: UR `ur-agent@1.79.1`, HEAD `6faed11`, 186 slash commands, 60 tools.
4
+ Upstream references: Claude Code 2.1.226 (2026-08-08), Codex CLI (Aug 2026),
5
+ Gemini CLI v0.53.0 (2026-07-28), MCP spec `2026-07-28`, A2A v1.0 (Apr 2026).
6
+
7
+ Every "missing" row below was verified absent by grep over `src/`, and every
8
+ "present" row by a concrete file reference. Re-check primary sources before
9
+ acting: prerelease standards move weekly.
10
+
11
+ ---
12
+
13
+ ## 1. Already at parity — no action
14
+
15
+ UR is closer to the frontier than the trend doc implies. Confirmed present:
16
+
17
+ | Upstream feature | UR implementation |
18
+ |---|---|
19
+ | MCP `2026-07-28` stateless core | `src/services/mcp/mcp2026.ts` (`MCP_2026_PROTOCOL_VERSION = '2026-07-28'`) |
20
+ | MCP Tasks extension (`tasks/get`, `tasks/update`, `tasks/cancel`) | `src/entrypoints/mcp2026.ts`, `src/services/mcp/mcp2026.ts` |
21
+ | MCP Apps (sandboxed HTML UI) | `ui/initialize`, `ui/resourceUri` in `mcp2026.ts` |
22
+ | MCP Extensions namespacing | `io.modelcontextprotocol/protocolVersion` header + `_meta` cross-check |
23
+ | A2A v1.0 signed Agent Cards | `src/services/agents/a2aCardSignature.ts` (Ed25519 detached JWS), `a2aV1.ts` |
24
+ | ACP / AG-UI servers | `src/services/agents/acpServer.ts`, `agUi.ts` |
25
+ | Cross-session agent messaging | `SendMessageTool`, `ListPeersTool` |
26
+ | Nested subagents with depth/concurrency caps | `src/tools/AgentTool/fanOutLimits.ts`, `fanOutSettings.ts` |
27
+ | Self-hosted runner | `src/self-hosted-runner/main.js`, gated by `feature('SELF_HOSTED_RUNNER')` |
28
+ | `--teleport`-style local continuation | `src/main.tsx`, `src/assistant/sessionHistory.ts` |
29
+ | `AGENTS.md` interop | `src/utils/agentmd.ts`, `memoryFileDetection.ts` |
30
+ | OpenTelemetry instrumentation | `src/utils/telemetry/instrumentation.ts` |
31
+ | Headless spend cap | `--max-budget-usd` in `src/main.tsx` |
32
+ | Plugin marketplace + search/show | `ur plugin search|show` (1.79.0) |
33
+ | Codex `/plan`, `/goal`, `/fork`, `/diff`, `/review` equivalents | `src/commands/{plan,goal,diff,review}` |
34
+
35
+ Notable divergence, deliberate or not: Anthropic **removed** `ultraplan` in
36
+ Claude Code 2.1.222 (2026-08-04). UR still ships `/ultraplan`. Worth deciding
37
+ whether that is a differentiator or dead weight.
38
+
39
+ ---
40
+
41
+ ## 2. Missing — ranked by value
42
+
43
+ ### P0 — security correctness
44
+
45
+ **1. Sandbox credential masking / TLS-terminating egress proxy.**
46
+ Claude Code 2.1.221–2.1.224 added `sandbox.credentials` masking with
47
+ `mode: "mask"` sentinel files, `extract` regex spans, `decode: "jwt"` +
48
+ `maskClaims`, and `awsPairs`/`sigv4` re-signing behind `network.tlsTerminate`.
49
+ UR's sandbox is filesystem-scope only — `src/utils/sandbox/sandboxProfile.ts`
50
+ implements `denyRead`/`denyWrite` and nothing else. A sandboxed Bash command in
51
+ UR that can read `~/.aws/credentials` exfiltrates the real secret.
52
+ *Likely same bug present:* upstream patched a trailing-slash bypass where
53
+ `denyRead: "~/.aws/"` was silently ignorable. UR's `normalizedPaths()`
54
+ (`sandboxProfile.ts:51`) dedupes and calls `normalizePath()` but performs no
55
+ trailing-slash stripping of its own — verify `normalizePath` handles it, and add
56
+ a regression test for both `~/.aws` and `~/.aws/`.
57
+
58
+ **2. `sandbox.network.strictAllowlist` (partial gap).** UR *does* have a network
59
+ allowlist — `sandbox.network.allowedDomains`, `allowManagedDomainsOnly`,
60
+ `allowUnixSockets` in `src/utils/sandbox/sandbox-adapter.ts`. What's absent is
61
+ the strict mode: deny non-allowlisted hosts outright instead of prompting.
62
+ Under automation (`ur exec`, `ur bg`, agentic CI) a prompt is not an answer, so
63
+ today an unattended run either stalls or falls through. One settings key plus a
64
+ branch in the egress decision path.
65
+
66
+ **3. `Tool(param:value)` permission-rule syntax.** `permissionRuleParser.ts`
67
+ supports only `Tool(content)`. Upstream added input-parameter matching with
68
+ wildcards — e.g. `Agent(model:opus)` to block expensive subagents,
69
+ `Bash(timeout:*)`. Without it, policies cannot constrain *how* a tool is called,
70
+ only which paths it touches.
71
+
72
+ **4. Bash permission-check hardening.** Upstream shipped three separate bypass
73
+ fixes in Aug 2026: zsh hidden commands inside `[[ ]]` regex conditionals,
74
+ commands padded with tabs/invisible Unicode hiding text from the approval
75
+ dialog, and PowerShell paths containing quote characters. These are parser
76
+ classes, not one-off bugs — audit UR's command splitter against all three.
77
+
78
+ ### P1 — runaway-loop containment
79
+
80
+ **5. Per-session budgets, not just per-turn limits.** UR caps subagent depth and
81
+ concurrency but has no session totals. Upstream added a WebSearch cap
82
+ (default 200, `CLAUDE_CODE_MAX_WEB_SEARCHES_PER_SESSION`) and a subagent-spawn
83
+ cap, then *removed* the spawn cap once long sessions started failing — so ship
84
+ the search budget, and make the spawn budget advisory rather than fatal.
85
+
86
+ **6. `--forward-subagent-text` for stream-json.** UR has `--include-hook-events`
87
+ and `--include-partial-messages` but no way to surface subagent text/thinking in
88
+ headless output, including nested (depth-2+) agents keyed by spawning
89
+ `tool_use` id. This blocks CI observability of delegated work.
90
+
91
+ ### P2 — protocol currency
92
+
93
+ **7. MCP `InputRequiredResult`.** The `2026-07-28` spec deprecates
94
+ server-initiated elicitation and sampling in favor of `InputRequiredResult`.
95
+ UR implements the old `Elicitation`/`ElicitationResult` hooks (`src/types/hooks.ts`)
96
+ and has zero `InputRequired` references. Ship the new shape alongside the old.
97
+
98
+ **8. MCP `roots/list` + `notifications/roots/list_changed`.** Absent entirely.
99
+ Deprecated in `2026-07-28` (SEP-2577), but pre-2026 servers still expect it, and
100
+ upstream wires additional working directories into it. Low effort, moderate
101
+ compatibility win.
102
+
103
+ **9. A2A gaps.** Two items: (a) `src/services/agents/trends.ts:666` advertises
104
+ `protocolVersion: '0.3.0'` in the Agent Card while `a2aV1.ts` implements v1.0
105
+ signing — the card lies about its own version; (b) no gRPC transport and no AP2
106
+ payments extension, both part of the v1.0 surface.
107
+
108
+ ### P3 — accessibility and ergonomics
109
+
110
+ **10. Screen-reader mode.** Zero hits for `axScreenReader`/`--ax-screen-reader`.
111
+ Upstream shipped opt-in plain-text rendering plus per-keystroke and
112
+ per-deletion echo announcements. UR's Ink UI is unusable with a screen reader
113
+ today. This is the single largest addressable-user gap in the list.
114
+
115
+ **11. `/config key=value` from the prompt.** `src/commands/config/` exposes only
116
+ the interactive panel. Upstream's `/config thinking=false` works in interactive,
117
+ `-p`, and remote modes, with `/config --help` listing shorthand keys — the only
118
+ way to change a setting inside a headless run.
119
+
120
+ **12. `DirectoryAdded` hook.** UR has `CwdChanged` and `WorktreeCreate` but
121
+ fires nothing on `/add-dir`. Blocks per-directory setup automation.
122
+
123
+ **13. Explicit `ur session archive` / `unarchive`.** `archiveSession` exists only
124
+ in `src/bridge/`. Codex exposes `/archive` in the TUI and `codex archive` in the
125
+ CLI, with archived sessions protected from resume/fork. UR's session list grows
126
+ without bound.
127
+
128
+ **14. Vim insert-mode remaps.** `vimInsertModeRemaps` (e.g. `jj` → Escape) is a
129
+ one-setting change against UR's existing `src/vim/`.
130
+
131
+ **15. Telemetry completeness.** No `assistant_response` OTel log event, no
132
+ `message.uuid`/`client_request_id`/`tool_source` correlation attributes, no
133
+ `workflow.run_id`/`workflow.name`. UR has workflows and multi-agent runs but
134
+ cannot reconstruct a run from OTel data.
135
+
136
+ ---
137
+
138
+ ## 3. Explicitly not recommended
139
+
140
+ - **`EndConversation` tool.** Abuse-termination for a consumer chat product;
141
+ irrelevant to a local terminal agent the operator already controls.
142
+ - **Gateway spend-limit UX.** Presupposes Anthropic's managed gateway. UR's
143
+ `--max-budget-usd` covers the local equivalent.
144
+ - **`/dataviz` skill.** Content, not capability. Ship as a plugin if wanted.
145
+ - **Codex `--approve-for-me`.** Routes approvals through automated review —
146
+ directly opposed to UR's explicit-trust-boundary stance in
147
+ `docs/FRONTIER_AGENT_FEATURES.md`.
148
+
149
+ ---
150
+
151
+ ## 4. Suggested sequencing
152
+
153
+ 1. Credential masking + strict network allowlist (#1, #2) — same subsystem.
154
+ 2. Bash permission parser audit (#4) + `Tool(param:value)` (#3).
155
+ 3. Screen-reader mode (#10) — self-contained in `src/ink/`.
156
+ 4. MCP `InputRequiredResult` + `roots/list` (#7, #8); fix the A2A card version (#9a).
157
+ 5. Session budgets (#5), `--forward-subagent-text` (#6), OTel attributes (#15).
158
+ 6. Ergonomics batch: `/config key=value`, `DirectoryAdded`, session archive,
159
+ vim remaps (#11–14).
160
+
161
+ Then update `docs/AGENT_TRENDS.md` — its snapshot line still reads
162
+ `2026-08-10` and the coverage matrix predates the `2026-07-28` MCP final spec.
163
+
164
+ ---
165
+
166
+ ## Sources
167
+
168
+ - [Claude Code changelog](https://code.claude.com/docs/en/changelog)
169
+ - [Enabling Claude Code to work more autonomously — Anthropic](https://www.anthropic.com/news/enabling-claude-code-to-work-more-autonomously)
170
+ - [The 2026-07-28 MCP Specification](https://blog.modelcontextprotocol.io/posts/2026-07-28/)
171
+ - [The 2026-07-28 MCP Specification Release Candidate](https://blog.modelcontextprotocol.io/posts/2026-07-28-release-candidate/)
172
+ - [The 2026 MCP Roadmap](https://blog.modelcontextprotocol.io/posts/2026-mcp-roadmap/)
173
+ - [MCP 2026-07-28 spec: every breaking change, with fixes](https://stacktr.ee/blog/mcp-2026-spec-changes)
174
+ - [Codex CLI in 2026: What's New, What's Changed](https://codex.danielvaughan.com/2026/03/27/codex-cli-in-2026-whats-new/)
175
+ - [Codex Slash Commands: Complete CLI Reference (2026)](https://explainx.ai/blog/codex-slash-commands-complete-reference-guide-2026)
176
+ - [Gemini CLI changelog v0.53.0](https://geminicli.com/docs/changelogs/latest/)
177
+ - [Gemini CLI `/plan` command PR #17698](https://github.com/google-gemini/gemini-cli/pull/17698)
178
+ - [A2A Protocol Guide 2026](https://rapidclaw.dev/blog/a2a-protocol-complete-guide-2026)
179
+ - [MCP vs A2A vs AG-UI: Agent Protocols Guide 2026](https://nextpj.net/blog/mcp-a2a-ag-ui-ai-agent-protocols-guide-2026)
180
+ - [The 2026 Guide to Coding CLI Tools: 15 AI Agents Compared](https://www.tembo.io/blog/coding-cli-tools-comparison)
@@ -56,6 +56,20 @@ ur config set provider ollama
56
56
  ur provider status
57
57
  ```
58
58
 
59
+ ### Every Bash call fails with `ENOENT .../tasks/<id>.output`
60
+
61
+ - Likely cause: the operating system or a cleanup process reclaimed UR's
62
+ session task-output directory, or the conventional Unix `/tmp` path is
63
+ unavailable. The command itself never started; identical failure from
64
+ `echo ok` distinguishes this harness failure from an application error.
65
+ - Fix: upgrade to UR 1.79.1 or newer. UR now uses `os.tmpdir()`, ensures the
66
+ output directory for every launch, and automatically recreates and retries
67
+ when it disappears. Restarting an older session is only a temporary
68
+ workaround.
69
+ - Verification: start a new UR session and ask it to run `echo ok` through
70
+ Bash. A successful result confirms the harness; `/design3d doctor` alone
71
+ validates the local slash command but does not exercise Bash execution.
72
+
59
73
  ## Providers and models
60
74
 
61
75
  ### Provider selected but the model is unavailable
@@ -19,7 +19,7 @@ You need:
19
19
 
20
20
  ```sh
21
21
  ur --version
22
- # expected for this release: "1.79.0 (UR-Nexus)"
22
+ # expected for this release: "1.79.1 (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.79.0</p>
48
+ <p class="eyebrow">Version 1.79.1</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.79.0"
10
+ version = "1.79.1"
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.79.0",
5
+ "version": "1.79.1",
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.79.0",
3
+ "version": "1.79.1",
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",