ur-agent 1.44.5 → 1.44.8

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,11 +1,29 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.44.8
4
+
5
+ - Keep auto-memory and automatic learning on by default with explicit opt-outs.
6
+ Automatic learning can now be disabled with `automaticLearningEnabled: false`
7
+ or `UR_CODE_DISABLE_AUTO_LEARNING=1`.
8
+ - Make `/remember <text>` promote explicit notes into recallable auto-memory
9
+ topic files when auto-memory is enabled.
10
+ - Reduce recall token load by prefiltering memory candidates before the
11
+ selector model and surfacing fewer, smaller high-confidence memories.
12
+
13
+ ## 1.44.7
14
+
15
+ - Add `autoApprove` permission mode for command/tool approval prompts. It
16
+ auto-approves operations that would otherwise require permission approval,
17
+ while preserving user-input dialogs and explicit denials.
18
+ - Hide the legacy non-interactive denial mode from user-facing mode selectors.
19
+
20
+ ## 1.44.6
21
+
22
+ - Internal permission-mode iteration superseded by `1.44.7`.
23
+
3
24
  ## 1.44.5
4
25
 
5
- - Change `dontAsk` permission mode into an auto-approval mode for operations
6
- that would otherwise require manual approval. Explicit deny rules and
7
- security-policy blocks still apply.
8
- - Expose `dontAsk` in the interactive permission-mode cycle.
26
+ - Internal permission-mode iteration superseded by `1.44.6`.
9
27
 
10
28
  ## 1.44.4
11
29
 
package/README.md CHANGED
@@ -622,6 +622,8 @@ the permission boundary matters.
622
622
  - Sensitive tool actions go through permission checks by default.
623
623
  - `--allowed-tools` and `--disallowed-tools` can scope tool access for
624
624
  automation.
625
+ - `permissions.defaultMode: "autoApprove"` auto-approves operations that would
626
+ otherwise pause for permission approval, while user-input dialogs still ask.
625
627
  - `--dangerously-skip-permissions` should only be used inside disposable
626
628
  sandboxes.
627
629
  - The verifier checks for false completion claims, repeated tool-call loops,
@@ -636,6 +638,10 @@ the permission boundary matters.
636
638
  rules.
637
639
  - `ur context-pack scan` writes a repo architecture manifest from package
638
640
  scripts, instruction files, `.ur/verify.json`, and safety config.
641
+ - Auto-memory and automatic learning are enabled by default. Auto-memory can be
642
+ disabled with `autoMemoryEnabled: false`; automatic learning can be disabled
643
+ with `automaticLearningEnabled: false`. The automatic learning path writes
644
+ local JSON stats only and uses no model tokens.
639
645
  - The deep verification subagent is available through `/verify` and can be
640
646
  auto-enabled with `UR_VERIFIER_AUTO_SUBAGENT=1`.
641
647
  - UR enforces permission and sandbox policy before running UR Bash/File
