ur-agent 1.43.6 → 1.44.0

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,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.44.0
4
+
5
+ - Add `verifier.askBeforeGates` setting (default `false`). When enabled, UR asks
6
+ via `AskUserQuestion` whether to run project verification commands after a
7
+ task, instead of auto-running tests/typecheck/lint gates. Available in
8
+ `/config`, `ur config set verifier.askBeforeGates true`, and
9
+ `.ur/settings.json`.
10
+ - Prompt the model to stop after delivering its final response, reducing silent
11
+ extra thinking turns.
12
+
3
13
  ## 1.43.6
4
14
 
5
15
  - Render output from reasoning models on OpenAI-compatible providers (LM Studio,
package/dist/cli.js CHANGED
@@ -71253,7 +71253,7 @@ var init_auth = __esm(() => {
71253
71253
 
71254
71254
  // src/utils/userAgent.ts
71255
71255
  function getURCodeUserAgent() {
71256
- return `ur/${"1.43.6"}`;
71256
+ return `ur/${"1.44.0"}`;
71257
71257
  }
71258
71258
 
71259
71259
  // src/utils/workloadContext.ts
@@ -71275,7 +71275,7 @@ function getUserAgent() {
71275
71275
  const clientApp = process.env.UR_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}` : "";
71276
71276
  const workload = getWorkload();
71277
71277
  const workloadSuffix = workload ? `, workload/${workload}` : "";
71278
- return `ur-cli/${"1.43.6"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
71278
+ return `ur-cli/${"1.44.0"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
71279
71279
  }
71280
71280
  function getMCPUserAgent() {
71281
71281
  const parts = [];
@@ -71289,7 +71289,7 @@ function getMCPUserAgent() {
71289
71289
  parts.push(`client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}`);
71290
71290
  }
71291
71291
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
71292
- return `ur/${"1.43.6"}${suffix}`;
71292
+ return `ur/${"1.44.0"}${suffix}`;
71293
71293
  }
71294
71294
  function getWebFetchUserAgent() {
71295
71295
  return `UR-User (${getURCodeUserAgent()})`;
@@ -71427,7 +71427,7 @@ var init_user = __esm(() => {
71427
71427
  deviceId,
71428
71428
  sessionId: getSessionId(),
71429
71429
  email: getEmail(),
71430
- appVersion: "1.43.6",
71430
+ appVersion: "1.44.0",
71431
71431
  platform: getHostPlatformForAnalytics(),
71432
71432
  organizationUuid,
71433
71433
  accountUuid,
@@ -77944,7 +77944,7 @@ var init_metadata = __esm(() => {
77944
77944
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
77945
77945
  WHITESPACE_REGEX = /\s+/;
77946
77946
  getVersionBase = memoize_default(() => {
77947
- const match = "1.43.6".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
77947
+ const match = "1.44.0".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
77948
77948
  return match ? match[0] : undefined;
77949
77949
  });
77950
77950
  buildEnvContext = memoize_default(async () => {
@@ -77984,7 +77984,7 @@ var init_metadata = __esm(() => {
77984
77984
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
77985
77985
  isURCodeAction: isEnvTruthy(process.env.UR_CODE_ACTION),
77986
77986
  isURAiAuth: isURAISubscriber(),
77987
- version: "1.43.6",
77987
+ version: "1.44.0",
77988
77988
  versionBase: getVersionBase(),
77989
77989
  buildTime: "",
77990
77990
  deploymentEnvironment: env2.detectDeploymentEnvironment(),
@@ -78654,7 +78654,7 @@ function initialize1PEventLogging() {
78654
78654
  const platform2 = getPlatform();
78655
78655
  const attributes = {
78656
78656
  [import_semantic_conventions4.ATTR_SERVICE_NAME]: "ur",
78657
- [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.43.6"
78657
+ [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.44.0"
78658
78658
  };
78659
78659
  if (platform2 === "wsl") {
78660
78660
  const wslVersion = getWslVersion();
@@ -78681,7 +78681,7 @@ function initialize1PEventLogging() {
78681
78681
  })
78682
78682
  ]
78683
78683
  });
78684
- firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.43.6");
78684
+ firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.44.0");
78685
78685
  }
78686
78686
  async function reinitialize1PEventLoggingIfConfigChanged() {
78687
78687
  if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
@@ -81311,6 +81311,9 @@ var init_types2 = __esm(() => {
81311
81311
  prefersReducedMotion: exports_external.boolean().optional().describe("Reduce or disable animations for accessibility (spinner shimmer, flash effects, etc.)"),
81312
81312
  autoMemoryEnabled: exports_external.boolean().optional().describe("Enable auto-memory for this project. When false, UR will not read from or write to the auto-memory directory."),
81313
81313
  autoMemoryDirectory: exports_external.string().optional().describe("Custom directory path for auto-memory storage. Supports ~/ prefix for home directory expansion. Ignored if set in projectSettings (checked-in .ur/settings.json) for security. When unset, defaults to ~/.ur/projects/<sanitized-cwd>/memory/."),
81314
+ verifier: exports_external.object({
81315
+ askBeforeGates: exports_external.boolean().optional().describe("When true, UR asks whether to run project verification commands (tests, typecheck, lint) after a task instead of running them automatically. Default: false.")
81316
+ }).optional().describe("Verifier behavior configuration"),
81314
81317
  autoDreamEnabled: exports_external.boolean().optional().describe("Enable background memory consolidation (auto-dream). When set, overrides the server-side default."),
81315
81318
  ollama: exports_external.object({
81316
81319
  host: exports_external.string().optional().describe("URL of the Ollama server to use (e.g. http://192.168.1.50:11434)"),
@@ -83980,7 +83983,7 @@ function formatAgentTrendReport(report = buildAgentTrendReport()) {
83980
83983
  function formatA2AAgentCard(options = {}, pretty = true) {
83981
83984
  return JSON.stringify(buildA2AAgentCard(options), null, pretty ? 2 : 0);
83982
83985
  }
83983
- var urVersion = "1.43.6", coverage, priorityRoadmap;
83986
+ var urVersion = "1.44.0", coverage, priorityRoadmap;
83984
83987
  var init_trends = __esm(() => {
83985
83988
  coverage = [
83986
83989
  {
@@ -85975,7 +85978,7 @@ function getAttributionHeader(fingerprint) {
85975
85978
  if (!isAttributionHeaderEnabled()) {
85976
85979
  return "";
85977
85980
  }
85978
- const version2 = `${"1.43.6"}.${fingerprint}`;
85981
+ const version2 = `${"1.44.0"}.${fingerprint}`;
85979
85982
  const entrypoint = process.env.UR_CODE_ENTRYPOINT ?? "unknown";
85980
85983
  const cch = "";
85981
85984
  const workload = getWorkload();
@@ -144522,16 +144525,26 @@ class Verifier {
144522
144525
  const ranBash = this.ledger.ranBash(turnId);
144523
144526
  let commands = config2 ? pickCommands(config2, modifiedFiles, ranBash, this.cwd) : null;
144524
144527
  let timeoutMs = config2?.timeoutMs;
144528
+ let autoDetected = false;
144525
144529
  if (!commands && hasNonIgnoredEdits(config2, modifiedFiles, this.cwd)) {
144526
144530
  commands = this.autoDetectedAfterEditCommands();
144527
144531
  timeoutMs = config2?.timeoutMs ?? AUTO_DETECTED_GATE_TIMEOUT_MS;
144532
+ autoDetected = true;
144528
144533
  }
144529
144534
  if (commands && commands.length > 0) {
144530
- const result = await runGateCommands(commands, this.cwd, timeoutMs);
144531
- if (!result.ok) {
144535
+ if (!askBeforeGatesEnabled() && getIsNonInteractiveSession()) {
144536
+ const result = await runGateCommands(commands, this.cwd, timeoutMs);
144537
+ if (!result.ok) {
144538
+ this.bumpRejection(turnId);
144539
+ const failed = result;
144540
+ return { ok: false, reminder: failed.reminder };
144541
+ }
144542
+ } else {
144532
144543
  this.bumpRejection(turnId);
144533
- const failed = result;
144534
- return { ok: false, reminder: failed.reminder };
144544
+ return {
144545
+ ok: false,
144546
+ reminder: buildAskBeforeGatesReminder(commands, autoDetected)
144547
+ };
144535
144548
  }
144536
144549
  }
144537
144550
  const pluginValidators = await this.pluginValidatorsPromise;
@@ -144588,6 +144601,22 @@ class Verifier {
144588
144601
  return detectProjectQualityStack(this.cwd).commands.map((command) => command.command);
144589
144602
  }
144590
144603
  }
144604
+ function askBeforeGatesEnabled() {
144605
+ try {
144606
+ return getInitialSettings().verifier?.askBeforeGates === true;
144607
+ } catch {
144608
+ return false;
144609
+ }
144610
+ }
144611
+ function buildAskBeforeGatesReminder(commands, autoDetected) {
144612
+ const label = autoDetected ? "auto-detected project verification" : "project verification";
144613
+ const list2 = commands.map((c4) => `- \`${c4}\``).join(`
144614
+ `);
144615
+ return `I have ${label} commands ready to run:
144616
+ ${list2}
144617
+
144618
+ ` + `Do not automatically run them and do not declare the task complete without the user's decision. ` + `Use AskUserQuestion to ask the user whether to run these verification commands now. ` + `If they confirm, run them with the BashTool and then report the outcome. ` + `If they decline, finish your response without running them.`;
144619
+ }
144591
144620
  function pickPluginValidators(validators3, modifiedFiles, ranBash) {
144592
144621
  return validators3.filter((v) => {
144593
144622
  if (v.when === "always")
@@ -144605,6 +144634,8 @@ function pickPluginValidators(validators3, modifiedFiles, ranBash) {
144605
144634
  var import_picomatch3, DEFAULT_MAX_REJECTIONS_PER_TURN = 3, AUTO_DETECTED_GATE_TIMEOUT_MS = 600000;
144606
144635
  var init_verifier = __esm(() => {
144607
144636
  init_envUtils();
144637
+ init_state();
144638
+ init_settings2();
144608
144639
  init_projectQuality();
144609
144640
  init_doneDetector();
144610
144641
  init_ledger();
@@ -193917,7 +193948,7 @@ function getTelemetryAttributes() {
193917
193948
  attributes["session.id"] = sessionId;
193918
193949
  }
193919
193950
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
193920
- attributes["app.version"] = "1.43.6";
193951
+ attributes["app.version"] = "1.44.0";
193921
193952
  }
193922
193953
  const oauthAccount = getOauthAccountInfo();
193923
193954
  if (oauthAccount) {
@@ -229305,7 +229336,7 @@ function getInstallationEnv() {
229305
229336
  return;
229306
229337
  }
229307
229338
  function getURCodeVersion() {
229308
- return "1.43.6";
229339
+ return "1.44.0";
229309
229340
  }
229310
229341
  async function getInstalledVSCodeExtensionVersion(command) {
229311
229342
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -232144,7 +232175,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
232144
232175
  const client2 = new Client({
232145
232176
  name: "ur",
232146
232177
  title: "UR",
232147
- version: "1.43.6",
232178
+ version: "1.44.0",
232148
232179
  description: "UR-Nexus autonomous engineering workflow engine",
232149
232180
  websiteUrl: PRODUCT_URL
232150
232181
  }, {
@@ -232498,7 +232529,7 @@ var init_client5 = __esm(() => {
232498
232529
  const client2 = new Client({
232499
232530
  name: "ur",
232500
232531
  title: "UR",
232501
- version: "1.43.6",
232532
+ version: "1.44.0",
232502
232533
  description: "UR-Nexus autonomous engineering workflow engine",
232503
232534
  websiteUrl: PRODUCT_URL
232504
232535
  }, {
@@ -242312,9 +242343,9 @@ async function assertMinVersion() {
242312
242343
  if (false) {}
242313
242344
  try {
242314
242345
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
242315
- if (versionConfig.minVersion && lt("1.43.6", versionConfig.minVersion)) {
242346
+ if (versionConfig.minVersion && lt("1.44.0", versionConfig.minVersion)) {
242316
242347
  console.error(`
242317
- It looks like your version of UR (${"1.43.6"}) needs an update.
242348
+ It looks like your version of UR (${"1.44.0"}) needs an update.
242318
242349
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
242319
242350
 
242320
242351
  To update, please run:
@@ -242530,7 +242561,7 @@ async function installGlobalPackage(specificVersion) {
242530
242561
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
242531
242562
  logEvent("tengu_auto_updater_lock_contention", {
242532
242563
  pid: process.pid,
242533
- currentVersion: "1.43.6"
242564
+ currentVersion: "1.44.0"
242534
242565
  });
242535
242566
  return "in_progress";
242536
242567
  }
@@ -242539,7 +242570,7 @@ async function installGlobalPackage(specificVersion) {
242539
242570
  if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
242540
242571
  logError2(new Error("Windows NPM detected in WSL environment"));
242541
242572
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
242542
- currentVersion: "1.43.6"
242573
+ currentVersion: "1.44.0"
242543
242574
  });
242544
242575
  console.error(`
242545
242576
  Error: Windows NPM detected in WSL
@@ -243074,7 +243105,7 @@ function detectLinuxGlobPatternWarnings() {
243074
243105
  }
243075
243106
  async function getDoctorDiagnostic() {
243076
243107
  const installationType = await getCurrentInstallationType();
243077
- const version2 = typeof MACRO !== "undefined" ? "1.43.6" : "unknown";
243108
+ const version2 = typeof MACRO !== "undefined" ? "1.44.0" : "unknown";
243078
243109
  const installationPath = await getInstallationPath();
243079
243110
  const invokedBinary = getInvokedBinary();
243080
243111
  const multipleInstallations = await detectMultipleInstallations();
@@ -244009,8 +244040,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
244009
244040
  const maxVersion = await getMaxVersion();
244010
244041
  if (maxVersion && gt(version2, maxVersion)) {
244011
244042
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
244012
- if (gte("1.43.6", maxVersion)) {
244013
- logForDebugging(`Native installer: current version ${"1.43.6"} is already at or above maxVersion ${maxVersion}, skipping update`);
244043
+ if (gte("1.44.0", maxVersion)) {
244044
+ logForDebugging(`Native installer: current version ${"1.44.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
244014
244045
  logEvent("tengu_native_update_skipped_max_version", {
244015
244046
  latency_ms: Date.now() - startTime,
244016
244047
  max_version: maxVersion,
@@ -244021,7 +244052,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
244021
244052
  version2 = maxVersion;
244022
244053
  }
244023
244054
  }
244024
- if (!forceReinstall && version2 === "1.43.6" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
244055
+ if (!forceReinstall && version2 === "1.44.0" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
244025
244056
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
244026
244057
  logEvent("tengu_native_update_complete", {
244027
244058
  latency_ms: Date.now() - startTime,
@@ -301951,6 +301982,12 @@ var init_supportedSettings = __esm(() => {
301951
301982
  path: ["codeIndexAutoReindex"],
301952
301983
  description: "Automatically refresh the local semantic code index during interactive sessions"
301953
301984
  },
301985
+ "verifier.askBeforeGates": {
301986
+ source: "settings",
301987
+ type: "boolean",
301988
+ path: ["verifier", "askBeforeGates"],
301989
+ description: "Ask before running project verification commands (tests, typecheck, lint) after a task instead of running them automatically. Default: false."
301990
+ },
301954
301991
  autoDreamEnabled: {
301955
301992
  source: "settings",
301956
301993
  type: "boolean",
@@ -341012,7 +341049,7 @@ function Feedback({
341012
341049
  platform: env2.platform,
341013
341050
  gitRepo: envInfo.isGit,
341014
341051
  terminal: env2.terminal,
341015
- version: "1.43.6",
341052
+ version: "1.44.0",
341016
341053
  transcript: normalizeMessagesForAPI(messages),
341017
341054
  errors: sanitizedErrors,
341018
341055
  lastApiRequest: getLastAPIRequest(),
@@ -341204,7 +341241,7 @@ function Feedback({
341204
341241
  ", ",
341205
341242
  env2.terminal,
341206
341243
  ", v",
341207
- "1.43.6"
341244
+ "1.44.0"
341208
341245
  ]
341209
341246
  }, undefined, true, undefined, this)
341210
341247
  ]
@@ -341310,7 +341347,7 @@ ${sanitizedDescription}
341310
341347
  ` + `**Environment Info**
341311
341348
  ` + `- Platform: ${env2.platform}
341312
341349
  ` + `- Terminal: ${env2.terminal}
341313
- ` + `- Version: ${"1.43.6"}
341350
+ ` + `- Version: ${"1.44.0"}
341314
341351
  ` + `- Feedback ID: ${feedbackId}
341315
341352
  ` + `
341316
341353
  **Errors**
@@ -344421,7 +344458,7 @@ function buildPrimarySection() {
344421
344458
  }, undefined, false, undefined, this);
344422
344459
  return [{
344423
344460
  label: "Version",
344424
- value: "1.43.6"
344461
+ value: "1.44.0"
344425
344462
  }, {
344426
344463
  label: "Session name",
344427
344464
  value: nameValue
@@ -346668,6 +346705,31 @@ function Config({
346668
346705
  });
346669
346706
  }
346670
346707
  }] : [],
346708
+ {
346709
+ id: "verifierAskBeforeGates",
346710
+ label: "Ask before running verification gates",
346711
+ value: settingsData?.verifier?.askBeforeGates ?? false,
346712
+ type: "boolean",
346713
+ onChange(askBeforeGates) {
346714
+ updateSettingsForSource("userSettings", {
346715
+ verifier: {
346716
+ ...settingsData?.verifier,
346717
+ askBeforeGates
346718
+ }
346719
+ });
346720
+ setSettingsData((prev) => ({
346721
+ ...prev,
346722
+ verifier: {
346723
+ ...prev?.verifier,
346724
+ askBeforeGates
346725
+ }
346726
+ }));
346727
+ logEvent("tengu_config_changed", {
346728
+ setting: "verifierAskBeforeGates",
346729
+ value: String(askBeforeGates)
346730
+ });
346731
+ }
346732
+ },
346671
346733
  {
346672
346734
  id: "verbose",
346673
346735
  label: "Verbose output",
@@ -347182,6 +347244,9 @@ function Config({
347182
347244
  if (globalConfig2.autoInstallIdeExtension !== initialConfig.current.autoInstallIdeExtension) {
347183
347245
  formattedChanges.push(`${globalConfig2.autoInstallIdeExtension ? "Enabled" : "Disabled"} auto-install IDE extension`);
347184
347246
  }
347247
+ if (settingsData?.verifier?.askBeforeGates !== initialSettingsData.current?.verifier?.askBeforeGates) {
347248
+ formattedChanges.push(`${settingsData?.verifier?.askBeforeGates ? "Enabled" : "Disabled"} ask before running verification gates`);
347249
+ }
347185
347250
  if (globalConfig2.autoCompactEnabled !== initialConfig.current.autoCompactEnabled) {
347186
347251
  formattedChanges.push(`${globalConfig2.autoCompactEnabled ? "Enabled" : "Disabled"} auto-compact`);
347187
347252
  }
@@ -347239,6 +347304,7 @@ function Config({
347239
347304
  autoUpdatesChannel: iu?.autoUpdatesChannel,
347240
347305
  minimumVersion: iu?.minimumVersion,
347241
347306
  language: iu?.language,
347307
+ verifier: iu?.verifier,
347242
347308
  ...{},
347243
347309
  syntaxHighlightingDisabled: iu?.syntaxHighlightingDisabled,
347244
347310
  permissions: iu?.permissions === undefined ? undefined : {
@@ -347722,7 +347788,7 @@ function Config({
347722
347788
  }
347723
347789
  }, undefined, false, undefined, this)
347724
347790
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime177.jsxDEV(ChannelDowngradeDialog, {
347725
- currentVersion: "1.43.6",
347791
+ currentVersion: "1.44.0",
347726
347792
  onChoice: (choice) => {
347727
347793
  setShowSubmenu(null);
347728
347794
  setTabsHidden(false);
@@ -347734,7 +347800,7 @@ function Config({
347734
347800
  autoUpdatesChannel: "stable"
347735
347801
  };
347736
347802
  if (choice === "stay") {
347737
- newSettings.minimumVersion = "1.43.6";
347803
+ newSettings.minimumVersion = "1.44.0";
347738
347804
  }
347739
347805
  updateSettingsForSource("userSettings", newSettings);
347740
347806
  setSettingsData((prev_27) => ({
@@ -355804,7 +355870,7 @@ function HelpV2(t0) {
355804
355870
  let t6;
355805
355871
  if ($3[31] !== tabs) {
355806
355872
  t6 = /* @__PURE__ */ jsx_dev_runtime204.jsxDEV(Tabs, {
355807
- title: `UR v${"1.43.6"}`,
355873
+ title: `UR v${"1.44.0"}`,
355808
355874
  color: "professionalBlue",
355809
355875
  defaultTab: "general",
355810
355876
  children: tabs
@@ -356550,7 +356616,7 @@ function buildToolUseContext(tools, readFileStateCache) {
356550
356616
  async function handleInitialize(options2) {
356551
356617
  return {
356552
356618
  name: "UR",
356553
- version: "1.43.6",
356619
+ version: "1.44.0",
356554
356620
  protocolVersion: "0.1.0",
356555
356621
  workspaceRoot: options2.cwd,
356556
356622
  capabilities: {
@@ -376692,7 +376758,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
376692
376758
  return [];
376693
376759
  }
376694
376760
  }
376695
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.43.6") {
376761
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.44.0") {
376696
376762
  if (process.env.USER_TYPE === "ant") {
376697
376763
  const changelog = "";
376698
376764
  if (changelog) {
@@ -376719,7 +376785,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.43.6")
376719
376785
  releaseNotes
376720
376786
  };
376721
376787
  }
376722
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.43.6") {
376788
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.44.0") {
376723
376789
  if (process.env.USER_TYPE === "ant") {
376724
376790
  const changelog = "";
376725
376791
  if (changelog) {
@@ -377898,7 +377964,7 @@ function getRecentActivitySync() {
377898
377964
  return cachedActivity;
377899
377965
  }
377900
377966
  function getLogoDisplayData() {
377901
- const version2 = process.env.DEMO_VERSION ?? "1.43.6";
377967
+ const version2 = process.env.DEMO_VERSION ?? "1.44.0";
377902
377968
  const serverUrl = getDirectConnectServerUrl();
377903
377969
  const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd());
377904
377970
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -378687,7 +378753,7 @@ function LogoV2() {
378687
378753
  if ($3[2] === Symbol.for("react.memo_cache_sentinel")) {
378688
378754
  t2 = () => {
378689
378755
  const currentConfig2 = getGlobalConfig();
378690
- if (currentConfig2.lastReleaseNotesSeen === "1.43.6") {
378756
+ if (currentConfig2.lastReleaseNotesSeen === "1.44.0") {
378691
378757
  return;
378692
378758
  }
378693
378759
  saveGlobalConfig(_temp326);
@@ -379372,12 +379438,12 @@ function LogoV2() {
379372
379438
  return t41;
379373
379439
  }
379374
379440
  function _temp326(current) {
379375
- if (current.lastReleaseNotesSeen === "1.43.6") {
379441
+ if (current.lastReleaseNotesSeen === "1.44.0") {
379376
379442
  return current;
379377
379443
  }
379378
379444
  return {
379379
379445
  ...current,
379380
- lastReleaseNotesSeen: "1.43.6"
379446
+ lastReleaseNotesSeen: "1.44.0"
379381
379447
  };
379382
379448
  }
379383
379449
  function _temp243(s_0) {
@@ -411258,7 +411324,7 @@ var init_code_index2 = __esm(() => {
411258
411324
 
411259
411325
  // node_modules/typescript/lib/typescript.js
411260
411326
  var require_typescript2 = __commonJS((exports, module) => {
411261
- var __dirname = "/sessions/friendly-inspiring-goldberg/mnt/UR-1.43.3/node_modules/typescript/lib", __filename = "/sessions/friendly-inspiring-goldberg/mnt/UR-1.43.3/node_modules/typescript/lib/typescript.js";
411327
+ var __dirname = "/Users/maith/Desktop/ur3-dev/UR-1.43.3/node_modules/typescript/lib", __filename = "/Users/maith/Desktop/ur3-dev/UR-1.43.3/node_modules/typescript/lib/typescript.js";
411262
411328
  /*! *****************************************************************************
411263
411329
  Copyright (c) Microsoft Corporation. All rights reserved.
411264
411330
  Licensed under the Apache License, Version 2.0 (the "License"); you may not use
@@ -596792,7 +596858,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
596792
596858
  smapsRollup,
596793
596859
  platform: process.platform,
596794
596860
  nodeVersion: process.version,
596795
- ccVersion: "1.43.6"
596861
+ ccVersion: "1.44.0"
596796
596862
  };
596797
596863
  }
596798
596864
  async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
@@ -597378,7 +597444,7 @@ var init_bridge_kick = __esm(() => {
597378
597444
  var call137 = async () => {
597379
597445
  return {
597380
597446
  type: "text",
597381
- value: "1.43.6"
597447
+ value: "1.44.0"
597382
597448
  };
597383
597449
  }, version2, version_default;
597384
597450
  var init_version = __esm(() => {
@@ -607471,7 +607537,7 @@ function generateHtmlReport(data, insights) {
607471
607537
  </html>`;
607472
607538
  }
607473
607539
  function buildExportData(data, insights, facets, remoteStats) {
607474
- const version3 = typeof MACRO !== "undefined" ? "1.43.6" : "unknown";
607540
+ const version3 = typeof MACRO !== "undefined" ? "1.44.0" : "unknown";
607475
607541
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
607476
607542
  const facets_summary = {
607477
607543
  total: facets.size,
@@ -611751,7 +611817,7 @@ var init_sessionStorage = __esm(() => {
611751
611817
  init_settings2();
611752
611818
  init_slowOperations();
611753
611819
  init_uuid();
611754
- VERSION5 = typeof MACRO !== "undefined" ? "1.43.6" : "unknown";
611820
+ VERSION5 = typeof MACRO !== "undefined" ? "1.44.0" : "unknown";
611755
611821
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
611756
611822
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
611757
611823
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -612956,7 +613022,7 @@ var init_filesystem = __esm(() => {
612956
613022
  });
612957
613023
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
612958
613024
  const nonce = randomBytes18(16).toString("hex");
612959
- return join202(getURTempDir(), "bundled-skills", "1.43.6", nonce);
613025
+ return join202(getURTempDir(), "bundled-skills", "1.44.0", nonce);
612960
613026
  });
612961
613027
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
612962
613028
  });
@@ -618383,7 +618449,9 @@ function getSimpleDoingTasksSection() {
618383
618449
  `Default to writing no comments. Only add one when the WHY is non-obvious: a hidden constraint, a subtle invariant, a workaround for a specific bug, behavior that would surprise a reader. If removing the comment wouldn't confuse a future reader, don't write it.`,
618384
618450
  `Don't explain WHAT the code does, since well-named identifiers already do that. Don't reference the current task, fix, or callers ("used by X", "added for the Y flow", "handles the case from issue #123"), since those belong in the PR description and rot as the codebase evolves.`,
618385
618451
  `Don't remove existing comments unless you're removing the code they describe or you know they're wrong. A comment that looks pointless to you may encode a constraint or a lesson from a past bug that isn't visible in the current diff.`,
618386
- `Before reporting a task complete, verify it actually works: run the test, execute the script, check the output. Minimum complexity means no gold-plating, not skipping the finish line. If you can't verify (no test exists, can't run the code), say so explicitly rather than claiming success.`
618452
+ `When you finish the substantive work of a task, do not automatically run the full project test suite. Instead, use AskUserQuestion to ask the user whether they want you to run the verification commands. Only run them if the user confirms. If they decline, report completion based on the verification you have already performed.`,
618453
+ `Before reporting a task complete, verify it actually works: run the test, execute the script, check the output. Minimum complexity means no gold-plating, not skipping the finish line. If you can't verify (no test exists, can't run the code), say so explicitly rather than claiming success.`,
618454
+ `When the task is fully complete and you have delivered your final response, stop. Do not continue with additional thinking turns, empty responses, or further tool calls unless the user asks for something new.`
618387
618455
  ];
618388
618456
  const userHelpSubitems = [
618389
618457
  `/help: Get help with using UR`,
@@ -619245,7 +619313,7 @@ function computeFingerprint(messageText2, version3) {
619245
619313
  }
619246
619314
  function computeFingerprintFromMessages(messages) {
619247
619315
  const firstMessageText = extractFirstMessageText(messages);
619248
- return computeFingerprint(firstMessageText, "1.43.6");
619316
+ return computeFingerprint(firstMessageText, "1.44.0");
619249
619317
  }
619250
619318
  var FINGERPRINT_SALT = "59cf53e54c78";
619251
619319
  var init_fingerprint = () => {};
@@ -621119,7 +621187,7 @@ async function sideQuery(opts) {
621119
621187
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
621120
621188
  }
621121
621189
  const messageText2 = extractFirstUserMessageText(messages);
621122
- const fingerprint2 = computeFingerprint(messageText2, "1.43.6");
621190
+ const fingerprint2 = computeFingerprint(messageText2, "1.44.0");
621123
621191
  const attributionHeader = getAttributionHeader(fingerprint2);
621124
621192
  const systemBlocks = [
621125
621193
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -625856,7 +625924,7 @@ function buildSystemInitMessage(inputs) {
625856
625924
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
625857
625925
  apiKeySource: getURHQApiKeyWithSource().source,
625858
625926
  betas: getSdkBetas(),
625859
- ur_version: "1.43.6",
625927
+ ur_version: "1.44.0",
625860
625928
  output_style: outputStyle2,
625861
625929
  agents: inputs.agents.map((agent) => agent.agentType),
625862
625930
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
@@ -640484,7 +640552,7 @@ var init_useVoiceEnabled = __esm(() => {
640484
640552
  function getSemverPart(version3) {
640485
640553
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
640486
640554
  }
640487
- function useUpdateNotification(updatedVersion, initialVersion = "1.43.6") {
640555
+ function useUpdateNotification(updatedVersion, initialVersion = "1.44.0") {
640488
640556
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react226.useState(() => getSemverPart(initialVersion));
640489
640557
  if (!updatedVersion) {
640490
640558
  return null;
@@ -640533,7 +640601,7 @@ function AutoUpdater({
640533
640601
  return;
640534
640602
  }
640535
640603
  if (false) {}
640536
- const currentVersion = "1.43.6";
640604
+ const currentVersion = "1.44.0";
640537
640605
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
640538
640606
  let latestVersion = await getLatestVersion(channel);
640539
640607
  const isDisabled = isAutoUpdaterDisabled();
@@ -640762,12 +640830,12 @@ function NativeAutoUpdater({
640762
640830
  logEvent("tengu_native_auto_updater_start", {});
640763
640831
  try {
640764
640832
  const maxVersion = await getMaxVersion();
640765
- if (maxVersion && gt("1.43.6", maxVersion)) {
640833
+ if (maxVersion && gt("1.44.0", maxVersion)) {
640766
640834
  const msg = await getMaxVersionMessage();
640767
640835
  setMaxVersionIssue(msg ?? "affects your version");
640768
640836
  }
640769
640837
  const result = await installLatest(channel);
640770
- const currentVersion = "1.43.6";
640838
+ const currentVersion = "1.44.0";
640771
640839
  const latencyMs = Date.now() - startTime;
640772
640840
  if (result.lockFailed) {
640773
640841
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -640904,17 +640972,17 @@ function PackageManagerAutoUpdater(t0) {
640904
640972
  const maxVersion = await getMaxVersion();
640905
640973
  if (maxVersion && latest && gt(latest, maxVersion)) {
640906
640974
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
640907
- if (gte("1.43.6", maxVersion)) {
640908
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.43.6"} is already at or above maxVersion ${maxVersion}, skipping update`);
640975
+ if (gte("1.44.0", maxVersion)) {
640976
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.44.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
640909
640977
  setUpdateAvailable(false);
640910
640978
  return;
640911
640979
  }
640912
640980
  latest = maxVersion;
640913
640981
  }
640914
- const hasUpdate = latest && !gte("1.43.6", latest) && !shouldSkipVersion(latest);
640982
+ const hasUpdate = latest && !gte("1.44.0", latest) && !shouldSkipVersion(latest);
640915
640983
  setUpdateAvailable(!!hasUpdate);
640916
640984
  if (hasUpdate) {
640917
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.43.6"} -> ${latest}`);
640985
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.44.0"} -> ${latest}`);
640918
640986
  }
640919
640987
  };
640920
640988
  $3[0] = t1;
@@ -640948,7 +641016,7 @@ function PackageManagerAutoUpdater(t0) {
640948
641016
  wrap: "truncate",
640949
641017
  children: [
640950
641018
  "currentVersion: ",
640951
- "1.43.6"
641019
+ "1.44.0"
640952
641020
  ]
640953
641021
  }, undefined, true, undefined, this);
640954
641022
  $3[3] = verbose;
@@ -653400,7 +653468,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
653400
653468
  project_dir: getOriginalCwd(),
653401
653469
  added_dirs: addedDirs
653402
653470
  },
653403
- version: "1.43.6",
653471
+ version: "1.44.0",
653404
653472
  output_style: {
653405
653473
  name: outputStyleName
653406
653474
  },
@@ -653483,7 +653551,7 @@ function StatusLineInner({
653483
653551
  const taskValues = Object.values(tasks2);
653484
653552
  const taskRunningCount = taskValues.filter((task2) => task2.status === "running" || task2.status === "pending").length;
653485
653553
  const defaultStatusLineText = buildDefaultStatusBar({
653486
- version: "1.43.6",
653554
+ version: "1.44.0",
653487
653555
  providerLabel: providerRuntime.providerLabel,
653488
653556
  authMode: providerRuntime.authLabel,
653489
653557
  model: providerRuntime.model ?? renderModelName(mainLoopModel),
@@ -664971,7 +665039,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
664971
665039
  } catch {}
664972
665040
  const data = {
664973
665041
  trigger: trigger2,
664974
- version: "1.43.6",
665042
+ version: "1.44.0",
664975
665043
  platform: process.platform,
664976
665044
  transcript,
664977
665045
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -676856,7 +676924,7 @@ function WelcomeV2() {
676856
676924
  dimColor: true,
676857
676925
  children: [
676858
676926
  "v",
676859
- "1.43.6"
676927
+ "1.44.0"
676860
676928
  ]
676861
676929
  }, undefined, true, undefined, this)
676862
676930
  ]
@@ -678116,7 +678184,7 @@ function completeOnboarding() {
678116
678184
  saveGlobalConfig((current) => ({
678117
678185
  ...current,
678118
678186
  hasCompletedOnboarding: true,
678119
- lastOnboardingVersion: "1.43.6"
678187
+ lastOnboardingVersion: "1.44.0"
678120
678188
  }));
678121
678189
  }
678122
678190
  function showDialog(root2, renderer) {
@@ -683153,7 +683221,7 @@ function appendToLog(path24, message) {
683153
683221
  cwd: getFsImplementation().cwd(),
683154
683222
  userType: process.env.USER_TYPE,
683155
683223
  sessionId: getSessionId(),
683156
- version: "1.43.6"
683224
+ version: "1.44.0"
683157
683225
  };
683158
683226
  getLogWriter(path24).write(messageWithTimestamp);
683159
683227
  }
@@ -687247,8 +687315,8 @@ async function getEnvLessBridgeConfig() {
687247
687315
  }
687248
687316
  async function checkEnvLessBridgeMinVersion() {
687249
687317
  const cfg = await getEnvLessBridgeConfig();
687250
- if (cfg.min_version && lt("1.43.6", cfg.min_version)) {
687251
- return `Your version of UR (${"1.43.6"}) is too old for Remote Control.
687318
+ if (cfg.min_version && lt("1.44.0", cfg.min_version)) {
687319
+ return `Your version of UR (${"1.44.0"}) is too old for Remote Control.
687252
687320
  Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
687253
687321
  }
687254
687322
  return null;
@@ -687722,7 +687790,7 @@ async function initBridgeCore(params) {
687722
687790
  const rawApi = createBridgeApiClient({
687723
687791
  baseUrl,
687724
687792
  getAccessToken,
687725
- runnerVersion: "1.43.6",
687793
+ runnerVersion: "1.44.0",
687726
687794
  onDebug: logForDebugging,
687727
687795
  onAuth401,
687728
687796
  getTrustedDeviceToken
@@ -693404,7 +693472,7 @@ async function startMCPServer(cwd3, debug2, verbose) {
693404
693472
  setCwd(cwd3);
693405
693473
  const server2 = new Server({
693406
693474
  name: "ur/tengu",
693407
- version: "1.43.6"
693475
+ version: "1.44.0"
693408
693476
  }, {
693409
693477
  capabilities: {
693410
693478
  tools: {}
@@ -695446,7 +695514,7 @@ async function update() {
695446
695514
  logEvent("tengu_update_check", {});
695447
695515
  const diagnostic = await getDoctorDiagnostic();
695448
695516
  const result = await checkUpgradeStatus({
695449
- currentVersion: "1.43.6",
695517
+ currentVersion: "1.44.0",
695450
695518
  packageName: UR_AGENT_PACKAGE_NAME,
695451
695519
  installationType: diagnostic.installationType,
695452
695520
  latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
@@ -696692,7 +696760,7 @@ ${customInstructions}` : customInstructions;
696692
696760
  }
696693
696761
  }
696694
696762
  logForDiagnosticsNoPII("info", "started", {
696695
- version: "1.43.6",
696763
+ version: "1.44.0",
696696
696764
  is_native_binary: isInBundledMode()
696697
696765
  });
696698
696766
  registerCleanup(async () => {
@@ -697478,7 +697546,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
697478
697546
  pendingHookMessages
697479
697547
  }, renderAndRun);
697480
697548
  }
697481
- }).version("1.43.6 (UR-Nexus)", "-v, --version", "Output the version number");
697549
+ }).version("1.44.0 (UR-Nexus)", "-v, --version", "Output the version number");
697482
697550
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
697483
697551
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
697484
697552
  if (canUserConfigureAdvisor()) {
@@ -698393,7 +698461,7 @@ if (false) {}
698393
698461
  async function main2() {
698394
698462
  const args = process.argv.slice(2);
698395
698463
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
698396
- console.log(`${"1.43.6"} (UR-Nexus)`);
698464
+ console.log(`${"1.44.0"} (UR-Nexus)`);
698397
698465
  return;
698398
698466
  }
698399
698467
  if (args[0] === "a2a" && args[1] === "serve" && !args.includes("--help") && !args.includes("-h")) {
@@ -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.43.6</p>
47
+ <p class="eyebrow">Version 1.44.0</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>
@@ -477,6 +477,7 @@ UR_VERIFIER_MODE=loose
477
477
  UR_VERIFIER_MODE=off
478
478
  UR_VERIFIER_AUTO_SUBAGENT=1</code></pre>
479
479
  <p>L1 gates catch false done claims and loops. <code>/verify</code> manually runs deeper verification.</p>
480
+ <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>
480
481
  </article>
481
482
  <article>
482
483
  <h3>MCP and plugins</h3>
@@ -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.43.6",
5
+ "version": "1.44.0",
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.43.6",
3
+ "version": "1.44.0",
4
4
  "description": "UR-Nexus \u2014 autonomous engineering workflow engine (plan, execute, test, verify, document, benchmark, reproduce)",
5
5
  "type": "module",
6
6
  "packageManager": "bun@1.3.14",