ur-agent 1.62.0 → 1.64.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,48 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.64.0
4
+
5
+ - Tool-result pruning now announces itself. It changed context silently, so
6
+ there was no way to confirm it fired or to attribute a missing detail to it —
7
+ the same defect memory suggestions had when they went to stderr. A prune now
8
+ prints what it removed and how many tokens that freed.
9
+ - Corrected the fan-out drill, which tested the wrong limit. Asking for 30
10
+ subagents in one turn cannot reach `agents.maxConcurrent`, because
11
+ `MAX_CONCURRENT_TOOLS` caps a single turn at 8 — so the run reported an
12
+ unrelated cap and I mistook that for the governor being unreachable. It is
13
+ reachable by nesting: 8 roots, each spawning more, hits 20 and fires naming
14
+ the setting. The drill now exercises that path.
15
+ - Added a manual drill for tool-result pruning. It only fires inside a live
16
+ query loop, so no automated drill can reach it.
17
+ - Added opt-in signing of the memory integrity manifest via
18
+ `UR_MEMORY_INTEGRITY_KEY`. Unsigned, anyone who can write a memory file can
19
+ rewrite the manifest to match and pass verification; the HMAC raises that to
20
+ needing the key. Off by default because a key stored beside the data it
21
+ protects is theatre.
22
+ - `verify` exits non-zero on an invalid signature — the first implementation
23
+ detected forgery and still exited 0, because a forged manifest updates the
24
+ digests so every tamper count reads zero. A manifest that is signed but
25
+ unverifiable also fails, rather than passing on an unperformed check.
26
+
27
+ ## 1.63.0
28
+
29
+ - Added size-triggered pruning of superseded tool results
30
+ (`context.pruneToolResults`). UR already had the clearing machinery, but
31
+ nothing external could reach it: cached microcompact is internal-only and
32
+ returns unchanged messages in shipped builds, and the time-based trigger
33
+ needs an hour of idling *and* a GrowthBook flag that a local install never
34
+ receives. An active session therefore pruned nothing and ran until autocompact
35
+ replaced the whole history with a summary.
36
+ - Pruning fires only when it would free at least 20k tokens, because clearing
37
+ invalidates the cached prefix and a small cleanup costs more in cache misses
38
+ than it reclaims. Short sessions are untouched; a 40-read session frees ~64k.
39
+ - The most recent 8 compactable results are a protected zone and are never
40
+ cleared, so the model keeps the working set it is reasoning about.
41
+ `keepRecent` is floored at 1: clearing everything would leave no working
42
+ context, and `slice(-0)` would paradoxically keep all of it.
43
+ - Configured through settings rather than GrowthBook, so it can actually be
44
+ turned off or tuned.
45
+
3
46
  ## 1.62.0
4
47
 
5
48
  - `ur agent-inspect --costs` now labels each row with what the agent was