package/dist/cli.js CHANGED
@@ -71438,7 +71438,7 @@ var init_auth = __esm(() => {
71438
71438
 
71439
71439
  // src/utils/userAgent.ts
71440
71440
  function getURCodeUserAgent() {
71441
- return `ur/${"1.44.5"}`;
71441
+ return `ur/${"1.44.8"}`;
71442
71442
  }
71443
71443
 
71444
71444
  // src/utils/workloadContext.ts
@@ -71460,7 +71460,7 @@ function getUserAgent() {
71460
71460
  const clientApp = process.env.UR_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}` : "";
71461
71461
  const workload = getWorkload();
71462
71462
  const workloadSuffix = workload ? `, workload/${workload}` : "";
71463
- return `ur-cli/${"1.44.5"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
71463
+ return `ur-cli/${"1.44.8"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
71464
71464
  }
71465
71465
  function getMCPUserAgent() {
71466
71466
  const parts = [];
@@ -71474,7 +71474,7 @@ function getMCPUserAgent() {
71474
71474
  parts.push(`client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}`);
71475
71475
  }
71476
71476
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
71477
- return `ur/${"1.44.5"}${suffix}`;
71477
+ return `ur/${"1.44.8"}${suffix}`;
71478
71478
  }
71479
71479
  function getWebFetchUserAgent() {
71480
71480
  return `UR-User (${getURCodeUserAgent()})`;
@@ -71612,7 +71612,7 @@ var init_user = __esm(() => {
71612
71612
  deviceId,
71613
71613
  sessionId: getSessionId(),
71614
71614
  email: getEmail(),
71615
- appVersion: "1.44.5",
71615
+ appVersion: "1.44.8",
71616
71616
  platform: getHostPlatformForAnalytics(),
71617
71617
  organizationUuid,
71618
71618
  accountUuid,
@@ -78129,7 +78129,7 @@ var init_metadata = __esm(() => {
78129
78129
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
78130
78130
  WHITESPACE_REGEX = /\s+/;
78131
78131
  getVersionBase = memoize_default(() => {
78132
- const match = "1.44.5".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
78132
+ const match = "1.44.8".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
78133
78133
  return match ? match[0] : undefined;
78134
78134
  });
78135
78135
  buildEnvContext = memoize_default(async () => {
@@ -78169,7 +78169,7 @@ var init_metadata = __esm(() => {
78169
78169
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
78170
78170
  isURCodeAction: isEnvTruthy(process.env.UR_CODE_ACTION),
78171
78171
  isURAiAuth: isURAISubscriber(),
78172
- version: "1.44.5",
78172
+ version: "1.44.8",
78173
78173
  versionBase: getVersionBase(),
78174
78174
  buildTime: "",
78175
78175
  deploymentEnvironment: env2.detectDeploymentEnvironment(),
@@ -78839,7 +78839,7 @@ function initialize1PEventLogging() {
78839
78839
  const platform2 = getPlatform();
78840
78840
  const attributes = {
78841
78841
  [import_semantic_conventions4.ATTR_SERVICE_NAME]: "ur",
78842
- [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.44.5"
78842
+ [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.44.8"
78843
78843
  };
78844
78844
  if (platform2 === "wsl") {
78845
78845
  const wslVersion = getWslVersion();
@@ -78866,7 +78866,7 @@ function initialize1PEventLogging() {
78866
78866
  })
78867
78867
  ]
78868
78868
  });
78869
- firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.44.5");
78869
+ firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.44.8");
78870
78870
  }
78871
78871
  async function reinitialize1PEventLoggingIfConfigChanged() {
78872
78872
  if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
@@ -80128,9 +80128,9 @@ var EXTERNAL_PERMISSION_MODES, INTERNAL_PERMISSION_MODES, PERMISSION_MODES;
80128
80128
  var init_permissions = __esm(() => {
80129
80129
  EXTERNAL_PERMISSION_MODES = [
80130
80130
  "acceptEdits",
80131
+ "autoApprove",
80131
80132
  "bypassPermissions",
80132
80133
  "default",
80133
- "dontAsk",
80134
80134
  "plan"
80135
80135
  ];
80136
80136
  INTERNAL_PERMISSION_MODES = [
@@ -80142,10 +80142,7 @@ var init_permissions = __esm(() => {
80142
80142
 
80143
80143
  // src/utils/permissions/PermissionMode.ts
80144
80144
  function isExternalPermissionMode(mode) {
80145
- if (process.env.USER_TYPE !== "ant") {
80146
- return true;
80147
- }
80148
- return mode !== "auto" && mode !== "bubble";
80145
+ return EXTERNAL_PERMISSION_MODES.includes(mode);
80149
80146
  }
80150
80147
  function getModeConfig(mode) {
80151
80148
  return PERMISSION_MODE_CONFIG[mode] ?? PERMISSION_MODE_CONFIG.default;
@@ -80197,6 +80194,13 @@ var init_PermissionMode = __esm(() => {
80197
80194
  color: "autoAccept",
80198
80195
  external: "acceptEdits"
80199
80196
  },
80197
+ autoApprove: {
80198
+ title: "Auto Approval",
80199
+ shortTitle: "Auto Approve",
80200
+ symbol: "\u23F5\u23F5",
80201
+ color: "warning",
80202
+ external: "autoApprove"
80203
+ },
80200
80204
  bypassPermissions: {
80201
80205
  title: "Bypass Permissions",
80202
80206
  shortTitle: "Bypass",
@@ -80206,10 +80210,10 @@ var init_PermissionMode = __esm(() => {
80206
80210
  },
80207
80211
  dontAsk: {
80208
80212
  title: "Don't Ask",
80209
- shortTitle: "Don't Ask",
80213
+ shortTitle: "DontAsk",
80210
80214
  symbol: "\u23F5\u23F5",
80211
80215
  color: "error",
80212
- external: "dontAsk"
80216
+ external: "default"
80213
80217
  },
80214
80218
  ...{}
80215
80219
  };
@@ -81497,6 +81501,7 @@ var init_types2 = __esm(() => {
81497
81501
  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."),
81498
81502
  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/."),
81499
81503
  autoMemoryExtractionInterval: exports_external.number().int().min(1).optional().describe("Run the auto-memory extraction agent only every N eligible turns (default 1 = every turn). The extraction is a forked agent call on the session model, so raising this trades memory freshness for lower token/compute usage."),
81504
+ automaticLearningEnabled: exports_external.boolean().optional().describe("Enable automatic learning from completed ci-loop, arena, escalation, and test-first outcomes. Default: true. The automatic path is a local JSON fold and uses no model calls."),
81500
81505
  verifier: exports_external.object({
81501
81506
  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.")
81502
81507
  }).optional().describe("Verifier behavior configuration"),
@@ -83400,7 +83405,16 @@ function saveStats(cwd2, stats) {
83400
83405
  writeFileSync6(statsPath(cwd2), `${JSON.stringify(stats, null, 2)}
83401
83406
  `);
83402
83407
  }
83408
+ function isAutomaticLearningEnabled() {
83409
+ if (isEnvTruthy(process.env.UR_CODE_DISABLE_AUTO_LEARNING)) {
83410
+ return false;
83411
+ }
83412
+ return getInitialSettings().automaticLearningEnabled !== false;
83413
+ }
83403
83414
  function recordOutcome(cwd2, input) {
83415
+ if (!isAutomaticLearningEnabled()) {
83416
+ return;
83417
+ }
83404
83418
  try {
83405
83419
  saveStats(cwd2, foldOutcomes(loadStats(cwd2), [outcomeFromRun(input)]));
83406
83420
  } catch {}
@@ -83500,7 +83514,9 @@ function formatLearnResult(result, json2) {
83500
83514
  }
83501
83515
  var TEST_PASS_RE, TEST_FAIL_RE;
83502
83516
  var init_learning = __esm(() => {
83517
+ init_envUtils();
83503
83518
  init_json();
83519
+ init_settings2();
83504
83520
  init_artifacts();
83505
83521
  init_headlessAgent();
83506
83522
  init_intentRouter();
@@ -84757,7 +84773,7 @@ function formatAgentTrendReport(report = buildAgentTrendReport()) {
84757
84773
  function formatA2AAgentCard(options = {}, pretty = true) {
84758
84774
  return JSON.stringify(buildA2AAgentCard(options), null, pretty ? 2 : 0);
84759
84775
  }
84760
- var urVersion = "1.44.5", coverage, priorityRoadmap;
84776
+ var urVersion = "1.44.8", coverage, priorityRoadmap;
84761
84777
  var init_trends = __esm(() => {
84762
84778
  coverage = [
84763
84779
  {
@@ -86752,7 +86768,7 @@ function getAttributionHeader(fingerprint) {
86752
86768
  if (!isAttributionHeaderEnabled()) {
86753
86769
  return "";
86754
86770
  }
86755
- const version2 = `${"1.44.5"}.${fingerprint}`;
86771
+ const version2 = `${"1.44.8"}.${fingerprint}`;
86756
86772
  const entrypoint = process.env.UR_CODE_ENTRYPOINT ?? "unknown";
86757
86773
  const cch = "";
86758
86774
  const workload = getWorkload();
@@ -194722,7 +194738,7 @@ function getTelemetryAttributes() {
194722
194738
  attributes["session.id"] = sessionId;
194723
194739
  }
194724
194740
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
194725
- attributes["app.version"] = "1.44.5";
194741
+ attributes["app.version"] = "1.44.8";
194726
194742
  }
194727
194743
  const oauthAccount = getOauthAccountInfo();
194728
194744
  if (oauthAccount) {
@@ -230110,7 +230126,7 @@ function getInstallationEnv() {
230110
230126
  return;
230111
230127
  }
230112
230128
  function getURCodeVersion() {
230113
- return "1.44.5";
230129
+ return "1.44.8";
230114
230130
  }
230115
230131
  async function getInstalledVSCodeExtensionVersion(command) {
230116
230132
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -232949,7 +232965,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
232949
232965
  const client2 = new Client({
232950
232966
  name: "ur",
232951
232967
  title: "UR",
232952
- version: "1.44.5",
232968
+ version: "1.44.8",
232953
232969
  description: "UR-Nexus autonomous engineering workflow engine",
232954
232970
  websiteUrl: PRODUCT_URL
232955
232971
  }, {
@@ -233303,7 +233319,7 @@ var init_client5 = __esm(() => {
233303
233319
  const client2 = new Client({
233304
233320
  name: "ur",
233305
233321
  title: "UR",
233306
- version: "1.44.5",
233322
+ version: "1.44.8",
233307
233323
  description: "UR-Nexus autonomous engineering workflow engine",
233308
233324
  websiteUrl: PRODUCT_URL
233309
233325
  }, {
@@ -243117,9 +243133,9 @@ async function assertMinVersion() {
243117
243133
  if (false) {}
243118
243134
  try {
243119
243135
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
243120
- if (versionConfig.minVersion && lt("1.44.5", versionConfig.minVersion)) {
243136
+ if (versionConfig.minVersion && lt("1.44.8", versionConfig.minVersion)) {
243121
243137
  console.error(`
243122
- It looks like your version of UR (${"1.44.5"}) needs an update.
243138
+ It looks like your version of UR (${"1.44.8"}) needs an update.
243123
243139
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
243124
243140
 
243125
243141
  To update, please run:
@@ -243335,7 +243351,7 @@ async function installGlobalPackage(specificVersion) {
243335
243351
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
243336
243352
  logEvent("tengu_auto_updater_lock_contention", {
243337
243353
  pid: process.pid,
243338
- currentVersion: "1.44.5"
243354
+ currentVersion: "1.44.8"
243339
243355
  });
243340
243356
  return "in_progress";
243341
243357
  }
@@ -243344,7 +243360,7 @@ async function installGlobalPackage(specificVersion) {
243344
243360
  if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
243345
243361
  logError2(new Error("Windows NPM detected in WSL environment"));
243346
243362
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
243347
- currentVersion: "1.44.5"
243363
+ currentVersion: "1.44.8"
243348
243364
  });
243349
243365
  console.error(`
243350
243366
  Error: Windows NPM detected in WSL
@@ -243879,7 +243895,7 @@ function detectLinuxGlobPatternWarnings() {
243879
243895
  }
243880
243896
  async function getDoctorDiagnostic() {
243881
243897
  const installationType = await getCurrentInstallationType();
243882
- const version2 = typeof MACRO !== "undefined" ? "1.44.5" : "unknown";
243898
+ const version2 = typeof MACRO !== "undefined" ? "1.44.8" : "unknown";
243883
243899
  const installationPath = await getInstallationPath();
243884
243900
  const invokedBinary = getInvokedBinary();
243885
243901
  const multipleInstallations = await detectMultipleInstallations();
@@ -244814,8 +244830,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
244814
244830
  const maxVersion = await getMaxVersion();
244815
244831
  if (maxVersion && gt(version2, maxVersion)) {
244816
244832
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
244817
- if (gte("1.44.5", maxVersion)) {
244818
- logForDebugging(`Native installer: current version ${"1.44.5"} is already at or above maxVersion ${maxVersion}, skipping update`);
244833
+ if (gte("1.44.8", maxVersion)) {
244834
+ logForDebugging(`Native installer: current version ${"1.44.8"} is already at or above maxVersion ${maxVersion}, skipping update`);
244819
244835
  logEvent("tengu_native_update_skipped_max_version", {
244820
244836
  latency_ms: Date.now() - startTime,
244821
244837
  max_version: maxVersion,
@@ -244826,7 +244842,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
244826
244842
  version2 = maxVersion;
244827
244843
  }
244828
244844
  }
244829
- if (!forceReinstall && version2 === "1.44.5" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
244845
+ if (!forceReinstall && version2 === "1.44.8" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
244830
244846
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
244831
244847
  logEvent("tengu_native_update_complete", {
244832
244848
  latency_ms: Date.now() - startTime,
@@ -248525,7 +248541,13 @@ var init_coreSchemas = __esm(() => {
248525
248541
  decisionClassification: PermissionDecisionClassificationSchema().optional()
248526
248542
  })
248527
248543
  ]));
248528
- PermissionModeSchema = lazySchema(() => exports_external.enum(["default", "acceptEdits", "bypassPermissions", "plan", "dontAsk"]).describe("Permission mode for controlling how tool executions are handled. " + "'default' - Standard behavior, prompts for dangerous operations. " + "'acceptEdits' - Auto-accept file edit operations. " + "'bypassPermissions' - Bypass all permission checks (requires allowDangerouslySkipPermissions). " + "'plan' - Planning mode, no actual tool execution. " + "'dontAsk' - Don't prompt for permissions, auto-approve operations that would otherwise require manual approval."));
248544
+ PermissionModeSchema = lazySchema(() => exports_external.enum([
248545
+ "default",
248546
+ "acceptEdits",
248547
+ "autoApprove",
248548
+ "bypassPermissions",
248549
+ "plan"
248550
+ ]).describe("Permission mode for controlling how tool executions are handled. " + "'default' - Standard behavior, prompts for dangerous operations. " + "'acceptEdits' - Auto-accept file edit operations. " + "'autoApprove' - Auto-approve permission prompts while preserving user-input dialogs. " + "'bypassPermissions' - Bypass all permission checks (requires allowDangerouslySkipPermissions). " + "'plan' - Planning mode, no actual tool execution."));
248529
248551
  HOOK_EVENTS2 = [
248530
248552
  "PreToolUse",
248531
248553
  "PostToolUse",
@@ -302317,6 +302339,11 @@ var init_supportedSettings = __esm(() => {
302317
302339
  type: "boolean",
302318
302340
  description: "Enable auto-memory"
302319
302341
  },
302342
+ automaticLearningEnabled: {
302343
+ source: "settings",
302344
+ type: "boolean",
302345
+ description: "Automatically learn from completed agent runs using local JSON stats"
302346
+ },
302320
302347
  "codeIndex.autoReindex": {
302321
302348
  source: "global",
302322
302349
  type: "boolean",
@@ -302397,7 +302424,7 @@ var init_supportedSettings = __esm(() => {
302397
302424
  source: "settings",
302398
302425
  type: "string",
302399
302426
  description: "Default permission mode for tool usage",
302400
- options: ["default", "plan", "acceptEdits", "dontAsk"]
302427
+ options: ["default", "plan", "acceptEdits", "autoApprove"]
302401
302428
  },
302402
302429
  language: {
302403
302430
  source: "settings",
@@ -323419,16 +323446,44 @@ function isHumanTurn(m) {
323419
323446
  }
323420
323447
 
323421
323448
  // src/memdir/findRelevantMemories.ts
323449
+ function tokenizeForMemoryRecall(text) {
323450
+ const terms = new Set;
323451
+ for (const raw of text.toLowerCase().match(/[a-z0-9][a-z0-9._/-]{2,}/g) ?? []) {
323452
+ const term = raw.replace(/^[/._-]+|[/._-]+$/g, "");
323453
+ if (term.length >= 3 && !STOP_WORDS.has(term)) {
323454
+ terms.add(term);
323455
+ }
323456
+ }
323457
+ return terms;
323458
+ }
323459
+ function scoreMemoryForQuery(queryTerms, memory) {
323460
+ const haystack = `${memory.filename} ${memory.description ?? ""} ${memory.type ?? ""}`.toLowerCase();
323461
+ let score = 0;
323462
+ for (const term of queryTerms) {
323463
+ if (haystack.includes(term)) {
323464
+ score += memory.filename.toLowerCase().includes(term) ? 3 : 1;
323465
+ }
323466
+ }
323467
+ return score;
323468
+ }
323422
323469
  async function findRelevantMemories(query2, memoryDir, signal, recentTools = [], alreadySurfaced = new Set) {
323423
323470
  const memories = (await scanMemoryFiles(memoryDir, signal)).filter((m) => !alreadySurfaced.has(m.filePath));
323424
323471
  if (memories.length === 0) {
323425
323472
  return [];
323426
323473
  }
323427
- const selectedFilenames = await selectRelevantMemories(query2, memories, signal, recentTools);
323428
- const byFilename = new Map(memories.map((m) => [m.filename, m]));
323474
+ const queryTerms = tokenizeForMemoryRecall(query2);
323475
+ if (queryTerms.size === 0) {
323476
+ return [];
323477
+ }
323478
+ const candidates2 = memories.map((memory) => ({ memory, score: scoreMemoryForQuery(queryTerms, memory) })).filter(({ score }) => score > 0).sort((a2, b) => b.score - a2.score || b.memory.mtimeMs - a2.memory.mtimeMs).slice(0, MAX_SELECTOR_CANDIDATES).map(({ memory }) => memory);
323479
+ if (candidates2.length === 0) {
323480
+ return [];
323481
+ }
323482
+ const selectedFilenames = await selectRelevantMemories(query2, candidates2, signal, recentTools);
323483
+ const byFilename = new Map(candidates2.map((m) => [m.filename, m]));
323429
323484
  const selected = selectedFilenames.map((filename) => byFilename.get(filename)).filter((m) => m !== undefined);
323430
323485
  if (false) {}
323431
- return selected.map((m) => ({ path: m.filePath, mtimeMs: m.mtimeMs }));
323486
+ return selected.slice(0, 3).map((m) => ({ path: m.filePath, mtimeMs: m.mtimeMs }));
323432
323487
  }
323433
323488
  async function selectRelevantMemories(query2, memories, signal, recentTools) {
323434
323489
  const validFilenames = new Set(memories.map((m) => m.filename));
@@ -323481,11 +323536,11 @@ ${manifest}${toolsSection}`
323481
323536
  }
323482
323537
  var SELECT_MEMORIES_SYSTEM_PROMPT = `You are selecting memories that will be useful to UR as it processes a user's query. You will be given the user's query and a list of available memory files with their filenames and descriptions.
323483
323538
 
323484
- Return a list of filenames for the memories that will clearly be useful to UR as it processes the user's query (up to 5). Only include memories that you are certain will be helpful based on their name and description.
323539
+ Return a list of filenames for the memories that will clearly be useful to UR as it processes the user's query (up to 3). Only include memories that you are certain will be helpful based on their name and description.
323485
323540
  - If you are unsure if a memory will be useful in processing the user's query, then do not include it in your list. Be selective and discerning.
323486
323541
  - If there are no memories in the list that would clearly be useful, feel free to return an empty list.
323487
323542
  - If a list of recently-used tools is provided, do not select memories that are usage reference or API documentation for those tools (UR is already exercising them). DO still select memories containing warnings, gotchas, or known issues about those tools \u2014 active use is exactly when those matter.
323488
- `;
323543
+ `, MAX_SELECTOR_CANDIDATES = 40, STOP_WORDS;
323489
323544
  var init_findRelevantMemories = __esm(() => {
323490
323545
  init_debug();
323491
323546
  init_errors();
@@ -323493,6 +323548,45 @@ var init_findRelevantMemories = __esm(() => {
323493
323548
  init_sideQuery();
323494
323549
  init_slowOperations();
323495
323550
  init_memoryScan();
323551
+ STOP_WORDS = new Set([
323552
+ "a",
323553
+ "about",
323554
+ "an",
323555
+ "and",
323556
+ "are",
323557
+ "as",
323558
+ "at",
323559
+ "be",
323560
+ "but",
323561
+ "by",
323562
+ "can",
323563
+ "do",
323564
+ "for",
323565
+ "from",
323566
+ "how",
323567
+ "i",
323568
+ "in",
323569
+ "is",
323570
+ "it",
323571
+ "me",
323572
+ "my",
323573
+ "of",
323574
+ "on",
323575
+ "or",
323576
+ "our",
323577
+ "please",
323578
+ "should",
323579
+ "that",
323580
+ "the",
323581
+ "this",
323582
+ "to",
323583
+ "use",
323584
+ "we",
323585
+ "what",
323586
+ "when",
323587
+ "with",
323588
+ "you"
323589
+ ]);
323496
323590
  });
323497
323591
 
323498
323592
  // src/utils/attachments.ts
@@ -324176,7 +324270,7 @@ async function getRelevantMemoryAttachments(input, agents, readFileState, recent
324176
324270
  });
324177
324271
  const dirs = memoryDirs.length > 0 ? memoryDirs : [getAutoMemPath()];
324178
324272
  const allResults = await Promise.all(dirs.map((dir) => findRelevantMemories(input, dir, signal, recentTools, alreadySurfaced).catch(() => [])));
324179
- const selected = allResults.flat().filter((m) => !readFileState.has(m.path) && !alreadySurfaced.has(m.path)).slice(0, 5);
324273
+ const selected = allResults.flat().filter((m) => !readFileState.has(m.path) && !alreadySurfaced.has(m.path)).slice(0, 3);
324180
324274
  const memories = await readMemoriesForSurfacing(selected, signal);
324181
324275
  if (memories.length === 0) {
324182
324276
  return [];
@@ -325045,7 +325139,7 @@ function isFileReadDenied(filePath, toolPermissionContext) {
325045
325139
  const denyRule = matchingRuleForInput(filePath, toolPermissionContext, "read", "deny");
325046
325140
  return denyRule !== null;
325047
325141
  }
325048
- var BRIEF_TOOL_NAME3 = null, TODO_REMINDER_CONFIG, PLAN_MODE_ATTACHMENT_CONFIG, MAX_MEMORY_LINES = 200, MAX_MEMORY_BYTES = 4096, RELEVANT_MEMORIES_CONFIG, VERIFY_PLAN_REMINDER_CONFIG, INLINE_NOTIFICATION_MODES, sentSkillNames, suppressNext = false;
325142
+ var BRIEF_TOOL_NAME3 = null, TODO_REMINDER_CONFIG, PLAN_MODE_ATTACHMENT_CONFIG, MAX_MEMORY_LINES = 120, MAX_MEMORY_BYTES = 2048, RELEVANT_MEMORIES_CONFIG, VERIFY_PLAN_REMINDER_CONFIG, INLINE_NOTIFICATION_MODES, sentSkillNames, suppressNext = false;
325049
325143
  var init_attachments2 = __esm(() => {
325050
325144
  init_analytics();
325051
325145
  init_Tool();
@@ -325126,7 +325220,7 @@ var init_attachments2 = __esm(() => {
325126
325220
  FULL_REMINDER_EVERY_N_ATTACHMENTS: 5
325127
325221
  };
325128
325222
  RELEVANT_MEMORIES_CONFIG = {
325129
- MAX_SESSION_BYTES: 60 * 1024
325223
+ MAX_SESSION_BYTES: 24 * 1024
325130
325224
  };
325131
325225
  VERIFY_PLAN_REMINDER_CONFIG = {
325132
325226
  TURNS_BETWEEN_REMINDERS: 10
@@ -330543,6 +330637,9 @@ function withMemoryCorrectionHint(message) {
330543
330637
  function AUTO_REJECT_MESSAGE(toolName) {
330544
330638
  return `Permission to use ${toolName} has been denied. ${DENIAL_WORKAROUND_GUIDANCE}`;
330545
330639
  }
330640
+ function DONT_ASK_REJECT_MESSAGE(toolName) {
330641
+ return `Permission to use ${toolName} has been denied because UR is running in don't ask mode. ${DENIAL_WORKAROUND_GUIDANCE}`;
330642
+ }
330546
330643
  function isSyntheticMessage(message) {
330547
330644
  return message.type !== "progress" && message.type !== "attachment" && message.type !== "system" && Array.isArray(message.message.content) && message.message.content[0]?.type === "text" && SYNTHETIC_MESSAGES.has(message.message.content[0].text);
330548
330645
  }
