ur-agent 1.45.5 → 1.45.6

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,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.45.6
4
+
5
+ - Deduplicated project verification approval so compile/test/lint commands are
6
+ offered at most once per user turn. The approval marker is cleared for the
7
+ next user task, preserving one explicit decision per task.
8
+ - Kept AutoApprove behavior, test execution policy, and explicit publishing
9
+ boundaries unchanged. Added regression coverage and synchronized user,
10
+ technical, static-site, npm, IDE, and bundled release metadata.
11
+
3
12
  ## 1.45.5
4
13
 
5
14
  - Bounded Ollama Cloud response-header and streaming phases to 120 seconds by
package/dist/cli.js CHANGED
@@ -73097,7 +73097,7 @@ var init_auth = __esm(() => {
73097
73097
 
73098
73098
  // src/utils/userAgent.ts
73099
73099
  function getURCodeUserAgent() {
73100
- return `ur/${"1.45.5"}`;
73100
+ return `ur/${"1.45.6"}`;
73101
73101
  }
73102
73102
 
73103
73103
  // src/utils/workloadContext.ts
@@ -73119,7 +73119,7 @@ function getUserAgent() {
73119
73119
  const clientApp = process.env.UR_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}` : "";
73120
73120
  const workload = getWorkload();
73121
73121
  const workloadSuffix = workload ? `, workload/${workload}` : "";
73122
- return `ur-cli/${"1.45.5"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
73122
+ return `ur-cli/${"1.45.6"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
73123
73123
  }
73124
73124
  function getMCPUserAgent() {
73125
73125
  const parts = [];
@@ -73133,7 +73133,7 @@ function getMCPUserAgent() {
73133
73133
  parts.push(`client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}`);
73134
73134
  }
73135
73135
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
73136
- return `ur/${"1.45.5"}${suffix}`;
73136
+ return `ur/${"1.45.6"}${suffix}`;
73137
73137
  }
73138
73138
  function getWebFetchUserAgent() {
73139
73139
  return `UR-User (${getURCodeUserAgent()})`;
@@ -73271,7 +73271,7 @@ var init_user = __esm(() => {
73271
73271
  deviceId,
73272
73272
  sessionId: getSessionId(),
73273
73273
  email: getEmail(),
73274
- appVersion: "1.45.5",
73274
+ appVersion: "1.45.6",
73275
73275
  platform: getHostPlatformForAnalytics(),
73276
73276
  organizationUuid,
73277
73277
  accountUuid,
@@ -79846,7 +79846,7 @@ var init_metadata = __esm(() => {
79846
79846
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
79847
79847
  WHITESPACE_REGEX = /\s+/;
79848
79848
  getVersionBase = memoize_default(() => {
79849
- const match = "1.45.5".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
79849
+ const match = "1.45.6".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
79850
79850
  return match ? match[0] : undefined;
79851
79851
  });
79852
79852
  buildEnvContext = memoize_default(async () => {
@@ -79886,7 +79886,7 @@ var init_metadata = __esm(() => {
79886
79886
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
79887
79887
  isURCodeAction: isEnvTruthy(process.env.UR_CODE_ACTION),
79888
79888
  isURAiAuth: isURAISubscriber(),
79889
- version: "1.45.5",
79889
+ version: "1.45.6",
79890
79890
  versionBase: getVersionBase(),
79891
79891
  buildTime: "",
79892
79892
  deploymentEnvironment: env2.detectDeploymentEnvironment(),
@@ -80556,7 +80556,7 @@ function initialize1PEventLogging() {
80556
80556
  const platform2 = getPlatform();
80557
80557
  const attributes = {
80558
80558
  [import_semantic_conventions4.ATTR_SERVICE_NAME]: "ur",
80559
- [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.45.5"
80559
+ [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.45.6"
80560
80560
  };
80561
80561
  if (platform2 === "wsl") {
80562
80562
  const wslVersion = getWslVersion();
@@ -80583,7 +80583,7 @@ function initialize1PEventLogging() {
80583
80583
  })
80584
80584
  ]
80585
80585
  });
80586
- firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.45.5");
80586
+ firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.45.6");
80587
80587
  }
80588
80588
  async function reinitialize1PEventLoggingIfConfigChanged() {
80589
80589
  if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
@@ -86508,7 +86508,7 @@ function formatAgentTrendReport(report = buildAgentTrendReport()) {
86508
86508
  function formatA2AAgentCard(options = {}, pretty = true) {
86509
86509
  return JSON.stringify(buildA2AAgentCard(options), null, pretty ? 2 : 0);
86510
86510
  }
86511
- var urVersion = "1.45.5", coverage, priorityRoadmap;
86511
+ var urVersion = "1.45.6", coverage, priorityRoadmap;
86512
86512
  var init_trends = __esm(() => {
86513
86513
  coverage = [
86514
86514
  {
@@ -88374,7 +88374,7 @@ function getAttributionHeader(fingerprint) {
88374
88374
  if (!isAttributionHeaderEnabled()) {
88375
88375
  return "";
88376
88376
  }
88377
- const version2 = `${"1.45.5"}.${fingerprint}`;
88377
+ const version2 = `${"1.45.6"}.${fingerprint}`;
88378
88378
  const entrypoint = process.env.UR_CODE_ENTRYPOINT ?? "unknown";
88379
88379
  const cch = "";
88380
88380
  const workload = getWorkload();
@@ -147117,11 +147117,13 @@ class Verifier {
147117
147117
  pluginValidatorsPromise;
147118
147118
  rejectionsByTurn = new Map;
147119
147119
  nudgedTurns = new Set;
147120
+ gateApprovalRequestedTurns = new Set;
147120
147121
  userTaskHintByTurn = new Map;
147121
147122
  maxRejections;
147122
147123
  cwd;
147123
147124
  enableSubagentNudge;
147124
147125
  mode;
147126
+ askBeforeGatesOverride;
147125
147127
  constructor(options2) {
147126
147128
  this.cwd = options2.cwd;
147127
147129
  this.maxRejections = options2.maxRejectionsPerTurn ?? DEFAULT_MAX_REJECTIONS_PER_TURN;
@@ -147129,6 +147131,7 @@ class Verifier {
147129
147131
  this.configPromise = loadVerifyConfig(options2.cwd);
147130
147132
  this.pluginValidatorsPromise = loadPluginValidators();
147131
147133
  this.mode = resolveMode(options2.mode);
147134
+ this.askBeforeGatesOverride = options2.askBeforeGates;
147132
147135
  const subagentEnabledByDefault = this.mode !== "off" && process.env.UR_VERIFIER_DISABLE_SUBAGENT !== "1" && isEnvTruthy(process.env.UR_VERIFIER_AUTO_SUBAGENT);
147133
147136
  this.enableSubagentNudge = options2.enableSubagentNudge ?? subagentEnabledByDefault;
147134
147137
  }
@@ -147136,6 +147139,7 @@ class Verifier {
147136
147139
  this.loops.reset();
147137
147140
  this.rejectionsByTurn.delete(turnId);
147138
147141
  this.nudgedTurns.delete(turnId);
147142
+ this.gateApprovalRequestedTurns.delete(turnId);
147139
147143
  if (userTaskHint)
147140
147144
  this.userTaskHintByTurn.set(turnId, userTaskHint);
147141
147145
  }
@@ -147178,14 +147182,16 @@ class Verifier {
147178
147182
  autoDetected = true;
147179
147183
  }
147180
147184
  if (commands && commands.length > 0) {
147181
- if (!askBeforeGatesEnabled() && getIsNonInteractiveSession()) {
147185
+ const shouldAskBeforeGates = this.askBeforeGatesOverride ?? (askBeforeGatesEnabled() || !getIsNonInteractiveSession());
147186
+ if (!shouldAskBeforeGates) {
147182
147187
  const result = await runGateCommands(commands, this.cwd, timeoutMs);
147183
147188
  if (!result.ok) {
147184
147189
  this.bumpRejection(turnId);
147185
147190
  const failed = result;
147186
147191
  return { ok: false, reminder: failed.reminder };
147187
147192
  }
147188
- } else {
147193
+ } else if (!this.gateApprovalRequestedTurns.has(turnId)) {
147194
+ this.gateApprovalRequestedTurns.add(turnId);
147189
147195
  this.bumpRejection(turnId);
147190
147196
  return {
147191
147197
  ok: false,
@@ -147234,6 +147240,7 @@ class Verifier {
147234
147240
  this.ledger.forget(turnId);
147235
147241
  this.rejectionsByTurn.delete(turnId);
147236
147242
  this.nudgedTurns.delete(turnId);
147243
+ this.gateApprovalRequestedTurns.delete(turnId);
147237
147244
  this.userTaskHintByTurn.delete(turnId);
147238
147245
  }
147239
147246
  bumpRejection(turnId) {
@@ -196594,7 +196601,7 @@ function getTelemetryAttributes() {
196594
196601
  attributes["session.id"] = sessionId;
196595
196602
  }
196596
196603
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
196597
- attributes["app.version"] = "1.45.5";
196604
+ attributes["app.version"] = "1.45.6";
196598
196605
  }
196599
196606
  const oauthAccount = getOauthAccountInfo();
196600
196607
  if (oauthAccount) {
@@ -232075,7 +232082,7 @@ function getInstallationEnv() {
232075
232082
  return;
232076
232083
  }
232077
232084
  function getURCodeVersion() {
232078
- return "1.45.5";
232085
+ return "1.45.6";
232079
232086
  }
232080
232087
  async function getInstalledVSCodeExtensionVersion(command) {
232081
232088
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -239457,7 +239464,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
239457
239464
  const client2 = new Client({
239458
239465
  name: "ur",
239459
239466
  title: "UR",
239460
- version: "1.45.5",
239467
+ version: "1.45.6",
239461
239468
  description: "UR-Nexus autonomous engineering workflow engine",
239462
239469
  websiteUrl: PRODUCT_URL
239463
239470
  }, {
@@ -239820,7 +239827,7 @@ var init_client5 = __esm(() => {
239820
239827
  const client2 = new Client({
239821
239828
  name: "ur",
239822
239829
  title: "UR",
239823
- version: "1.45.5",
239830
+ version: "1.45.6",
239824
239831
  description: "UR-Nexus autonomous engineering workflow engine",
239825
239832
  websiteUrl: PRODUCT_URL
239826
239833
  }, {
@@ -246857,9 +246864,9 @@ async function assertMinVersion() {
246857
246864
  if (false) {}
246858
246865
  try {
246859
246866
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
246860
- if (versionConfig.minVersion && lt("1.45.5", versionConfig.minVersion)) {
246867
+ if (versionConfig.minVersion && lt("1.45.6", versionConfig.minVersion)) {
246861
246868
  console.error(`
246862
- It looks like your version of UR (${"1.45.5"}) needs an update.
246869
+ It looks like your version of UR (${"1.45.6"}) needs an update.
246863
246870
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
246864
246871
 
246865
246872
  To update, please run:
@@ -247075,7 +247082,7 @@ async function installGlobalPackage(specificVersion) {
247075
247082
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
247076
247083
  logEvent("tengu_auto_updater_lock_contention", {
247077
247084
  pid: process.pid,
247078
- currentVersion: "1.45.5"
247085
+ currentVersion: "1.45.6"
247079
247086
  });
247080
247087
  return "in_progress";
247081
247088
  }
@@ -247084,7 +247091,7 @@ async function installGlobalPackage(specificVersion) {
247084
247091
  if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
247085
247092
  logError2(new Error("Windows NPM detected in WSL environment"));
247086
247093
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
247087
- currentVersion: "1.45.5"
247094
+ currentVersion: "1.45.6"
247088
247095
  });
247089
247096
  console.error(`
247090
247097
  Error: Windows NPM detected in WSL
@@ -247619,7 +247626,7 @@ function detectLinuxGlobPatternWarnings() {
247619
247626
  }
247620
247627
  async function getDoctorDiagnostic() {
247621
247628
  const installationType = await getCurrentInstallationType();
247622
- const version2 = typeof MACRO !== "undefined" ? "1.45.5" : "unknown";
247629
+ const version2 = typeof MACRO !== "undefined" ? "1.45.6" : "unknown";
247623
247630
  const installationPath = await getInstallationPath();
247624
247631
  const invokedBinary = getInvokedBinary();
247625
247632
  const multipleInstallations = await detectMultipleInstallations();
@@ -248554,8 +248561,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
248554
248561
  const maxVersion = await getMaxVersion();
248555
248562
  if (maxVersion && gt(version2, maxVersion)) {
248556
248563
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
248557
- if (gte("1.45.5", maxVersion)) {
248558
- logForDebugging(`Native installer: current version ${"1.45.5"} is already at or above maxVersion ${maxVersion}, skipping update`);
248564
+ if (gte("1.45.6", maxVersion)) {
248565
+ logForDebugging(`Native installer: current version ${"1.45.6"} is already at or above maxVersion ${maxVersion}, skipping update`);
248559
248566
  logEvent("tengu_native_update_skipped_max_version", {
248560
248567
  latency_ms: Date.now() - startTime,
248561
248568
  max_version: maxVersion,
@@ -248566,7 +248573,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
248566
248573
  version2 = maxVersion;
248567
248574
  }
248568
248575
  }
248569
- if (!forceReinstall && version2 === "1.45.5" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
248576
+ if (!forceReinstall && version2 === "1.45.6" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
248570
248577
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
248571
248578
  logEvent("tengu_native_update_complete", {
248572
248579
  latency_ms: Date.now() - startTime,
@@ -346426,7 +346433,7 @@ function Feedback({
346426
346433
  platform: env2.platform,
346427
346434
  gitRepo: envInfo.isGit,
346428
346435
  terminal: env2.terminal,
346429
- version: "1.45.5",
346436
+ version: "1.45.6",
346430
346437
  transcript: normalizeMessagesForAPI(messages),
346431
346438
  errors: sanitizedErrors,
346432
346439
  lastApiRequest: getLastAPIRequest(),
@@ -346618,7 +346625,7 @@ function Feedback({
346618
346625
  ", ",
346619
346626
  env2.terminal,
346620
346627
  ", v",
346621
- "1.45.5"
346628
+ "1.45.6"
346622
346629
  ]
346623
346630
  }, undefined, true, undefined, this)
346624
346631
  ]
@@ -346724,7 +346731,7 @@ ${sanitizedDescription}
346724
346731
  ` + `**Environment Info**
346725
346732
  ` + `- Platform: ${env2.platform}
346726
346733
  ` + `- Terminal: ${env2.terminal}
346727
- ` + `- Version: ${"1.45.5"}
346734
+ ` + `- Version: ${"1.45.6"}
346728
346735
  ` + `- Feedback ID: ${feedbackId}
346729
346736
  ` + `
346730
346737
  **Errors**
@@ -349835,7 +349842,7 @@ function buildPrimarySection() {
349835
349842
  }, undefined, false, undefined, this);
349836
349843
  return [{
349837
349844
  label: "Version",
349838
- value: "1.45.5"
349845
+ value: "1.45.6"
349839
349846
  }, {
349840
349847
  label: "Session name",
349841
349848
  value: nameValue
@@ -353165,7 +353172,7 @@ function Config({
353165
353172
  }
353166
353173
  }, undefined, false, undefined, this)
353167
353174
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime178.jsxDEV(ChannelDowngradeDialog, {
353168
- currentVersion: "1.45.5",
353175
+ currentVersion: "1.45.6",
353169
353176
  onChoice: (choice) => {
353170
353177
  setShowSubmenu(null);
353171
353178
  setTabsHidden(false);
@@ -353177,7 +353184,7 @@ function Config({
353177
353184
  autoUpdatesChannel: "stable"
353178
353185
  };
353179
353186
  if (choice === "stay") {
353180
- newSettings.minimumVersion = "1.45.5";
353187
+ newSettings.minimumVersion = "1.45.6";
353181
353188
  }
353182
353189
  updateSettingsForSource("userSettings", newSettings);
353183
353190
  setSettingsData((prev_27) => ({
@@ -361247,7 +361254,7 @@ function HelpV2(t0) {
361247
361254
  let t6;
361248
361255
  if ($3[31] !== tabs) {
361249
361256
  t6 = /* @__PURE__ */ jsx_dev_runtime205.jsxDEV(Tabs, {
361250
- title: `UR v${"1.45.5"}`,
361257
+ title: `UR v${"1.45.6"}`,
361251
361258
  color: "professionalBlue",
361252
361259
  defaultTab: "general",
361253
361260
  children: tabs
@@ -362021,7 +362028,7 @@ function buildToolUseContext(tools, readFileStateCache) {
362021
362028
  async function handleInitialize(options2) {
362022
362029
  return {
362023
362030
  name: "UR",
362024
- version: "1.45.5",
362031
+ version: "1.45.6",
362025
362032
  protocolVersion: "0.1.0",
362026
362033
  workspaceRoot: options2.cwd,
362027
362034
  capabilities: {
@@ -382163,7 +382170,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
382163
382170
  return [];
382164
382171
  }
382165
382172
  }
382166
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.45.5") {
382173
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.45.6") {
382167
382174
  if (process.env.USER_TYPE === "ant") {
382168
382175
  const changelog = "";
382169
382176
  if (changelog) {
@@ -382190,7 +382197,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.45.5")
382190
382197
  releaseNotes
382191
382198
  };
382192
382199
  }
382193
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.45.5") {
382200
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.45.6") {
382194
382201
  if (process.env.USER_TYPE === "ant") {
382195
382202
  const changelog = "";
382196
382203
  if (changelog) {
@@ -385282,7 +385289,7 @@ function getRecentActivitySync() {
385282
385289
  return cachedActivity;
385283
385290
  }
385284
385291
  function getLogoDisplayData() {
385285
- const version2 = process.env.DEMO_VERSION ?? "1.45.5";
385292
+ const version2 = process.env.DEMO_VERSION ?? "1.45.6";
385286
385293
  const serverUrl = getDirectConnectServerUrl();
385287
385294
  const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd());
385288
385295
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -386166,7 +386173,7 @@ function LogoV2() {
386166
386173
  if ($3[2] === Symbol.for("react.memo_cache_sentinel")) {
386167
386174
  t2 = () => {
386168
386175
  const currentConfig2 = getGlobalConfig();
386169
- if (currentConfig2.lastReleaseNotesSeen === "1.45.5") {
386176
+ if (currentConfig2.lastReleaseNotesSeen === "1.45.6") {
386170
386177
  return;
386171
386178
  }
386172
386179
  saveGlobalConfig(_temp327);
@@ -386851,12 +386858,12 @@ function LogoV2() {
386851
386858
  return t41;
386852
386859
  }
386853
386860
  function _temp327(current) {
386854
- if (current.lastReleaseNotesSeen === "1.45.5") {
386861
+ if (current.lastReleaseNotesSeen === "1.45.6") {
386855
386862
  return current;
386856
386863
  }
386857
386864
  return {
386858
386865
  ...current,
386859
- lastReleaseNotesSeen: "1.45.5"
386866
+ lastReleaseNotesSeen: "1.45.6"
386860
386867
  };
386861
386868
  }
386862
386869
  function _temp243(s_0) {
@@ -604899,7 +604906,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
604899
604906
  smapsRollup,
604900
604907
  platform: process.platform,
604901
604908
  nodeVersion: process.version,
604902
- ccVersion: "1.45.5"
604909
+ ccVersion: "1.45.6"
604903
604910
  };
604904
604911
  }
604905
604912
  async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
@@ -605485,7 +605492,7 @@ var init_bridge_kick = __esm(() => {
605485
605492
  var call143 = async () => {
605486
605493
  return {
605487
605494
  type: "text",
605488
- value: "1.45.5"
605495
+ value: "1.45.6"
605489
605496
  };
605490
605497
  }, version2, version_default;
605491
605498
  var init_version = __esm(() => {
@@ -616595,7 +616602,7 @@ function generateHtmlReport(data, insights) {
616595
616602
  </html>`;
616596
616603
  }
616597
616604
  function buildExportData(data, insights, facets, remoteStats) {
616598
- const version3 = typeof MACRO !== "undefined" ? "1.45.5" : "unknown";
616605
+ const version3 = typeof MACRO !== "undefined" ? "1.45.6" : "unknown";
616599
616606
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
616600
616607
  const facets_summary = {
616601
616608
  total: facets.size,
@@ -620924,7 +620931,7 @@ var init_sessionStorage = __esm(() => {
620924
620931
  init_settings2();
620925
620932
  init_slowOperations();
620926
620933
  init_uuid();
620927
- VERSION5 = typeof MACRO !== "undefined" ? "1.45.5" : "unknown";
620934
+ VERSION5 = typeof MACRO !== "undefined" ? "1.45.6" : "unknown";
620928
620935
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
620929
620936
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
620930
620937
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -622129,7 +622136,7 @@ var init_filesystem = __esm(() => {
622129
622136
  });
622130
622137
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
622131
622138
  const nonce = randomBytes18(16).toString("hex");
622132
- return join211(getURTempDir(), "bundled-skills", "1.45.5", nonce);
622139
+ return join211(getURTempDir(), "bundled-skills", "1.45.6", nonce);
622133
622140
  });
622134
622141
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
622135
622142
  });
@@ -628424,7 +628431,7 @@ function computeFingerprint(messageText2, version3) {
628424
628431
  }
628425
628432
  function computeFingerprintFromMessages(messages) {
628426
628433
  const firstMessageText = extractFirstMessageText(messages);
628427
- return computeFingerprint(firstMessageText, "1.45.5");
628434
+ return computeFingerprint(firstMessageText, "1.45.6");
628428
628435
  }
628429
628436
  var FINGERPRINT_SALT = "59cf53e54c78";
628430
628437
  var init_fingerprint = () => {};
@@ -630309,7 +630316,7 @@ async function sideQuery(opts) {
630309
630316
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
630310
630317
  }
630311
630318
  const messageText2 = extractFirstUserMessageText(messages);
630312
- const fingerprint2 = computeFingerprint(messageText2, "1.45.5");
630319
+ const fingerprint2 = computeFingerprint(messageText2, "1.45.6");
630313
630320
  const attributionHeader = getAttributionHeader(fingerprint2);
630314
630321
  const systemBlocks = [
630315
630322
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -635046,7 +635053,7 @@ function buildSystemInitMessage(inputs) {
635046
635053
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
635047
635054
  apiKeySource: getURHQApiKeyWithSource().source,
635048
635055
  betas: getSdkBetas(),
635049
- ur_version: "1.45.5",
635056
+ ur_version: "1.45.6",
635050
635057
  output_style: outputStyle2,
635051
635058
  agents: inputs.agents.map((agent) => agent.agentType),
635052
635059
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
@@ -648906,7 +648913,7 @@ var init_useVoiceEnabled = __esm(() => {
648906
648913
  function getSemverPart(version3) {
648907
648914
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
648908
648915
  }
648909
- function useUpdateNotification(updatedVersion, initialVersion = "1.45.5") {
648916
+ function useUpdateNotification(updatedVersion, initialVersion = "1.45.6") {
648910
648917
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react228.useState(() => getSemverPart(initialVersion));
648911
648918
  if (!updatedVersion) {
648912
648919
  return null;
@@ -648955,7 +648962,7 @@ function AutoUpdater({
648955
648962
  return;
648956
648963
  }
648957
648964
  if (false) {}
648958
- const currentVersion = "1.45.5";
648965
+ const currentVersion = "1.45.6";
648959
648966
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
648960
648967
  let latestVersion = await getLatestVersion(channel);
648961
648968
  const isDisabled = isAutoUpdaterDisabled();
@@ -649184,12 +649191,12 @@ function NativeAutoUpdater({
649184
649191
  logEvent("tengu_native_auto_updater_start", {});
649185
649192
  try {
649186
649193
  const maxVersion = await getMaxVersion();
649187
- if (maxVersion && gt("1.45.5", maxVersion)) {
649194
+ if (maxVersion && gt("1.45.6", maxVersion)) {
649188
649195
  const msg = await getMaxVersionMessage();
649189
649196
  setMaxVersionIssue(msg ?? "affects your version");
649190
649197
  }
649191
649198
  const result = await installLatest(channel);
649192
- const currentVersion = "1.45.5";
649199
+ const currentVersion = "1.45.6";
649193
649200
  const latencyMs = Date.now() - startTime;
649194
649201
  if (result.lockFailed) {
649195
649202
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -649326,17 +649333,17 @@ function PackageManagerAutoUpdater(t0) {
649326
649333
  const maxVersion = await getMaxVersion();
649327
649334
  if (maxVersion && latest && gt(latest, maxVersion)) {
649328
649335
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
649329
- if (gte("1.45.5", maxVersion)) {
649330
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.45.5"} is already at or above maxVersion ${maxVersion}, skipping update`);
649336
+ if (gte("1.45.6", maxVersion)) {
649337
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.45.6"} is already at or above maxVersion ${maxVersion}, skipping update`);
649331
649338
  setUpdateAvailable(false);
649332
649339
  return;
649333
649340
  }
649334
649341
  latest = maxVersion;
649335
649342
  }
649336
- const hasUpdate = latest && !gte("1.45.5", latest) && !shouldSkipVersion(latest);
649343
+ const hasUpdate = latest && !gte("1.45.6", latest) && !shouldSkipVersion(latest);
649337
649344
  setUpdateAvailable(!!hasUpdate);
649338
649345
  if (hasUpdate) {
649339
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.45.5"} -> ${latest}`);
649346
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.45.6"} -> ${latest}`);
649340
649347
  }
649341
649348
  };
649342
649349
  $3[0] = t1;
@@ -649370,7 +649377,7 @@ function PackageManagerAutoUpdater(t0) {
649370
649377
  wrap: "truncate",
649371
649378
  children: [
649372
649379
  "currentVersion: ",
649373
- "1.45.5"
649380
+ "1.45.6"
649374
649381
  ]
649375
649382
  }, undefined, true, undefined, this);
649376
649383
  $3[3] = verbose;
@@ -660067,7 +660074,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
660067
660074
  project_dir: getOriginalCwd(),
660068
660075
  added_dirs: addedDirs
660069
660076
  },
660070
- version: "1.45.5",
660077
+ version: "1.45.6",
660071
660078
  output_style: {
660072
660079
  name: outputStyleName
660073
660080
  },
@@ -660150,7 +660157,7 @@ function StatusLineInner({
660150
660157
  const taskValues = Object.values(tasks2);
660151
660158
  const taskRunningCount = taskValues.filter((task2) => task2.status === "running" || task2.status === "pending").length;
660152
660159
  const defaultStatusLineText = buildDefaultStatusBar({
660153
- version: "1.45.5",
660160
+ version: "1.45.6",
660154
660161
  providerLabel: providerRuntime.providerLabel,
660155
660162
  authMode: providerRuntime.authLabel,
660156
660163
  model: providerRuntime.model ?? renderModelName(mainLoopModel),
@@ -672143,7 +672150,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
672143
672150
  } catch {}
672144
672151
  const data = {
672145
672152
  trigger: trigger2,
672146
- version: "1.45.5",
672153
+ version: "1.45.6",
672147
672154
  platform: process.platform,
672148
672155
  transcript,
672149
672156
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -684429,7 +684436,7 @@ function WelcomeV2() {
684429
684436
  dimColor: true,
684430
684437
  children: [
684431
684438
  "v",
684432
- "1.45.5"
684439
+ "1.45.6"
684433
684440
  ]
684434
684441
  }, undefined, true, undefined, this)
684435
684442
  ]
@@ -685689,7 +685696,7 @@ function completeOnboarding() {
685689
685696
  saveGlobalConfig((current) => ({
685690
685697
  ...current,
685691
685698
  hasCompletedOnboarding: true,
685692
- lastOnboardingVersion: "1.45.5"
685699
+ lastOnboardingVersion: "1.45.6"
685693
685700
  }));
685694
685701
  }
685695
685702
  function showDialog(root2, renderer) {
@@ -690711,7 +690718,7 @@ function appendToLog(path24, message) {
690711
690718
  cwd: getFsImplementation().cwd(),
690712
690719
  userType: process.env.USER_TYPE,
690713
690720
  sessionId: getSessionId(),
690714
- version: "1.45.5"
690721
+ version: "1.45.6"
690715
690722
  };
690716
690723
  getLogWriter(path24).write(messageWithTimestamp);
690717
690724
  }
@@ -694870,8 +694877,8 @@ async function getEnvLessBridgeConfig() {
694870
694877
  }
694871
694878
  async function checkEnvLessBridgeMinVersion() {
694872
694879
  const cfg = await getEnvLessBridgeConfig();
694873
- if (cfg.min_version && lt("1.45.5", cfg.min_version)) {
694874
- return `Your version of UR (${"1.45.5"}) is too old for Remote Control.
694880
+ if (cfg.min_version && lt("1.45.6", cfg.min_version)) {
694881
+ return `Your version of UR (${"1.45.6"}) is too old for Remote Control.
694875
694882
  Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
694876
694883
  }
694877
694884
  return null;
@@ -695345,7 +695352,7 @@ async function initBridgeCore(params) {
695345
695352
  const rawApi = createBridgeApiClient({
695346
695353
  baseUrl,
695347
695354
  getAccessToken,
695348
- runnerVersion: "1.45.5",
695355
+ runnerVersion: "1.45.6",
695349
695356
  onDebug: logForDebugging,
695350
695357
  onAuth401,
695351
695358
  getTrustedDeviceToken
@@ -701027,7 +701034,7 @@ async function startMCPServer(cwd3, debug2, verbose) {
701027
701034
  setCwd(cwd3);
701028
701035
  const server2 = new Server({
701029
701036
  name: "ur/tengu",
701030
- version: "1.45.5"
701037
+ version: "1.45.6"
701031
701038
  }, {
701032
701039
  capabilities: {
701033
701040
  tools: {}
@@ -703069,7 +703076,7 @@ async function update() {
703069
703076
  logEvent("tengu_update_check", {});
703070
703077
  const diagnostic = await getDoctorDiagnostic();
703071
703078
  const result = await checkUpgradeStatus({
703072
- currentVersion: "1.45.5",
703079
+ currentVersion: "1.45.6",
703073
703080
  packageName: UR_AGENT_PACKAGE_NAME,
703074
703081
  installationType: diagnostic.installationType,
703075
703082
  latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
@@ -704380,7 +704387,7 @@ ${customInstructions}` : customInstructions;
704380
704387
  }
704381
704388
  }
704382
704389
  logForDiagnosticsNoPII("info", "started", {
704383
- version: "1.45.5",
704390
+ version: "1.45.6",
704384
704391
  is_native_binary: isInBundledMode()
704385
704392
  });
704386
704393
  registerCleanup(async () => {
@@ -705166,7 +705173,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
705166
705173
  pendingHookMessages
705167
705174
  }, renderAndRun);
705168
705175
  }
705169
- }).version("1.45.5 (UR-Nexus)", "-v, --version", "Output the version number");
705176
+ }).version("1.45.6 (UR-Nexus)", "-v, --version", "Output the version number");
705170
705177
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
705171
705178
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
705172
705179
  if (canUserConfigureAdvisor()) {
@@ -706102,7 +706109,7 @@ if (false) {}
706102
706109
  async function main2() {
706103
706110
  const args = process.argv.slice(2);
706104
706111
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
706105
- console.log(`${"1.45.5"} (UR-Nexus)`);
706112
+ console.log(`${"1.45.6"} (UR-Nexus)`);
706106
706113
  return;
706107
706114
  }
706108
706115
  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.45.6 Additions
13
+
14
+ - Project verification approval is deduplicated per user turn. The agent asks
15
+ once before the final compile/test/lint commands, then respects that decision
16
+ without presenting the same gate again.
17
+
12
18
  ## v1.45.5 Additions
13
19
 
14
20
  - Ollama Cloud requests have bounded response-header and streaming phases and
@@ -311,7 +311,7 @@ Behaviour is controlled by environment variables:
311
311
  ```sh
312
312
  # Overall mode (default: strict) — controls the L1 gates
313
313
  UR_VERIFIER_MODE=strict # all L1 gates on: done-claim, loops, empty turn,
314
- # project gates
314
+ # project gates; approval is requested once per user turn
315
315
  UR_VERIFIER_MODE=loose # only empty-turn check + loop detector
316
316
  UR_VERIFIER_MODE=off # disable verifier entirely
317
317
 
package/docs/USAGE.md CHANGED
@@ -106,6 +106,10 @@ directly instead of being replayed through the non-streaming fallback. Local
106
106
  Ollama models keep the five-minute default. Set `API_TIMEOUT_MS` to explicitly
107
107
  override either default for the current process.
108
108
 
109
+ When project verification requires approval, UR asks once per user turn. The
110
+ same pending compile/test/lint gate is not presented again after the user has
111
+ answered; a later user task can request its own approval normally.
112
+
109
113
  UR-Nexus also has explicit provider commands for legal access paths:
110
114
 
111
115
  ```sh
@@ -19,7 +19,7 @@ You need:
19
19
 
20
20
  ```sh
21
21
  ur --version
22
- # expected for this release: "1.45.5 (UR-Nexus)"
22
+ # expected for this release: "1.45.6 (UR-Nexus)"
23
23
  ```
24
24
 
25
25
  ## 0.1 First-workspace model selection (1.45.4)
@@ -54,6 +54,13 @@ seconds for response headers and streaming; a local model retains 300 seconds.
54
54
  `API_TIMEOUT_MS` wins over both. When a cloud stream reaches its deliberate
55
55
  deadline, the request fails once instead of starting a non-streaming replay.
56
56
 
57
+ ### 0.1.2 Single project-gate approval (1.45.6)
58
+
59
+ With `verifier.askBeforeGates` enabled, complete a task that edits a source
60
+ file. Expected: UR asks once whether to run the detected compile/test/lint
61
+ commands. After answering, the same approval question is not shown again. A
62
+ separate user task that edits files may ask once for its own verification.
63
+
57
64
  ## 0.2 Permission safety and context pack (1.19.0)
58
65
 
59
66
  In a project checkout:
@@ -44,7 +44,7 @@
44
44
  <main id="content" class="content">
45
45
  <header class="topbar">
46
46
  <div>
47
- <p class="eyebrow">Version 1.45.5</p>
47
+ <p class="eyebrow">Version 1.45.6</p>
48
48
  <h1>UR-Nexus Documentation</h1>
49
49
  <p class="lead">A practical, tutorial-style reference for installing, configuring, automating, extending, and operating UR-Nexus.</p>
50
50
  </div>
@@ -163,7 +163,7 @@ ur config set provider.fallback ollama</code></pre>
163
163
  </article>
164
164
  <article>
165
165
  <h3>Status bar and updates</h3>
166
- <pre><code>Ollama | llama3 | ask | main | update 1.45.5 available</code></pre>
166
+ <pre><code>Ollama | llama3 | ask | main | update 1.45.6 available</code></pre>
167
167
  <p>The interactive status bar shows only important runtime state: provider, model, mode, branch, active tasks, checks status when known, and update availability. It is hidden in CI, dumb terminals, and print mode.</p>
168
168
  </article>
169
169
  <article>
@@ -487,7 +487,7 @@ UR_VERIFIER_MODE=loose
487
487
  UR_VERIFIER_MODE=off
488
488
  UR_VERIFIER_AUTO_SUBAGENT=1</code></pre>
489
489
  <p>L1 gates catch false done claims, immediate-action promises that end without their tool call, and loops. <code>/verify</code> manually runs deeper verification.</p>
490
- <p>Interactive users can set <code>"verifier": { "askBeforeGates": true }</code> in <code>.ur/settings.json</code> (or via <code>ur config set verifier.askBeforeGates true</code>) to have UR ask before running project test/typecheck/lint gates after a task, instead of running them automatically. Default is <code>false</code> (auto-run gates).</p>
490
+ <p>Interactive users can set <code>"verifier": { "askBeforeGates": true }</code> in <code>.ur/settings.json</code> (or via <code>ur config set verifier.askBeforeGates true</code>) to have UR ask once per user turn before running project test/typecheck/lint gates after a task, instead of running them automatically. Default is <code>false</code> (auto-run gates).</p>
491
491
  </article>
492
492
  <article>
493
493
  <h3>MCP and plugins</h3>
@@ -5,7 +5,7 @@ plugins {
5
5
  }
6
6
 
7
7
  group = "dev.urnexus"
8
- version = "1.45.5"
8
+ version = "1.45.6"
9
9
 
10
10
  repositories {
11
11
  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.45.5",
5
+ "version": "1.45.6",
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.45.5",
3
+ "version": "1.45.6",
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",