package/dist/cli.js CHANGED
@@ -75207,7 +75207,7 @@ var init_auth = __esm(() => {
75207
75207
 
75208
75208
  // src/utils/userAgent.ts
75209
75209
  function getURCodeUserAgent() {
75210
- return `ur/${"1.62.0"}`;
75210
+ return `ur/${"1.64.0"}`;
75211
75211
  }
75212
75212
 
75213
75213
  // src/utils/workloadContext.ts
@@ -75229,7 +75229,7 @@ function getUserAgent() {
75229
75229
  const clientApp = process.env.UR_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}` : "";
75230
75230
  const workload = getWorkload();
75231
75231
  const workloadSuffix = workload ? `, workload/${workload}` : "";
75232
- return `ur-cli/${"1.62.0"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
75232
+ return `ur-cli/${"1.64.0"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
75233
75233
  }
75234
75234
  function getMCPUserAgent() {
75235
75235
  const parts = [];
@@ -75243,7 +75243,7 @@ function getMCPUserAgent() {
75243
75243
  parts.push(`client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}`);
75244
75244
  }
75245
75245
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
75246
- return `ur/${"1.62.0"}${suffix}`;
75246
+ return `ur/${"1.64.0"}${suffix}`;
75247
75247
  }
75248
75248
  function getWebFetchUserAgent() {
75249
75249
  return `UR-User (${getURCodeUserAgent()})`;
@@ -75381,7 +75381,7 @@ var init_user = __esm(() => {
75381
75381
  deviceId,
75382
75382
  sessionId: getSessionId(),
75383
75383
  email: getEmail(),
75384
- appVersion: "1.62.0",
75384
+ appVersion: "1.64.0",
75385
75385
  platform: getHostPlatformForAnalytics(),
75386
75386
  organizationUuid,
75387
75387
  accountUuid,
@@ -83581,7 +83581,7 @@ var init_metadata = __esm(() => {
83581
83581
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
83582
83582
  WHITESPACE_REGEX = /\s+/;
83583
83583
  getVersionBase = memoize_default(() => {
83584
- const match = "1.62.0".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
83584
+ const match = "1.64.0".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
83585
83585
  return match ? match[0] : undefined;
83586
83586
  });
83587
83587
  buildEnvContext = memoize_default(async () => {
@@ -83621,7 +83621,7 @@ var init_metadata = __esm(() => {
83621
83621
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
83622
83622
  isURCodeAction: isEnvTruthy(process.env.UR_CODE_ACTION),
83623
83623
  isURAiAuth: isURAISubscriber(),
83624
- version: "1.62.0",
83624
+ version: "1.64.0",
83625
83625
  versionBase: getVersionBase(),
83626
83626
  buildTime: "",
83627
83627
  deploymentEnvironment: env2.detectDeploymentEnvironment(),
@@ -84291,7 +84291,7 @@ function initialize1PEventLogging() {
84291
84291
  const platform2 = getPlatform();
84292
84292
  const attributes = {
84293
84293
  [import_semantic_conventions4.ATTR_SERVICE_NAME]: "ur",
84294
- [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.62.0"
84294
+ [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.64.0"
84295
84295
  };
84296
84296
  if (platform2 === "wsl") {
84297
84297
  const wslVersion = getWslVersion();
@@ -84319,7 +84319,7 @@ function initialize1PEventLogging() {
84319
84319
  })
84320
84320
  ]
84321
84321
  });
84322
- firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.62.0");
84322
+ firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.64.0");
84323
84323
  }
84324
84324
  async function reinitialize1PEventLoggingIfConfigChanged() {
84325
84325
  if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
@@ -86838,6 +86838,13 @@ var init_types2 = __esm(() => {
86838
86838
  name: exports_external.string().optional().describe("Synthesiser voice name"),
86839
86839
  rate: exports_external.number().optional().describe("Words per minute")
86840
86840
  }).optional().describe("Spoken output settings"),
86841
+ context: exports_external.object({
86842
+ pruneToolResults: exports_external.object({
86843
+ enabled: exports_external.boolean().optional(),
86844
+ minTokensFreed: exports_external.number().optional(),
86845
+ keepRecent: exports_external.number().optional()
86846
+ }).optional().describe("Size-triggered pruning of superseded tool results (old file reads, greps, shell output). " + "Prunes only when it would free at least minTokensFreed tokens, keeping the most recent " + "keepRecent results untouched. Less destructive than letting context fill until autocompact " + "replaces the whole history with a summary.")
86847
+ }).optional().describe("Context management behaviour."),
86841
86848
  memory: exports_external.object({
86842
86849
  suggest: exports_external.boolean().optional().describe("Propose durable facts after each turn"),
86843
86850
  suggestMinConfidence: exports_external.number().optional().describe("Confidence floor for proposals (0-1, default 0.75)")
@@ -94158,7 +94165,7 @@ function formatAgentTrendReport(report = buildAgentTrendReport()) {
94158
94165
  function formatA2AAgentCard(options = {}, pretty = true) {
94159
94166
  return JSON.stringify(buildA2AAgentCard(options), null, pretty ? 2 : 0);
94160
94167
  }
94161
- var urVersion = "1.62.0", researchSnapshotDate = "2026-07-15", coverage, priorityRoadmap;
94168
+ var urVersion = "1.64.0", researchSnapshotDate = "2026-07-15", coverage, priorityRoadmap;
94162
94169
  var init_trends = __esm(() => {
94163
94170
  init_a2aCardSignature();
94164
94171
  coverage = [
@@ -96961,7 +96968,7 @@ function getAttributionHeader(fingerprint) {
96961
96968
  if (!isAttributionHeaderEnabled()) {
96962
96969
  return "";
96963
96970
  }
96964
- const version2 = `${"1.62.0"}.${fingerprint}`;
96971
+ const version2 = `${"1.64.0"}.${fingerprint}`;
96965
96972
  const entrypoint = process.env.UR_CODE_ENTRYPOINT ?? "unknown";
96966
96973
  const cch = "";
96967
96974
  const workload = getWorkload();
@@ -145458,6 +145465,27 @@ var init_prompt7 = __esm(() => {
145458
145465
  init_constants2();
145459
145466
  });
145460
145467
 
145468
+ // src/services/compact/toolResultPruningConfig.ts
145469
+ function getToolResultPruningConfig() {
145470
+ const configured = getInitialSettings()?.context?.pruneToolResults;
145471
+ if (!configured)
145472
+ return TOOL_RESULT_PRUNING_DEFAULTS;
145473
+ return {
145474
+ enabled: typeof configured.enabled === "boolean" ? configured.enabled : TOOL_RESULT_PRUNING_DEFAULTS.enabled,
145475
+ minTokensFreed: typeof configured.minTokensFreed === "number" && Number.isFinite(configured.minTokensFreed) && configured.minTokensFreed >= 0 ? configured.minTokensFreed : TOOL_RESULT_PRUNING_DEFAULTS.minTokensFreed,
145476
+ keepRecent: typeof configured.keepRecent === "number" && Number.isInteger(configured.keepRecent) && configured.keepRecent >= 1 ? configured.keepRecent : TOOL_RESULT_PRUNING_DEFAULTS.keepRecent
145477
+ };
145478
+ }
145479
+ var TOOL_RESULT_PRUNING_DEFAULTS;
145480
+ var init_toolResultPruningConfig = __esm(() => {
145481
+ init_settings2();
145482
+ TOOL_RESULT_PRUNING_DEFAULTS = {
145483
+ enabled: true,
145484
+ minTokensFreed: 20000,
145485
+ keepRecent: 8
145486
+ };
145487
+ });
145488
+
145461
145489
  // src/tools/PowerShellTool/toolName.ts
145462
145490
  var POWERSHELL_TOOL_NAME = "PowerShell";
145463
145491
 
@@ -146338,6 +146366,10 @@ async function microcompactMessages(messages, toolUseContext, querySource) {
146338
146366
  if (timeBasedResult) {
146339
146367
  return timeBasedResult;
146340
146368
  }
146369
+ const sizeBasedResult = maybeSizeBasedMicrocompact(messages, querySource);
146370
+ if (sizeBasedResult) {
146371
+ return sizeBasedResult;
146372
+ }
146341
146373
  return { messages };
146342
146374
  }
146343
146375
  function evaluateTimeBasedTrigger(messages, querySource) {
@@ -146355,6 +146387,59 @@ function evaluateTimeBasedTrigger(messages, querySource) {
146355
146387
  }
146356
146388
  return { gapMinutes, config: config2 };
146357
146389
  }
146390
+ function clearOldToolResults(messages, keepRecent) {
146391
+ const compactableIds = collectCompactableToolIds(messages);
146392
+ const keep = Math.max(1, keepRecent);
146393
+ const keepSet = new Set(compactableIds.slice(-keep));
146394
+ const clearSet = new Set(compactableIds.filter((id) => !keepSet.has(id)));
146395
+ if (clearSet.size === 0)
146396
+ return null;
146397
+ let tokensSaved = 0;
146398
+ const result = messages.map((message) => {
146399
+ if (message.type !== "user" || !Array.isArray(message.message.content)) {
146400
+ return message;
146401
+ }
146402
+ let touched = false;
146403
+ const newContent = message.message.content.map((block) => {
146404
+ if (block.type === "tool_result" && clearSet.has(block.tool_use_id) && block.content !== TIME_BASED_MC_CLEARED_MESSAGE) {
146405
+ tokensSaved += calculateToolResultTokens(block);
146406
+ touched = true;
146407
+ return { ...block, content: TIME_BASED_MC_CLEARED_MESSAGE };
146408
+ }
146409
+ return block;
146410
+ });
146411
+ if (!touched)
146412
+ return message;
146413
+ return { ...message, message: { ...message.message, content: newContent } };
146414
+ });
146415
+ if (tokensSaved === 0)
146416
+ return null;
146417
+ return { messages: result, tokensSaved, cleared: clearSet.size };
146418
+ }
146419
+ function maybeSizeBasedMicrocompact(messages, querySource) {
146420
+ const config2 = getToolResultPruningConfig();
146421
+ if (!config2.enabled || !querySource || !isMainThreadSource(querySource)) {
146422
+ return null;
146423
+ }
146424
+ const cleared = clearOldToolResults(messages, config2.keepRecent);
146425
+ if (!cleared || cleared.tokensSaved < config2.minTokensFreed) {
146426
+ return null;
146427
+ }
146428
+ logEvent("tengu_size_based_microcompact", {
146429
+ toolsCleared: cleared.cleared,
146430
+ keepRecent: config2.keepRecent,
146431
+ minTokensFreed: config2.minTokensFreed,
146432
+ tokensSaved: cleared.tokensSaved
146433
+ });
146434
+ logForDebugging(`[SIZE-BASED MC] cleared ${cleared.cleared} tool results (~${cleared.tokensSaved} tokens >= ${config2.minTokensFreed} threshold), kept last ${config2.keepRecent}`);
146435
+ suppressCompactWarning();
146436
+ resetMicrocompactState();
146437
+ if (false) {}
146438
+ return {
146439
+ messages: cleared.messages,
146440
+ notice: `Pruned ${cleared.cleared} superseded tool result(s), freeing about ` + `${cleared.tokensSaved.toLocaleString()} tokens. The ${config2.keepRecent} most ` + `recent are kept. Disable with context.pruneToolResults.enabled=false.`
146441
+ };
146442
+ }
146358
146443
  function maybeTimeBasedMicrocompact(messages, querySource) {
146359
146444
  const trigger = evaluateTimeBasedTrigger(messages, querySource);
146360
146445
  if (!trigger) {
@@ -146408,6 +146493,7 @@ function maybeTimeBasedMicrocompact(messages, querySource) {
146408
146493
  }
146409
146494
  var TIME_BASED_MC_CLEARED_MESSAGE = "[Old tool result content cleared]", IMAGE_MAX_TOKEN_SIZE = 2000, COMPACTABLE_TOOLS, cachedMCState = null, pendingCacheEdits = null;
146410
146495
  var init_microCompact = __esm(() => {
146496
+ init_toolResultPruningConfig();
146411
146497
  init_prompt2();
146412
146498
  init_prompt3();
146413
146499
  init_prompt();
@@ -154550,7 +154636,7 @@ var init_projectSafety = __esm(() => {
154550
154636
  function getInstruments() {
154551
154637
  if (instruments)
154552
154638
  return instruments;
154553
- const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.62.0");
154639
+ const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.64.0");
154554
154640
  instruments = {
154555
154641
  operationDuration: meter.createHistogram("gen_ai.client.operation.duration", {
154556
154642
  description: "GenAI operation duration.",
@@ -154648,7 +154734,7 @@ function genAiAgentAttributes() {
154648
154734
  "gen_ai.operation.name": GEN_AI_OPERATION_INVOKE_AGENT,
154649
154735
  "gen_ai.provider.name": "ur",
154650
154736
  "gen_ai.agent.name": "UR-Nexus",
154651
- "gen_ai.agent.version": "1.62.0"
154737
+ "gen_ai.agent.version": "1.64.0"
154652
154738
  };
154653
154739
  }
154654
154740
  function genAiWorkflowAttributes(workflowName) {
@@ -154664,7 +154750,7 @@ function genAiWorkflowAttributes(workflowName) {
154664
154750
  function startGenAiWorkflowSpan(workflowName) {
154665
154751
  const attributes = genAiWorkflowAttributes(workflowName);
154666
154752
  const name = typeof attributes["gen_ai.workflow.name"] === "string" ? `invoke_workflow ${attributes["gen_ai.workflow.name"]}` : GEN_AI_OPERATION_INVOKE_WORKFLOW;
154667
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.62.0").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
154753
+ return import_api10.trace.getTracer("ur-agent.gen_ai", "1.64.0").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
154668
154754
  }
154669
154755
  function endGenAiWorkflowSpan(span, options2 = {}) {
154670
154756
  try {
@@ -154702,7 +154788,7 @@ function startGenAiMemorySpan(operation, options2 = {}) {
154702
154788
  if (options2.recordCount !== undefined && Number.isInteger(options2.recordCount) && options2.recordCount >= 0) {
154703
154789
  attributes["gen_ai.memory.record.count"] = options2.recordCount;
154704
154790
  }
154705
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.62.0").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
154791
+ return import_api10.trace.getTracer("ur-agent.gen_ai", "1.64.0").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
154706
154792
  }
154707
154793
  function endGenAiMemorySpan(span, options2 = {}) {
154708
154794
  try {
@@ -206221,7 +206307,7 @@ function getTelemetryAttributes() {
206221
206307
  attributes["session.id"] = sessionId;
206222
206308
  }
206223
206309
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
206224
- attributes["app.version"] = "1.62.0";
206310
+ attributes["app.version"] = "1.64.0";
206225
206311
  }
206226
206312
  const oauthAccount = getOauthAccountInfo();
206227
206313
  if (oauthAccount) {
@@ -241995,7 +242081,7 @@ function getInstallationEnv() {
241995
242081
  return;
241996
242082
  }
241997
242083
  function getURCodeVersion() {
241998
- return "1.62.0";
242084
+ return "1.64.0";
241999
242085
  }
242000
242086
  async function getInstalledVSCodeExtensionVersion(command) {
242001
242087
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -249326,7 +249412,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
249326
249412
  const client2 = new Client({
249327
249413
  name: "ur",
249328
249414
  title: "UR",
249329
- version: "1.62.0",
249415
+ version: "1.64.0",
249330
249416
  description: "UR-Nexus autonomous engineering workflow engine",
249331
249417
  websiteUrl: PRODUCT_URL
249332
249418
  }, {
@@ -249686,7 +249772,7 @@ var init_client5 = __esm(() => {
249686
249772
  const client2 = new Client({
249687
249773
  name: "ur",
249688
249774
  title: "UR",
249689
- version: "1.62.0",
249775
+ version: "1.64.0",
249690
249776
  description: "UR-Nexus autonomous engineering workflow engine",
249691
249777
  websiteUrl: PRODUCT_URL
249692
249778
  }, {
@@ -262287,7 +262373,7 @@ async function createRuntime() {
262287
262373
  bootstrapTelemetry();
262288
262374
  const resource = defaultResource().merge(detectResources({ detectors: [envDetector] })).merge(resourceFromAttributes({
262289
262375
  [import_semantic_conventions7.ATTR_SERVICE_NAME]: "ur-agent",
262290
- [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.62.0"
262376
+ [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.64.0"
262291
262377
  }));
262292
262378
  const tracerProvider = exporters.traces.length > 0 ? new BasicTracerProvider({
262293
262379
  resource,
@@ -262320,11 +262406,11 @@ async function createRuntime() {
262320
262406
  setMeterProvider(meterProvider);
262321
262407
  setLoggerProvider(loggerProvider);
262322
262408
  if (meterProvider) {
262323
- const meter = meterProvider.getMeter("ur-agent", "1.62.0");
262409
+ const meter = meterProvider.getMeter("ur-agent", "1.64.0");
262324
262410
  setMeter(meter, (name, options2) => meter.createCounter(name, options2));
262325
262411
  }
262326
262412
  if (loggerProvider) {
262327
- setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.62.0"));
262413
+ setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.64.0"));
262328
262414
  }
262329
262415
  if (!cleanupRegistered2) {
262330
262416
  cleanupRegistered2 = true;
@@ -262986,9 +263072,9 @@ async function assertMinVersion() {
262986
263072
  if (false) {}
262987
263073
  try {
262988
263074
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
262989
- if (versionConfig.minVersion && lt("1.62.0", versionConfig.minVersion)) {
263075
+ if (versionConfig.minVersion && lt("1.64.0", versionConfig.minVersion)) {
262990
263076
  console.error(`
262991
- It looks like your version of UR (${"1.62.0"}) needs an update.
263077
+ It looks like your version of UR (${"1.64.0"}) needs an update.
262992
263078
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
262993
263079
 
262994
263080
  To update, please run:
@@ -263204,7 +263290,7 @@ async function installGlobalPackage(specificVersion) {
263204
263290
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
263205
263291
  logEvent("tengu_auto_updater_lock_contention", {
263206
263292
  pid: process.pid,
263207
- currentVersion: "1.62.0"
263293
+ currentVersion: "1.64.0"
263208
263294
  });
263209
263295
  return "in_progress";
263210
263296
  }
@@ -263213,7 +263299,7 @@ async function installGlobalPackage(specificVersion) {
263213
263299
  if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
263214
263300
  logError2(new Error("Windows NPM detected in WSL environment"));
263215
263301
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
263216
- currentVersion: "1.62.0"
263302
+ currentVersion: "1.64.0"
263217
263303
  });
263218
263304
  console.error(`
263219
263305
  Error: Windows NPM detected in WSL
@@ -263748,7 +263834,7 @@ function detectLinuxGlobPatternWarnings() {
263748
263834
  }
263749
263835
  async function getDoctorDiagnostic() {
263750
263836
  const installationType = await getCurrentInstallationType();
263751
- const version2 = typeof MACRO !== "undefined" ? "1.62.0" : "unknown";
263837
+ const version2 = typeof MACRO !== "undefined" ? "1.64.0" : "unknown";
263752
263838
  const installationPath = await getInstallationPath();
263753
263839
  const invokedBinary = getInvokedBinary();
263754
263840
  const multipleInstallations = await detectMultipleInstallations();
@@ -264683,8 +264769,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
264683
264769
  const maxVersion = await getMaxVersion();
264684
264770
  if (maxVersion && gt(version2, maxVersion)) {
264685
264771
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
264686
- if (gte("1.62.0", maxVersion)) {
264687
- logForDebugging(`Native installer: current version ${"1.62.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
264772
+ if (gte("1.64.0", maxVersion)) {
264773
+ logForDebugging(`Native installer: current version ${"1.64.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
264688
264774
  logEvent("tengu_native_update_skipped_max_version", {
264689
264775
  latency_ms: Date.now() - startTime,
264690
264776
  max_version: maxVersion,
@@ -264695,7 +264781,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
264695
264781
  version2 = maxVersion;
264696
264782
  }
264697
264783
  }
264698
- if (!forceReinstall && version2 === "1.62.0" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
264784
+ if (!forceReinstall && version2 === "1.64.0" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
264699
264785
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
264700
264786
  logEvent("tengu_native_update_complete", {
264701
264787
  latency_ms: Date.now() - startTime,
@@ -334894,7 +334980,7 @@ function isAnyTracingEnabled() {
334894
334980
  return isTelemetryEnabled() || isEnhancedTelemetryEnabled() || isBetaTracingEnabled();
334895
334981
  }
334896
334982
  function getTracer() {
334897
- return import_api39.trace.getTracer("ur-agent.gen_ai", "1.62.0");
334983
+ return import_api39.trace.getTracer("ur-agent.gen_ai", "1.64.0");
334898
334984
  }
334899
334985
  function createSpanAttributes(spanType, customAttributes = {}) {
334900
334986
  const baseAttributes = getTelemetryAttributes();
@@ -339368,6 +339454,9 @@ async function* queryLoop(params, consumedCommandUuids) {
339368
339454
  queryCheckpoint("query_microcompact_start");
339369
339455
  const microcompactResult = await deps.microcompact(messagesForQuery, toolUseContext, querySource);
339370
339456
  messagesForQuery = microcompactResult.messages;
339457
+ if (microcompactResult.notice) {
339458
+ yield createSystemMessage(microcompactResult.notice, "info");
339459
+ }
339371
339460
  const pendingCacheEdits2 = undefined;
339372
339461
  queryCheckpoint("query_microcompact_end");
339373
339462
  if (false) {}
@@ -364397,7 +364486,7 @@ function Feedback({
364397
364486
  platform: env2.platform,
364398
364487
  gitRepo: envInfo.isGit,
364399
364488
  terminal: env2.terminal,
364400
- version: "1.62.0",
364489
+ version: "1.64.0",
364401
364490
  transcript: normalizeMessagesForAPI(messages),
364402
364491
  errors: sanitizedErrors,
364403
364492
  lastApiRequest: getLastAPIRequest(),
@@ -364589,7 +364678,7 @@ function Feedback({
364589
364678
  ", ",
364590
364679
  env2.terminal,
364591
364680
  ", v",
364592
- "1.62.0"
364681
+ "1.64.0"
364593
364682
  ]
364594
364683
  }, undefined, true, undefined, this)
364595
364684
  ]
@@ -364695,7 +364784,7 @@ ${sanitizedDescription}
364695
364784
  ` + `**Environment Info**
364696
364785
  ` + `- Platform: ${env2.platform}
364697
364786
  ` + `- Terminal: ${env2.terminal}
364698
- ` + `- Version: ${"1.62.0"}
364787
+ ` + `- Version: ${"1.64.0"}
364699
364788
  ` + `- Feedback ID: ${feedbackId}
364700
364789
  ` + `
364701
364790
  **Errors**
@@ -367805,7 +367894,7 @@ function buildPrimarySection() {
367805
367894
  }, undefined, false, undefined, this);
367806
367895
  return [{
367807
367896
  label: "Version",
367808
- value: "1.62.0"
367897
+ value: "1.64.0"
367809
367898
  }, {
367810
367899
  label: "Session name",
367811
367900
  value: nameValue
@@ -371135,7 +371224,7 @@ function Config({
371135
371224
  }
371136
371225
  }, undefined, false, undefined, this)
371137
371226
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime179.jsxDEV(ChannelDowngradeDialog, {
371138
- currentVersion: "1.62.0",
371227
+ currentVersion: "1.64.0",
371139
371228
  onChoice: (choice) => {
371140
371229
  setShowSubmenu(null);
371141
371230
  setTabsHidden(false);
@@ -371147,7 +371236,7 @@ function Config({
371147
371236
  autoUpdatesChannel: "stable"
371148
371237
  };
371149
371238
  if (choice === "stay") {
371150
- newSettings.minimumVersion = "1.62.0";
371239
+ newSettings.minimumVersion = "1.64.0";
371151
371240
  }
371152
371241
  updateSettingsForSource("userSettings", newSettings);
371153
371242
  setSettingsData((prev_27) => ({
@@ -379211,7 +379300,7 @@ function HelpV2(t0) {
379211
379300
  let t6;
379212
379301
  if ($2[31] !== tabs) {
379213
379302
  t6 = /* @__PURE__ */ jsx_dev_runtime206.jsxDEV(Tabs, {
379214
- title: `UR v${"1.62.0"}`,
379303
+ title: `UR v${"1.64.0"}`,
379215
379304
  color: "professionalBlue",
379216
379305
  defaultTab: "general",
379217
379306
  children: tabs
@@ -380128,7 +380217,7 @@ function buildToolUseContext(tools, readFileStateCache, toolPermissionContext, a
380128
380217
  async function handleInitialize(options2) {
380129
380218
  return {
380130
380219
  name: "UR",
380131
- version: "1.62.0",
380220
+ version: "1.64.0",
380132
380221
  protocolVersion: "0.1.0",
380133
380222
  workspaceRoot: options2.cwd,
380134
380223
  capabilities: {
@@ -397236,7 +397325,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
397236
397325
  return [];
397237
397326
  }
397238
397327
  }
397239
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.62.0") {
397328
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.64.0") {
397240
397329
  if (process.env.USER_TYPE === "ant") {
397241
397330
  const changelog = "";
397242
397331
  if (changelog) {
@@ -397263,7 +397352,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.62.0")
397263
397352
  releaseNotes
397264
397353
  };
397265
397354
  }
397266
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.62.0") {
397355
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.64.0") {
397267
397356
  if (process.env.USER_TYPE === "ant") {
397268
397357
  const changelog = "";
397269
397358
  if (changelog) {
@@ -400120,7 +400209,7 @@ function getRecentActivitySync() {
400120
400209
  return cachedActivity;
400121
400210
  }
400122
400211
  function getLogoDisplayData() {
400123
- const version2 = process.env.DEMO_VERSION ?? "1.62.0";
400212
+ const version2 = process.env.DEMO_VERSION ?? "1.64.0";
400124
400213
  const serverUrl = getDirectConnectServerUrl();
400125
400214
  const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd());
400126
400215
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -401004,7 +401093,7 @@ function LogoV2() {
401004
401093
  if ($2[2] === Symbol.for("react.memo_cache_sentinel")) {
401005
401094
  t2 = () => {
401006
401095
  const currentConfig2 = getGlobalConfig();
401007
- if (currentConfig2.lastReleaseNotesSeen === "1.62.0") {
401096
+ if (currentConfig2.lastReleaseNotesSeen === "1.64.0") {
401008
401097
  return;
401009
401098
  }
401010
401099
  saveGlobalConfig(_temp327);
@@ -401689,12 +401778,12 @@ function LogoV2() {
401689
401778
  return t41;
401690
401779
  }
401691
401780
  function _temp327(current) {
401692
- if (current.lastReleaseNotesSeen === "1.62.0") {
401781
+ if (current.lastReleaseNotesSeen === "1.64.0") {
401693
401782
  return current;
401694
401783
  }
401695
401784
  return {
401696
401785
  ...current,
401697
- lastReleaseNotesSeen: "1.62.0"
401786
+ lastReleaseNotesSeen: "1.64.0"
401698
401787
  };
401699
401788
  }
401700
401789
  function _temp241(s_0) {
@@ -418492,7 +418581,7 @@ function compileAgenticCiWorkflow(specName = "default", options2 = {}) {
418492
418581
  if (spec.name !== specName) {
418493
418582
  throw new Error("Agentic CI workflow spec name does not match");
418494
418583
  }
418495
- const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.62.0" : "1.62.0");
418584
+ const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.64.0" : "1.64.0");
418496
418585
  if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(packageVersion)) {
418497
418586
  throw new Error("invalid ur-agent package version");
418498
418587
  }
@@ -419485,7 +419574,7 @@ runner; \`ur trigger\` is the inbound parser that decides what to run.
419485
419574
  path: ".github/workflows/ur.yml",
419486
419575
  root: "project",
419487
419576
  content: compileAgenticCiWorkflow("default", {
419488
- packageVersion: typeof MACRO !== "undefined" ? "1.62.0" : "1.62.0"
419577
+ packageVersion: typeof MACRO !== "undefined" ? "1.64.0" : "1.64.0"
419489
419578
  })
419490
419579
  },
419491
419580
  {
@@ -419548,7 +419637,7 @@ function value(tokens, flag) {
419548
419637
  return index2 >= 0 ? tokens[index2 + 1] : undefined;
419549
419638
  }
419550
419639
  function cliVersion() {
419551
- return typeof MACRO !== "undefined" ? "1.62.0" : "1.62.0";
419640
+ return typeof MACRO !== "undefined" ? "1.64.0" : "1.64.0";
419552
419641
  }
419553
419642
  function workflowPath(cwd2) {
419554
419643
  return join159(cwd2, ".github", "workflows", "ur-agentic-ci.yml");
@@ -425404,7 +425493,7 @@ function createAcpStdioApp(deps) {
425404
425493
  }
425405
425494
  },
425406
425495
  authMethods: [],
425407
- agentInfo: { name: "UR-Nexus", version: "1.62.0" }
425496
+ agentInfo: { name: "UR-Nexus", version: "1.64.0" }
425408
425497
  })).onRequest("authenticate", () => ({})).onRequest("session/new", async (context6) => {
425409
425498
  const result = runtime2.newSession(context6.params.cwd, context6.params.mcpServers, context6.params.additionalDirectories);
425410
425499
  await runtime2.announce({
@@ -425501,7 +425590,7 @@ function createAcpStdioAgent(deps) {
425501
425590
  }
425502
425591
  },
425503
425592
  authMethods: [],
425504
- agentInfo: { name: "UR-Nexus", version: "1.62.0" }
425593
+ agentInfo: { name: "UR-Nexus", version: "1.64.0" }
425505
425594
  });
425506
425595
  return;
425507
425596
  case "authenticate":
@@ -435056,7 +435145,7 @@ var init_sources2 = __esm(() => {
435056
435145
  });
435057
435146
 
435058
435147
  // src/memdir/memoryIntegrity.ts
435059
- import { createHash as createHash42 } from "crypto";
435148
+ import { createHash as createHash42, createHmac as createHmac2 } from "crypto";
435060
435149
  import {
435061
435150
  existsSync as existsSync65,
435062
435151
  mkdirSync as mkdirSync46,
@@ -435067,6 +435156,23 @@ import {
435067
435156
  writeFileSync as writeFileSync46
435068
435157
  } from "fs";
435069
435158
  import { join as join184, relative as relative42 } from "path";
435159
+ function signingKey(env4 = process.env) {
435160
+ const key = env4.UR_MEMORY_INTEGRITY_KEY?.trim();
435161
+ return key ? key : null;
435162
+ }
435163
+ function signManifest(files, key) {
435164
+ const canonical = Object.keys(files).sort().map((name) => `${name}:${files[name].digest}`).join(`
435165
+ `);
435166
+ return createHmac2("sha256", key).update(canonical).digest("hex");
435167
+ }
435168
+ function checkSignature(manifest, env4 = process.env) {
435169
+ const key = signingKey(env4);
435170
+ if (!manifest.signature)
435171
+ return "unsigned";
435172
+ if (!key)
435173
+ return "unverifiable";
435174
+ return signManifest(manifest.files, key) === manifest.signature ? "valid" : "invalid";
435175
+ }
435070
435176
  function manifestPathFor2(dir) {
435071
435177
  return join184(dir, MANIFEST_NAME);
435072
435178
  }
@@ -435116,10 +435222,12 @@ function recordManifest(dir) {
435116
435222
  bytes: statSync24(full).size
435117
435223
  };
435118
435224
  }
435225
+ const key = signingKey();
435119
435226
  const manifest = {
435120
435227
  version: 1,
435121
435228
  updatedAt: new Date().toISOString(),
435122
- files
435229
+ files,
435230
+ ...key ? { signature: signManifest(files, key) } : {}
435123
435231
  };
435124
435232
  writeFileSync46(manifestPathFor2(dir), `${JSON.stringify(manifest, null, 2)}
435125
435233
  `);
@@ -435166,7 +435274,8 @@ function verifyMemoryStore(dir) {
435166
435274
  dir,
435167
435275
  manifestPath: manifestPathFor2(dir),
435168
435276
  exists: existsSync65(dir),
435169
- valid: manifest !== null && entries.length > 0 && counts.modified === 0 && counts.untracked === 0 && counts.missing === 0,
435277
+ signature: manifest ? checkSignature(manifest) : "unsigned",
435278
+ valid: manifest !== null && checkSignature(manifest) !== "invalid" && checkSignature(manifest) !== "unverifiable" && entries.length > 0 && counts.modified === 0 && counts.untracked === 0 && counts.missing === 0,
435170
435279
  entries,
435171
435280
  counts
435172
435281
  };
@@ -435198,6 +435307,17 @@ function formatMemoryIntegrity(report, json2) {
435198
435307
  return `${report.dir}
435199
435308
  ` + ` no such directory \u2014 nothing was checked. If you expected memory here,
435200
435309
  ` + ` the path is wrong; verifying a path that does not exist proves nothing.`;
435310
+ }
435311
+ if (report.signature === "invalid") {
435312
+ return `${report.dir}
435313
+ ` + ` SIGNATURE INVALID \u2014 the manifest does not match its signature.
435314
+ ` + ` Someone with write access to this directory rewrote the manifest
435315
+ ` + ` without the key. Treat every file here as untrusted.`;
435316
+ }
435317
+ if (report.signature === "unverifiable") {
435318
+ return `${report.dir}
435319
+ ` + ` signed, but UR_MEMORY_INTEGRITY_KEY is not set, so the signature
435320
+ ` + ` could not be checked. Nothing here can be vouched for without it.`;
435201
435321
  }
435202
435322
  if (report.entries.length === 0) {
435203
435323
  return `${report.dir}
@@ -435288,7 +435408,7 @@ var call80 = async (args) => {
435288
435408
  };
435289
435409
  }
435290
435410
  const reports = stores.map((dir) => verifyMemoryStore(dir));
435291
- const tampered = reports.some((report) => report.counts.modified > 0 || report.counts.missing > 0 || report.counts.untracked > 0);
435411
+ const tampered = reports.some((report) => report.counts.modified > 0 || report.counts.missing > 0 || report.counts.untracked > 0 || report.signature === "invalid" || report.signature === "unverifiable");
435292
435412
  if (tampered)
435293
435413
  process.exitCode = 1;
435294
435414
  return {
@@ -435535,9 +435655,17 @@ var init_selfTest = __esm(() => {
435535
435655
  id: "fan-out-limit",
435536
435656
  feature: "agent fan-out limits",
435537
435657
  kind: "manual",
435538
- action: 'Start `ur` and ask it to spawn more subagents than agents.maxConcurrent allows (e.g. "review these 30 files, one subagent each")',
435539
- expect: "the cap is enforced and the refusal names agents.maxConcurrent, so you can act on it",
435540
- rationale: "The limiter has unit tests and has never been exercised live; a governor that never trips in practice is unproven."
435658
+ action: 'In the UR repo, ask for NESTED fan-out: "review every directory in src/tools, and have each reviewer spawn a subagent per file it finds"',
435659
+ expect: "once ~20 agents are live the cap fires, and the refusal names agents.maxConcurrent so you can raise it",
435660
+ rationale: "Asking for 30 agents in one turn does NOT test this: MAX_CONCURRENT_TOOLS caps a single turn at 8, so the 20-agent limit is only reachable by nesting. An earlier version of this drill made that mistake and reported the wrong limit firing."
435661
+ },
435662
+ {
435663
+ id: "tool-result-pruning",
435664
+ feature: "context.pruneToolResults",
435665
+ kind: "manual",
435666
+ action: 'Run a long session that reads many large files (e.g. "read every file in src/services/api and summarise each"), then watch for the prune notice and check /context',
435667
+ expect: "a line reporting how many tool results were pruned and roughly how many tokens that freed; context stops climbing where it previously kept filling",
435668
+ rationale: "Pruning only fires inside a live query loop, so no automated drill can reach it. It is on by default and changes context for every session, which makes it the least-verified thing shipped."
435541
435669
  },
435542
435670
  {
435543
435671
  id: "btw-full-question",
@@ -633836,7 +633964,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
633836
633964
  smapsRollup,
633837
633965
  platform: process.platform,
633838
633966
  nodeVersion: process.version,
633839
- ccVersion: "1.62.0"
633967
+ ccVersion: "1.64.0"
633840
633968
  };
633841
633969
  }
633842
633970
  async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
@@ -634416,7 +634544,7 @@ var init_bridge_kick = __esm(() => {
634416
634544
  var call153 = async () => {
634417
634545
  return {
634418
634546
  type: "text",
634419
- value: "1.62.0"
634547
+ value: "1.64.0"
634420
634548
  };
634421
634549
  }, version2, version_default;
634422
634550
  var init_version = __esm(() => {
@@ -645487,7 +645615,7 @@ function generateHtmlReport(data, insights) {
645487
645615
  </html>`;
645488
645616
  }
645489
645617
  function buildExportData(data, insights, facets, remoteStats) {
645490
- const version3 = typeof MACRO !== "undefined" ? "1.62.0" : "unknown";
645618
+ const version3 = typeof MACRO !== "undefined" ? "1.64.0" : "unknown";
645491
645619
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
645492
645620
  const facets_summary = {
645493
645621
  total: facets.size,
@@ -649798,7 +649926,7 @@ var init_sessionStorage = __esm(() => {
649798
649926
  init_settings2();
649799
649927
  init_slowOperations();
649800
649928
  init_uuid();
649801
- VERSION7 = typeof MACRO !== "undefined" ? "1.62.0" : "unknown";
649929
+ VERSION7 = typeof MACRO !== "undefined" ? "1.64.0" : "unknown";
649802
649930
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
649803
649931
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
649804
649932
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -651013,7 +651141,7 @@ var init_filesystem = __esm(() => {
651013
651141
  });
651014
651142
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
651015
651143
  const nonce = randomBytes20(16).toString("hex");
651016
- return join232(getURTempDir(), "bundled-skills", "1.62.0", nonce);
651144
+ return join232(getURTempDir(), "bundled-skills", "1.64.0", nonce);
651017
651145
  });
651018
651146
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
651019
651147
  });
@@ -657308,7 +657436,7 @@ function computeFingerprint(messageText2, version3) {
657308
657436
  }
657309
657437
  function computeFingerprintFromMessages(messages) {
657310
657438
  const firstMessageText = extractFirstMessageText(messages);
657311
- return computeFingerprint(firstMessageText, "1.62.0");
657439
+ return computeFingerprint(firstMessageText, "1.64.0");
657312
657440
  }
657313
657441
  var FINGERPRINT_SALT = "59cf53e54c78";
657314
657442
  var init_fingerprint = () => {};
@@ -659204,7 +659332,7 @@ async function sideQuery(opts) {
659204
659332
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
659205
659333
  }
659206
659334
  const messageText2 = extractFirstUserMessageText(messages);
659207
- const fingerprint2 = computeFingerprint(messageText2, "1.62.0");
659335
+ const fingerprint2 = computeFingerprint(messageText2, "1.64.0");
659208
659336
  const attributionHeader = getAttributionHeader(fingerprint2);
659209
659337
  const systemBlocks = [
659210
659338
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -663975,7 +664103,7 @@ function buildSystemInitMessage(inputs) {
663975
664103
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
663976
664104
  apiKeySource: getURHQApiKeyWithSource().source,
663977
664105
  betas: getSdkBetas(),
663978
- ur_version: "1.62.0",
664106
+ ur_version: "1.64.0",
663979
664107
  output_style: outputStyle2,
663980
664108
  agents: inputs.agents.map((agent2) => agent2.agentType),
663981
664109
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
@@ -677835,7 +677963,7 @@ var init_useVoiceEnabled = __esm(() => {
677835
677963
  function getSemverPart(version3) {
677836
677964
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
677837
677965
  }
677838
- function useUpdateNotification(updatedVersion, initialVersion = "1.62.0") {
677966
+ function useUpdateNotification(updatedVersion, initialVersion = "1.64.0") {
677839
677967
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react222.useState(() => getSemverPart(initialVersion));
677840
677968
  if (!updatedVersion) {
677841
677969
  return null;
@@ -677884,7 +678012,7 @@ function AutoUpdater({
677884
678012
  return;
677885
678013
  }
677886
678014
  if (false) {}
677887
- const currentVersion = "1.62.0";
678015
+ const currentVersion = "1.64.0";
677888
678016
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
677889
678017
  let latestVersion = await getLatestVersion(channel);
677890
678018
  const isDisabled = isAutoUpdaterDisabled();
@@ -678113,12 +678241,12 @@ function NativeAutoUpdater({
678113
678241
  logEvent("tengu_native_auto_updater_start", {});
678114
678242
  try {
678115
678243
  const maxVersion = await getMaxVersion();
678116
- if (maxVersion && gt("1.62.0", maxVersion)) {
678244
+ if (maxVersion && gt("1.64.0", maxVersion)) {
678117
678245
  const msg = await getMaxVersionMessage();
678118
678246
  setMaxVersionIssue(msg ?? "affects your version");
678119
678247
  }
678120
678248
  const result = await installLatest(channel);
678121
- const currentVersion = "1.62.0";
678249
+ const currentVersion = "1.64.0";
678122
678250
  const latencyMs = Date.now() - startTime;
678123
678251
  if (result.lockFailed) {
678124
678252
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -678255,17 +678383,17 @@ function PackageManagerAutoUpdater(t0) {
678255
678383
  const maxVersion = await getMaxVersion();
678256
678384
  if (maxVersion && latest && gt(latest, maxVersion)) {
678257
678385
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
678258
- if (gte("1.62.0", maxVersion)) {
678259
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.62.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
678386
+ if (gte("1.64.0", maxVersion)) {
678387
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.64.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
678260
678388
  setUpdateAvailable(false);
678261
678389
  return;
678262
678390
  }
678263
678391
  latest = maxVersion;
678264
678392
  }
678265
- const hasUpdate = latest && !gte("1.62.0", latest) && !shouldSkipVersion(latest);
678393
+ const hasUpdate = latest && !gte("1.64.0", latest) && !shouldSkipVersion(latest);
678266
678394
  setUpdateAvailable(!!hasUpdate);
678267
678395
  if (hasUpdate) {
678268
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.62.0"} -> ${latest}`);
678396
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.64.0"} -> ${latest}`);
678269
678397
  }
678270
678398
  };
678271
678399
  $2[0] = t1;
@@ -678299,7 +678427,7 @@ function PackageManagerAutoUpdater(t0) {
678299
678427
  wrap: "truncate",
678300
678428
  children: [
678301
678429
  "currentVersion: ",
678302
- "1.62.0"
678430
+ "1.64.0"
678303
678431
  ]
678304
678432
  }, undefined, true, undefined, this);
678305
678433
  $2[3] = verbose;
@@ -688996,7 +689124,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
688996
689124
  project_dir: getOriginalCwd(),
688997
689125
  added_dirs: addedDirs
688998
689126
  },
688999
- version: "1.62.0",
689127
+ version: "1.64.0",
689000
689128
  output_style: {
689001
689129
  name: outputStyleName
689002
689130
  },
@@ -689079,7 +689207,7 @@ function StatusLineInner({
689079
689207
  const taskValues = Object.values(tasks2);
689080
689208
  const taskRunningCount = taskValues.filter((task2) => task2.status === "running" || task2.status === "pending").length;
689081
689209
  const defaultStatusLineText = buildDefaultStatusBar({
689082
- version: "1.62.0",
689210
+ version: "1.64.0",
689083
689211
  providerLabel: providerRuntime.providerLabel,
689084
689212
  authMode: providerRuntime.authLabel,
689085
689213
  model: providerRuntime.model ?? renderModelName(mainLoopModel),
@@ -701222,7 +701350,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
701222
701350
  } catch {}
701223
701351
  const data = {
701224
701352
  trigger: trigger2,
701225
- version: "1.62.0",
701353
+ version: "1.64.0",
701226
701354
  platform: process.platform,
701227
701355
  transcript,
701228
701356
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -713502,7 +713630,7 @@ function WelcomeV2() {
713502
713630
  dimColor: true,
713503
713631
  children: [
713504
713632
  "v",
713505
- "1.62.0"
713633
+ "1.64.0"
713506
713634
  ]
713507
713635
  }, undefined, true, undefined, this)
713508
713636
  ]
@@ -714762,7 +714890,7 @@ function completeOnboarding() {
714762
714890
  saveGlobalConfig((current) => ({
714763
714891
  ...current,
714764
714892
  hasCompletedOnboarding: true,
714765
- lastOnboardingVersion: "1.62.0"
714893
+ lastOnboardingVersion: "1.64.0"
714766
714894
  }));
714767
714895
  }
714768
714896
  function showDialog(root2, renderer) {
@@ -719806,7 +719934,7 @@ function appendToLog(path24, message) {
719806
719934
  cwd: getFsImplementation().cwd(),
719807
719935
  userType: process.env.USER_TYPE,
719808
719936
  sessionId: getSessionId(),
719809
- version: "1.62.0"
719937
+ version: "1.64.0"
719810
719938
  };
719811
719939
  getLogWriter(path24).write(messageWithTimestamp);
719812
719940
  }
@@ -723965,8 +724093,8 @@ async function getEnvLessBridgeConfig() {
723965
724093
  }
723966
724094
  async function checkEnvLessBridgeMinVersion() {
723967
724095
  const cfg = await getEnvLessBridgeConfig();
723968
- if (cfg.min_version && lt("1.62.0", cfg.min_version)) {
723969
- return `Your version of UR (${"1.62.0"}) is too old for Remote Control.
724096
+ if (cfg.min_version && lt("1.64.0", cfg.min_version)) {
724097
+ return `Your version of UR (${"1.64.0"}) is too old for Remote Control.
723970
724098
  Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
723971
724099
  }
723972
724100
  return null;
@@ -724440,7 +724568,7 @@ async function initBridgeCore(params) {
724440
724568
  const rawApi = createBridgeApiClient({
724441
724569
  baseUrl,
724442
724570
  getAccessToken,
724443
- runnerVersion: "1.62.0",
724571
+ runnerVersion: "1.64.0",
724444
724572
  onDebug: logForDebugging,
724445
724573
  onAuth401,
724446
724574
  getTrustedDeviceToken
@@ -733916,7 +734044,7 @@ function getAgUiCapabilities() {
733916
734044
  name: "UR-Nexus",
733917
734045
  type: "ur-nexus",
733918
734046
  description: "Provider-flexible, local-first autonomous engineering workflow agent.",
733919
- version: "1.62.0",
734047
+ version: "1.64.0",
733920
734048
  provider: "UR",
733921
734049
  documentationUrl: "https://github.com/Maitham16/UR/blob/master/docs/AG_UI.md"
733922
734050
  },
@@ -735056,7 +735184,7 @@ function createMCPServer(cwd4, debug2, verbose) {
735056
735184
  };
735057
735185
  const server2 = new Server({
735058
735186
  name: "ur-nexus",
735059
- version: "1.62.0"
735187
+ version: "1.64.0"
735060
735188
  }, {
735061
735189
  capabilities: {
735062
735190
  tools: {}
@@ -736214,7 +736342,7 @@ function thrownResponse(error40) {
736214
736342
  }
736215
736343
  async function createUrMcp2026Runtime(options4) {
736216
736344
  const server2 = createMCPServer(options4.cwd, options4.debug === true, options4.verbose === true);
736217
- const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.62.0" }, { capabilities: {} });
736345
+ const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.64.0" }, { capabilities: {} });
736218
736346
  const [clientTransport, serverTransport] = createLinkedTransportPair();
736219
736347
  try {
736220
736348
  await server2.connect(serverTransport);
@@ -736225,7 +736353,7 @@ async function createUrMcp2026Runtime(options4) {
736225
736353
  }
736226
736354
  const runtime2 = new Mcp2026Runtime({
736227
736355
  cwd: options4.cwd,
736228
- version: "1.62.0",
736356
+ version: "1.64.0",
736229
736357
  backend: {
736230
736358
  listTools: async () => {
736231
736359
  const listed = await client2.listTools();
@@ -738358,7 +738486,7 @@ async function update() {
738358
738486
  logEvent("tengu_update_check", {});
738359
738487
  const diagnostic2 = await getDoctorDiagnostic();
738360
738488
  const result = await checkUpgradeStatus({
738361
- currentVersion: "1.62.0",
738489
+ currentVersion: "1.64.0",
738362
738490
  packageName: UR_AGENT_PACKAGE_NAME,
738363
738491
  installationType: diagnostic2.installationType,
738364
738492
  latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
@@ -739674,7 +739802,7 @@ ${customInstructions}` : customInstructions;
739674
739802
  }
739675
739803
  }
739676
739804
  logForDiagnosticsNoPII("info", "started", {
739677
- version: "1.62.0",
739805
+ version: "1.64.0",
739678
739806
  is_native_binary: isInBundledMode()
739679
739807
  });
739680
739808
  registerCleanup(async () => {
@@ -740460,7 +740588,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
740460
740588
  pendingHookMessages
740461
740589
  }, renderAndRun);
740462
740590
  }
740463
- }).version("1.62.0 (UR-Nexus)", "-v, --version", "Output the version number");
740591
+ }).version("1.64.0 (UR-Nexus)", "-v, --version", "Output the version number");
740464
740592
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
740465
740593
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
740466
740594
  if (canUserConfigureAdvisor()) {
@@ -741512,7 +741640,7 @@ if (false) {}
741512
741640
  async function main2() {
741513
741641
  const args = process.argv.slice(2);
741514
741642
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
741515
- console.log(`${"1.62.0"} (UR-Nexus)`);
741643
+ console.log(`${"1.64.0"} (UR-Nexus)`);
741516
741644
  return;
741517
741645
  }
741518
741646
  if (args[0] === "a2a" && args[1] === "serve" && !args.includes("--help") && !args.includes("-h")) {
@@ -45,7 +45,7 @@
45
45
  <main id="content" class="content">
46
46
  <header class="topbar">
47
47
  <div>
48
- <p class="eyebrow">Version 1.62.0</p>
48
+ <p class="eyebrow">Version 1.64.0</p>
49
49
  <h1>UR-Nexus Documentation</h1>
50
50
  <p class="lead">A practical, tutorial-style reference for installing, configuring, automating, extending, and operating UR-Nexus.</p>
51
51
  </div>
@@ -7,7 +7,7 @@ plugins {
7
7
  }
8
8
 
9
9
  group = "dev.urnexus"
10
- version = "1.62.0"
10
+ version = "1.64.0"
11
11
 
12
12
  repositories {
13
13
  mavenCentral()
@@ -2,7 +2,7 @@
2
2
  "name": "ur-inline-diffs",
3
3
  "displayName": "UR Inline Diffs",
4
4
  "description": "Review, apply, and reject UR inline diff bundles from .ur/ide/diffs inside VS Code.",
5
- "version": "1.62.0",
5
+ "version": "1.64.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.62.0",
3
+ "version": "1.64.0",
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",
@@ -84,7 +84,7 @@
84
84
  "@ag-ui/core": "0.0.57",
85
85
  "@ag-ui/encoder": "0.0.57",
86
86
  "diff2html": "^3.4.56",
87
- "playwright-core": "^1.62.0",
87
+ "playwright-core": "^1.64.0",
88
88
  "sharp": "^0.35.3"
89
89
  },
90
90
  "devDependencies": {