@@ -335734,12 +335831,25 @@ var CLASSIFIER_FAIL_CLOSED_REFRESH_MS, PERMISSION_RULE_SOURCES, hasPermissionsTo
335734
335831
  if (result.behavior === "ask") {
335735
335832
  const appState = context3.getAppState();
335736
335833
  if (appState.toolPermissionContext.mode === "dontAsk") {
335834
+ return {
335835
+ behavior: "deny",
335836
+ decisionReason: {
335837
+ type: "mode",
335838
+ mode: "dontAsk"
335839
+ },
335840
+ message: DONT_ASK_REJECT_MESSAGE(tool.name)
335841
+ };
335842
+ }
335843
+ if (appState.toolPermissionContext.mode === "autoApprove") {
335844
+ if (tool.requiresUserInteraction?.()) {
335845
+ return result;
335846
+ }
335737
335847
  return {
335738
335848
  behavior: "allow",
335739
335849
  updatedInput: input,
335740
335850
  decisionReason: {
335741
335851
  type: "mode",
335742
- mode: "dontAsk"
335852
+ mode: "autoApprove"
335743
335853
  }
335744
335854
  };
335745
335855
  }
@@ -341497,7 +341607,7 @@ function Feedback({
341497
341607
  platform: env2.platform,
341498
341608
  gitRepo: envInfo.isGit,
341499
341609
  terminal: env2.terminal,
341500
- version: "1.44.5",
341610
+ version: "1.44.8",
341501
341611
  transcript: normalizeMessagesForAPI(messages),
341502
341612
  errors: sanitizedErrors,
341503
341613
  lastApiRequest: getLastAPIRequest(),
@@ -341689,7 +341799,7 @@ function Feedback({
341689
341799
  ", ",
341690
341800
  env2.terminal,
341691
341801
  ", v",
341692
- "1.44.5"
341802
+ "1.44.8"
341693
341803
  ]
341694
341804
  }, undefined, true, undefined, this)
341695
341805
  ]
@@ -341795,7 +341905,7 @@ ${sanitizedDescription}
341795
341905
  ` + `**Environment Info**
341796
341906
  ` + `- Platform: ${env2.platform}
341797
341907
  ` + `- Terminal: ${env2.terminal}
341798
- ` + `- Version: ${"1.44.5"}
341908
+ ` + `- Version: ${"1.44.8"}
341799
341909
  ` + `- Feedback ID: ${feedbackId}
341800
341910
  ` + `
341801
341911
  **Errors**
@@ -344906,7 +345016,7 @@ function buildPrimarySection() {
344906
345016
  }, undefined, false, undefined, this);
344907
345017
  return [{
344908
345018
  label: "Version",
344909
- value: "1.44.5"
345019
+ value: "1.44.8"
344910
345020
  }, {
344911
345021
  label: "Session name",
344912
345022
  value: nameValue
@@ -348236,7 +348346,7 @@ function Config({
348236
348346
  }
348237
348347
  }, undefined, false, undefined, this)
348238
348348
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime176.jsxDEV(ChannelDowngradeDialog, {
348239
- currentVersion: "1.44.5",
348349
+ currentVersion: "1.44.8",
348240
348350
  onChoice: (choice) => {
348241
348351
  setShowSubmenu(null);
348242
348352
  setTabsHidden(false);
@@ -348248,7 +348358,7 @@ function Config({
348248
348358
  autoUpdatesChannel: "stable"
348249
348359
  };
348250
348360
  if (choice === "stay") {
348251
- newSettings.minimumVersion = "1.44.5";
348361
+ newSettings.minimumVersion = "1.44.8";
348252
348362
  }
348253
348363
  updateSettingsForSource("userSettings", newSettings);
348254
348364
  setSettingsData((prev_27) => ({
@@ -356318,7 +356428,7 @@ function HelpV2(t0) {
356318
356428
  let t6;
356319
356429
  if ($3[31] !== tabs) {
356320
356430
  t6 = /* @__PURE__ */ jsx_dev_runtime203.jsxDEV(Tabs, {
356321
- title: `UR v${"1.44.5"}`,
356431
+ title: `UR v${"1.44.8"}`,
356322
356432
  color: "professionalBlue",
356323
356433
  defaultTab: "general",
356324
356434
  children: tabs
@@ -357064,7 +357174,7 @@ function buildToolUseContext(tools, readFileStateCache) {
357064
357174
  async function handleInitialize(options2) {
357065
357175
  return {
357066
357176
  name: "UR",
357067
- version: "1.44.5",
357177
+ version: "1.44.8",
357068
357178
  protocolVersion: "0.1.0",
357069
357179
  workspaceRoot: options2.cwd,
357070
357180
  capabilities: {
@@ -377206,7 +377316,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
377206
377316
  return [];
377207
377317
  }
377208
377318
  }
377209
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.44.5") {
377319
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.44.8") {
377210
377320
  if (process.env.USER_TYPE === "ant") {
377211
377321
  const changelog = "";
377212
377322
  if (changelog) {
@@ -377233,7 +377343,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.44.5")
377233
377343
  releaseNotes
377234
377344
  };
377235
377345
  }
377236
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.44.5") {
377346
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.44.8") {
377237
377347
  if (process.env.USER_TYPE === "ant") {
377238
377348
  const changelog = "";
377239
377349
  if (changelog) {
@@ -378412,7 +378522,7 @@ function getRecentActivitySync() {
378412
378522
  return cachedActivity;
378413
378523
  }
378414
378524
  function getLogoDisplayData() {
378415
- const version2 = process.env.DEMO_VERSION ?? "1.44.5";
378525
+ const version2 = process.env.DEMO_VERSION ?? "1.44.8";
378416
378526
  const serverUrl = getDirectConnectServerUrl();
378417
378527
  const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd());
378418
378528
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -379201,7 +379311,7 @@ function LogoV2() {
379201
379311
  if ($3[2] === Symbol.for("react.memo_cache_sentinel")) {
379202
379312
  t2 = () => {
379203
379313
  const currentConfig2 = getGlobalConfig();
379204
- if (currentConfig2.lastReleaseNotesSeen === "1.44.5") {
379314
+ if (currentConfig2.lastReleaseNotesSeen === "1.44.8") {
379205
379315
  return;
379206
379316
  }
379207
379317
  saveGlobalConfig(_temp326);
@@ -379886,12 +379996,12 @@ function LogoV2() {
379886
379996
  return t41;
379887
379997
  }
379888
379998
  function _temp326(current) {
379889
- if (current.lastReleaseNotesSeen === "1.44.5") {
379999
+ if (current.lastReleaseNotesSeen === "1.44.8") {
379890
380000
  return current;
379891
380001
  }
379892
380002
  return {
379893
380003
  ...current,
379894
- lastReleaseNotesSeen: "1.44.5"
380004
+ lastReleaseNotesSeen: "1.44.8"
379895
380005
  };
379896
380006
  }
379897
380007
  function _temp241(s_0) {
@@ -410312,6 +410422,7 @@ var init_project2 = __esm(() => {
410312
410422
  });
410313
410423
 
410314
410424
  // src/ur/notes.ts
410425
+ import { createHash as createHash25 } from "crypto";
410315
410426
  import { appendFileSync as appendFileSync5, existsSync as existsSync50, mkdirSync as mkdirSync43, readFileSync as readFileSync56, writeFileSync as writeFileSync42 } from "fs";
410316
410427
  import { dirname as dirname62, join as join173 } from "path";
410317
410428
  function readJsonl(file2) {
@@ -410333,6 +410444,58 @@ function append2(file2, rec) {
410333
410444
  `);
410334
410445
  } catch {}
410335
410446
  }
410447
+ function memorySlug(text) {
410448
+ const words = text.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").split("-").filter(Boolean).slice(0, 8).join("-");
410449
+ const hash2 = createHash25("sha1").update(text).digest("hex").slice(0, 8);
410450
+ return `${words || "remembered-note"}-${hash2}`;
410451
+ }
410452
+ function yamlSingleQuote(value) {
410453
+ return `'${value.replaceAll("'", "''")}'`;
410454
+ }
410455
+ function oneLine(text, max2 = 140) {
410456
+ const normalized = text.replace(/\s+/g, " ").trim();
410457
+ return normalized.length <= max2 ? normalized : `${normalized.slice(0, max2 - 1)}\u2026`;
410458
+ }
410459
+ function rememberInAutoMemory(memoryDir, text) {
410460
+ const trimmed = text.trim();
410461
+ if (!trimmed)
410462
+ return null;
410463
+ try {
410464
+ mkdirSync43(memoryDir, { recursive: true });
410465
+ const slug4 = memorySlug(trimmed);
410466
+ const fileName = `${slug4}.md`;
410467
+ const filePath = join173(memoryDir, fileName);
410468
+ const description = oneLine(trimmed);
410469
+ const now7 = new Date().toISOString();
410470
+ writeFileSync42(filePath, [
410471
+ "---",
410472
+ `name: ${yamlSingleQuote(description)}`,
410473
+ `description: ${yamlSingleQuote(description)}`,
410474
+ "type: feedback",
410475
+ "---",
410476
+ "",
410477
+ "# Remembered note",
410478
+ "",
410479
+ trimmed,
410480
+ "",
410481
+ `Saved: ${now7}`,
410482
+ ""
410483
+ ].join(`
410484
+ `));
410485
+ const indexPath3 = join173(memoryDir, "MEMORY.md");
410486
+ const indexLine = `- [Remembered note](${fileName}) \u2014 ${description}`;
410487
+ const existing2 = existsSync50(indexPath3) ? readFileSync56(indexPath3, "utf8") : "";
410488
+ if (!existing2.includes(`](${fileName})`)) {
410489
+ const prefix = existing2.trimEnd();
410490
+ writeFileSync42(indexPath3, `${prefix ? `${prefix}
410491
+ ` : ""}${indexLine}
410492
+ `);
410493
+ }
410494
+ return filePath;
410495
+ } catch {
410496
+ return null;
410497
+ }
410498
+ }
410336
410499
  function remember(cwd2, text) {
410337
410500
  append2(memFile(cwd2), { ts: new Date().toISOString(), text, kind: "note" });
410338
410501
  }
@@ -410376,9 +410539,13 @@ var call93 = async (args) => {
410376
410539
  `) : "no memory notes yet" };
410377
410540
  }
410378
410541
  remember(getCwd(), text);
410542
+ if (isAutoMemoryEnabled()) {
410543
+ rememberInAutoMemory(getAutoMemPath(), text);
410544
+ }
410379
410545
  return { type: "text", value: `remembered: ${text}` };
410380
410546
  };
410381
410547
  var init_remember = __esm(() => {
410548
+ init_paths();
410382
410549
  init_cwd2();
410383
410550
  init_notes();
410384
410551
  });
@@ -596846,7 +597013,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
596846
597013
  smapsRollup,
596847
597014
  platform: process.platform,
596848
597015
  nodeVersion: process.version,
596849
- ccVersion: "1.44.5"
597016
+ ccVersion: "1.44.8"
596850
597017
  };
596851
597018
  }
596852
597019
  async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
@@ -597432,7 +597599,7 @@ var init_bridge_kick = __esm(() => {
597432
597599
  var call138 = async () => {
597433
597600
  return {
597434
597601
  type: "text",
597435
- value: "1.44.5"
597602
+ value: "1.44.8"
597436
597603
  };
597437
597604
  }, version2, version_default;
597438
597605
  var init_version = __esm(() => {
@@ -607525,7 +607692,7 @@ function generateHtmlReport(data, insights) {
607525
607692
  </html>`;
607526
607693
  }
607527
607694
  function buildExportData(data, insights, facets, remoteStats) {
607528
- const version3 = typeof MACRO !== "undefined" ? "1.44.5" : "unknown";
607695
+ const version3 = typeof MACRO !== "undefined" ? "1.44.8" : "unknown";
607529
607696
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
607530
607697
  const facets_summary = {
607531
607698
  total: facets.size,
@@ -611807,7 +611974,7 @@ var init_sessionStorage = __esm(() => {
611807
611974
  init_settings2();
611808
611975
  init_slowOperations();
611809
611976
  init_uuid();
611810
- VERSION5 = typeof MACRO !== "undefined" ? "1.44.5" : "unknown";
611977
+ VERSION5 = typeof MACRO !== "undefined" ? "1.44.8" : "unknown";
611811
611978
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
611812
611979
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
611813
611980
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -613012,7 +613179,7 @@ var init_filesystem = __esm(() => {
613012
613179
  });
613013
613180
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
613014
613181
  const nonce = randomBytes18(16).toString("hex");
613015
- return join202(getURTempDir(), "bundled-skills", "1.44.5", nonce);
613182
+ return join202(getURTempDir(), "bundled-skills", "1.44.8", nonce);
613016
613183
  });
613017
613184
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
613018
613185
  });
@@ -618860,7 +619027,7 @@ var init_prompts4 = __esm(() => {
618860
619027
  });
618861
619028
 
618862
619029
  // src/utils/api.ts
618863
- import { createHash as createHash25 } from "crypto";
619030
+ import { createHash as createHash26 } from "crypto";
618864
619031
  function filterSwarmFieldsFromSchema(toolName, schema) {
618865
619032
  const fieldsToRemove = SWARM_FIELDS_BY_TOOL[toolName];
618866
619033
  if (!fieldsToRemove || fieldsToRemove.length === 0) {
@@ -618950,7 +619117,7 @@ function logAPIPrefix(systemPrompt) {
618950
619117
  logEvent("tengu_sysprompt_block", {
618951
619118
  snippet: firstSystemPrompt?.slice(0, 20),
618952
619119
  length: firstSystemPrompt?.length ?? 0,
618953
- hash: firstSystemPrompt ? createHash25("sha256").update(firstSystemPrompt).digest("hex") : ""
619120
+ hash: firstSystemPrompt ? createHash26("sha256").update(firstSystemPrompt).digest("hex") : ""
618954
619121
  });
618955
619122
  }
618956
619123
  function splitSysPromptPrefix(systemPrompt, options2) {
@@ -619276,7 +619443,7 @@ var init_api3 = __esm(() => {
619276
619443
  });
619277
619444
 
619278
619445
  // src/utils/fingerprint.ts
619279
- import { createHash as createHash26 } from "crypto";
619446
+ import { createHash as createHash27 } from "crypto";
619280
619447
  function extractFirstMessageText(messages) {
619281
619448
  const firstUserMessage = messages.find((msg) => msg.type === "user");
619282
619449
  if (!firstUserMessage) {
@@ -619298,12 +619465,12 @@ function computeFingerprint(messageText2, version3) {
619298
619465
  const indices = [4, 7, 20];
619299
619466
  const chars = indices.map((i3) => messageText2[i3] || "0").join("");
619300
619467
  const fingerprintInput = `${FINGERPRINT_SALT}${chars}${version3}`;
619301
- const hash2 = createHash26("sha256").update(fingerprintInput).digest("hex");
619468
+ const hash2 = createHash27("sha256").update(fingerprintInput).digest("hex");
619302
619469
  return hash2.slice(0, 3);
619303
619470
  }
619304
619471
  function computeFingerprintFromMessages(messages) {
619305
619472
  const firstMessageText = extractFirstMessageText(messages);
619306
- return computeFingerprint(firstMessageText, "1.44.5");
619473
+ return computeFingerprint(firstMessageText, "1.44.8");
619307
619474
  }
619308
619475
  var FINGERPRINT_SALT = "59cf53e54c78";
619309
619476
  var init_fingerprint = () => {};
@@ -621177,7 +621344,7 @@ async function sideQuery(opts) {
621177
621344
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
621178
621345
  }
621179
621346
  const messageText2 = extractFirstUserMessageText(messages);
621180
- const fingerprint2 = computeFingerprint(messageText2, "1.44.5");
621347
+ const fingerprint2 = computeFingerprint(messageText2, "1.44.8");
621181
621348
  const attributionHeader = getAttributionHeader(fingerprint2);
621182
621349
  const systemBlocks = [
621183
621350
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -625914,7 +626081,7 @@ function buildSystemInitMessage(inputs) {
625914
626081
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
625915
626082
  apiKeySource: getURHQApiKeyWithSource().source,
625916
626083
  betas: getSdkBetas(),
625917
- ur_version: "1.44.5",
626084
+ ur_version: "1.44.8",
625918
626085
  output_style: outputStyle2,
625919
626086
  agents: inputs.agents.map((agent) => agent.agentType),
625920
626087
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
@@ -640542,7 +640709,7 @@ var init_useVoiceEnabled = __esm(() => {
640542
640709
  function getSemverPart(version3) {
640543
640710
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
640544
640711
  }
640545
- function useUpdateNotification(updatedVersion, initialVersion = "1.44.5") {
640712
+ function useUpdateNotification(updatedVersion, initialVersion = "1.44.8") {
640546
640713
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react226.useState(() => getSemverPart(initialVersion));
640547
640714
  if (!updatedVersion) {
640548
640715
  return null;
@@ -640591,7 +640758,7 @@ function AutoUpdater({
640591
640758
  return;
640592
640759
  }
640593
640760
  if (false) {}
640594
- const currentVersion = "1.44.5";
640761
+ const currentVersion = "1.44.8";
640595
640762
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
640596
640763
  let latestVersion = await getLatestVersion(channel);
640597
640764
  const isDisabled = isAutoUpdaterDisabled();
@@ -640820,12 +640987,12 @@ function NativeAutoUpdater({
640820
640987
  logEvent("tengu_native_auto_updater_start", {});
640821
640988
  try {
640822
640989
  const maxVersion = await getMaxVersion();
640823
- if (maxVersion && gt("1.44.5", maxVersion)) {
640990
+ if (maxVersion && gt("1.44.8", maxVersion)) {
640824
640991
  const msg = await getMaxVersionMessage();
640825
640992
  setMaxVersionIssue(msg ?? "affects your version");
640826
640993
  }
640827
640994
  const result = await installLatest(channel);
640828
- const currentVersion = "1.44.5";
640995
+ const currentVersion = "1.44.8";
640829
640996
  const latencyMs = Date.now() - startTime;
640830
640997
  if (result.lockFailed) {
640831
640998
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -640962,17 +641129,17 @@ function PackageManagerAutoUpdater(t0) {
640962
641129
  const maxVersion = await getMaxVersion();
640963
641130
  if (maxVersion && latest && gt(latest, maxVersion)) {
640964
641131
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
640965
- if (gte("1.44.5", maxVersion)) {
640966
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.44.5"} is already at or above maxVersion ${maxVersion}, skipping update`);
641132
+ if (gte("1.44.8", maxVersion)) {
641133
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.44.8"} is already at or above maxVersion ${maxVersion}, skipping update`);
640967
641134
  setUpdateAvailable(false);
640968
641135
  return;
640969
641136
  }
640970
641137
  latest = maxVersion;
640971
641138
  }
640972
- const hasUpdate = latest && !gte("1.44.5", latest) && !shouldSkipVersion(latest);
641139
+ const hasUpdate = latest && !gte("1.44.8", latest) && !shouldSkipVersion(latest);
640973
641140
  setUpdateAvailable(!!hasUpdate);
640974
641141
  if (hasUpdate) {
640975
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.44.5"} -> ${latest}`);
641142
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.44.8"} -> ${latest}`);
640976
641143
  }
640977
641144
  };
640978
641145
  $3[0] = t1;
@@ -641006,7 +641173,7 @@ function PackageManagerAutoUpdater(t0) {
641006
641173
  wrap: "truncate",
641007
641174
  children: [
641008
641175
  "currentVersion: ",
641009
- "1.44.5"
641176
+ "1.44.8"
641010
641177
  ]
641011
641178
  }, undefined, true, undefined, this);
641012
641179
  $3[3] = verbose;
@@ -646144,15 +646311,19 @@ function getNextPermissionMode(toolPermissionContext, _teamContext) {
646144
646311
  if (toolPermissionContext.isBypassPermissionsModeAvailable) {
646145
646312
  return "bypassPermissions";
646146
646313
  }
646147
- return "dontAsk";
646148
- case "dontAsk":
646314
+ return "autoApprove";
646315
+ case "autoApprove":
646149
646316
  if (canCycleToAuto(toolPermissionContext)) {
646150
646317
  return "auto";
646151
646318
  }
646152
646319
  return "default";
646153
646320
  case "bypassPermissions":
646321
+ return "autoApprove";
646322
+ case "dontAsk":
646323
+ return "default";
646324
+ case "auto":
646154
646325
  if (canCycleToAuto(toolPermissionContext)) {
646155
- return "auto";
646326
+ return "default";
646156
646327
  }
646157
646328
  return "default";
646158
646329
  default:
@@ -653458,7 +653629,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
653458
653629
  project_dir: getOriginalCwd(),
653459
653630
  added_dirs: addedDirs
653460
653631
  },
653461
- version: "1.44.5",
653632
+ version: "1.44.8",
653462
653633
  output_style: {
653463
653634
  name: outputStyleName
653464
653635
  },
@@ -653541,7 +653712,7 @@ function StatusLineInner({
653541
653712
  const taskValues = Object.values(tasks2);
653542
653713
  const taskRunningCount = taskValues.filter((task2) => task2.status === "running" || task2.status === "pending").length;
653543
653714
  const defaultStatusLineText = buildDefaultStatusBar({
653544
- version: "1.44.5",
653715
+ version: "1.44.8",
653545
653716
  providerLabel: providerRuntime.providerLabel,
653546
653717
  authMode: providerRuntime.authLabel,
653547
653718
  model: providerRuntime.model ?? renderModelName(mainLoopModel),
@@ -665472,7 +665643,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
665472
665643
  } catch {}
665473
665644
  const data = {
665474
665645
  trigger: trigger2,
665475
- version: "1.44.5",
665646
+ version: "1.44.8",
665476
665647
  platform: process.platform,
665477
665648
  transcript,
665478
665649
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -677357,7 +677528,7 @@ function WelcomeV2() {
677357
677528
  dimColor: true,
677358
677529
  children: [
677359
677530
  "v",
677360
- "1.44.5"
677531
+ "1.44.8"
677361
677532
  ]
677362
677533
  }, undefined, true, undefined, this)
677363
677534
  ]
@@ -678617,7 +678788,7 @@ function completeOnboarding() {
678617
678788
  saveGlobalConfig((current) => ({
678618
678789
  ...current,
678619
678790
  hasCompletedOnboarding: true,
678620
- lastOnboardingVersion: "1.44.5"
678791
+ lastOnboardingVersion: "1.44.8"
678621
678792
  }));
678622
678793
  }
678623
678794
  function showDialog(root2, renderer) {
@@ -682259,15 +682430,14 @@ Settings load in order: user \u2192 project \u2192 local (later overrides earlie
682259
682430
  "allow": ["Bash(npm:*)", "Edit(.ur)", "Read"],
682260
682431
  "deny": ["Bash(rm -rf:*)"],
682261
682432
  "ask": ["Write(/etc/*)"],
682262
- "defaultMode": "default" | "plan" | "acceptEdits" | "dontAsk",
682433
+ "defaultMode": "default" | "plan" | "acceptEdits" | "autoApprove",
682263
682434
  "additionalDirectories": ["/extra/dir"]
682264
682435
  }
682265
682436
  }
682266
682437
  \`\`\`
682267
682438
 
682268
- Set \`permissions.defaultMode\` to \`"dontAsk"\` to auto-approve operations that
682269
- would otherwise stop for manual approval. Explicit deny rules and security
682270
- policy blocks still apply.
682439
+ Set \`permissions.defaultMode\` to \`"autoApprove"\` to auto-approve operations
682440
+ that would otherwise stop for permission approval. User-input dialogs still ask.
682271
682441
 
682272
682442
  **Permission Rule Syntax:**
682273
682443
  - Exact match: \`"Bash(npm run test)"\`
@@ -683658,7 +683828,7 @@ function appendToLog(path24, message) {
683658
683828
  cwd: getFsImplementation().cwd(),
683659
683829
  userType: process.env.USER_TYPE,
683660
683830
  sessionId: getSessionId(),
683661
- version: "1.44.5"
683831
+ version: "1.44.8"
683662
683832
  };
683663
683833
  getLogWriter(path24).write(messageWithTimestamp);
683664
683834
  }
@@ -687752,8 +687922,8 @@ async function getEnvLessBridgeConfig() {
687752
687922
  }
687753
687923
  async function checkEnvLessBridgeMinVersion() {
687754
687924
  const cfg = await getEnvLessBridgeConfig();
687755
- if (cfg.min_version && lt("1.44.5", cfg.min_version)) {
687756
- return `Your version of UR (${"1.44.5"}) is too old for Remote Control.
687925
+ if (cfg.min_version && lt("1.44.8", cfg.min_version)) {
687926
+ return `Your version of UR (${"1.44.8"}) is too old for Remote Control.
687757
687927
  Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
687758
687928
  }
687759
687929
  return null;
@@ -688227,7 +688397,7 @@ async function initBridgeCore(params) {
688227
688397
  const rawApi = createBridgeApiClient({
688228
688398
  baseUrl,
688229
688399
  getAccessToken,
688230
- runnerVersion: "1.44.5",
688400
+ runnerVersion: "1.44.8",
688231
688401
  onDebug: logForDebugging,
688232
688402
  onAuth401,
688233
688403
  getTrustedDeviceToken
@@ -693909,7 +694079,7 @@ async function startMCPServer(cwd3, debug2, verbose) {
693909
694079
  setCwd(cwd3);
693910
694080
  const server2 = new Server({
693911
694081
  name: "ur/tengu",
693912
- version: "1.44.5"
694082
+ version: "1.44.8"
693913
694083
  }, {
693914
694084
  capabilities: {
693915
694085
  tools: {}
@@ -695951,7 +696121,7 @@ async function update() {
695951
696121
  logEvent("tengu_update_check", {});
695952
696122
  const diagnostic = await getDoctorDiagnostic();
695953
696123
  const result = await checkUpgradeStatus({
695954
- currentVersion: "1.44.5",
696124
+ currentVersion: "1.44.8",
695955
696125
  packageName: UR_AGENT_PACKAGE_NAME,
695956
696126
  installationType: diagnostic.installationType,
695957
696127
  latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
@@ -697197,7 +697367,7 @@ ${customInstructions}` : customInstructions;
697197
697367
  }
697198
697368
  }
697199
697369
  logForDiagnosticsNoPII("info", "started", {
697200
- version: "1.44.5",
697370
+ version: "1.44.8",
697201
697371
  is_native_binary: isInBundledMode()
697202
697372
  });
697203
697373
  registerCleanup(async () => {
@@ -697983,7 +698153,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
697983
698153
  pendingHookMessages
697984
698154
  }, renderAndRun);
697985
698155
  }
697986
- }).version("1.44.5 (UR-Nexus)", "-v, --version", "Output the version number");
698156
+ }).version("1.44.8 (UR-Nexus)", "-v, --version", "Output the version number");
697987
698157
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
697988
698158
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
697989
698159
  if (canUserConfigureAdvisor()) {
@@ -698898,7 +699068,7 @@ if (false) {}
698898
699068
  async function main2() {
698899
699069
  const args = process.argv.slice(2);
698900
699070
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
698901
- console.log(`${"1.44.5"} (UR-Nexus)`);
699071
+ console.log(`${"1.44.8"} (UR-Nexus)`);
698902
699072
  return;
698903
699073
  }
698904
699074
  if (args[0] === "a2a" && args[1] === "serve" && !args.includes("--help") && !args.includes("-h")) {
@@ -270,6 +270,15 @@ Recommended Git behavior:
270
270
  - Do not commit generated `.ur/index/`, `.ur/memory/`, `.ur/cache/`, `.ur/tmp/`, or `.ur/logs/`.
271
271
  - Do not commit `UR.local.md`.
272
272
 
273
+ Memory and learning defaults:
274
+
275
+ - Auto-memory is enabled by default. Disable with `autoMemoryEnabled: false`,
276
+ `UR_CODE_DISABLE_AUTO_MEMORY=1`, or `--bare`.
277
+ - Automatic learning is enabled by default. Disable with
278
+ `automaticLearningEnabled: false` or `UR_CODE_DISABLE_AUTO_LEARNING=1`.
279
+ - Automatic learning folds local outcome stats only; it does not call a model
280
+ unless you explicitly run `/learn run --reflect`.
281
+
273
282
  ## Verifier
274
283
 
275
284
  UR runs a lightweight verifier in the agent loop (L1) to catch false "task
@@ -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.44.5</p>
47
+ <p class="eyebrow">Version 1.44.8</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>
@@ -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.44.5",
5
+ "version": "1.44.8",
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.44.5",
3
+ "version": "1.44.8",
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",