ur-agent 1.65.2 → 1.65.4

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,37 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.65.4
4
+
5
+ - A tool call that keeps failing identically is now stopped. A 4B model refused
6
+ once by the task-list gate answered by emitting `Write` with no arguments
7
+ repeatedly, and nothing intervened — the trajectory grader names this pattern
8
+ but only after a run has ended, so it could grade the wreck and never prevent
9
+ it. Three identical failures are refused with instructions to change course;
10
+ six abort the turn, because otherwise a model that ignores the refusal simply
11
+ loops on the refusal instead.
12
+ - The signature is tool name plus input, so a corrected retry is never
13
+ penalised — that is precisely the recovery a refusal asks for. Both the
14
+ task-list gate and input validation feed the counter; the observed loop was
15
+ rejected by validation every time, so recording only gate refusals would have
16
+ left the guard counting zero.
17
+
18
+ ## 1.65.3
19
+
20
+ - Removed two tips for things that do not exist: `/mobile to use UR from the
21
+ UR app on your phone` (no such command, no such app) and a pointer to
22
+ `ur.ai/web` (no DNS record, same dead domain class as the `ur.com` links
23
+ removed earlier). Tips are the first thing a new user reads, so a tip for
24
+ something that is not there is the worst place to be wrong.
25
+ - Added short tips covering the command surface that was going unnoticed —
26
+ spec-driven development, compiler-accurate renames, semantic code search,
27
+ crews and arenas, evals, guardrails, the audit trail, the security suite,
28
+ research and multimodal commands, and the tools added this week. One line
29
+ each: the goal is recall, not documentation.
30
+ - Added `test/tipsAreReal.test.ts`: every command a tip names must exist in the
31
+ slash-command reference, and no tip may reference a domain UR does not own.
32
+ It also asserts the checker finds real citations, so it cannot start passing
33
+ vacuously on an empty match.
34
+
3
35
  ## 1.65.2
4
36
 
5
37
  - Fixed `--discover-ollama` having no effect on model discovery or requests.
package/dist/cli.js CHANGED
@@ -75238,7 +75238,7 @@ var init_auth = __esm(() => {
75238
75238
 
75239
75239
  // src/utils/userAgent.ts
75240
75240
  function getURCodeUserAgent() {
75241
- return `ur/${"1.65.2"}`;
75241
+ return `ur/${"1.65.4"}`;
75242
75242
  }
75243
75243
 
75244
75244
  // src/utils/workloadContext.ts
@@ -75260,7 +75260,7 @@ function getUserAgent() {
75260
75260
  const clientApp = process.env.UR_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}` : "";
75261
75261
  const workload = getWorkload();
75262
75262
  const workloadSuffix = workload ? `, workload/${workload}` : "";
75263
- return `ur-cli/${"1.65.2"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
75263
+ return `ur-cli/${"1.65.4"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
75264
75264
  }
75265
75265
  function getMCPUserAgent() {
75266
75266
  const parts = [];
@@ -75274,7 +75274,7 @@ function getMCPUserAgent() {
75274
75274
  parts.push(`client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}`);
75275
75275
  }
75276
75276
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
75277
- return `ur/${"1.65.2"}${suffix}`;
75277
+ return `ur/${"1.65.4"}${suffix}`;
75278
75278
  }
75279
75279
  function getWebFetchUserAgent() {
75280
75280
  return `UR-User (${getURCodeUserAgent()})`;
@@ -75412,7 +75412,7 @@ var init_user = __esm(() => {
75412
75412
  deviceId,
75413
75413
  sessionId: getSessionId(),
75414
75414
  email: getEmail(),
75415
- appVersion: "1.65.2",
75415
+ appVersion: "1.65.4",
75416
75416
  platform: getHostPlatformForAnalytics(),
75417
75417
  organizationUuid,
75418
75418
  accountUuid,
@@ -83612,7 +83612,7 @@ var init_metadata = __esm(() => {
83612
83612
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
83613
83613
  WHITESPACE_REGEX = /\s+/;
83614
83614
  getVersionBase = memoize_default(() => {
83615
- const match = "1.65.2".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
83615
+ const match = "1.65.4".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
83616
83616
  return match ? match[0] : undefined;
83617
83617
  });
83618
83618
  buildEnvContext = memoize_default(async () => {
@@ -83652,7 +83652,7 @@ var init_metadata = __esm(() => {
83652
83652
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
83653
83653
  isURCodeAction: isEnvTruthy(process.env.UR_CODE_ACTION),
83654
83654
  isURAiAuth: isURAISubscriber(),
83655
- version: "1.65.2",
83655
+ version: "1.65.4",
83656
83656
  versionBase: getVersionBase(),
83657
83657
  buildTime: "",
83658
83658
  deploymentEnvironment: env2.detectDeploymentEnvironment(),
@@ -84322,7 +84322,7 @@ function initialize1PEventLogging() {
84322
84322
  const platform2 = getPlatform();
84323
84323
  const attributes = {
84324
84324
  [import_semantic_conventions4.ATTR_SERVICE_NAME]: "ur",
84325
- [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.65.2"
84325
+ [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.65.4"
84326
84326
  };
84327
84327
  if (platform2 === "wsl") {
84328
84328
  const wslVersion = getWslVersion();
@@ -84350,7 +84350,7 @@ function initialize1PEventLogging() {
84350
84350
  })
84351
84351
  ]
84352
84352
  });
84353
- firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.65.2");
84353
+ firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.65.4");
84354
84354
  }
84355
84355
  async function reinitialize1PEventLoggingIfConfigChanged() {
84356
84356
  if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
@@ -94205,7 +94205,7 @@ function formatAgentTrendReport(report = buildAgentTrendReport()) {
94205
94205
  function formatA2AAgentCard(options = {}, pretty = true) {
94206
94206
  return JSON.stringify(buildA2AAgentCard(options), null, pretty ? 2 : 0);
94207
94207
  }
94208
- var urVersion = "1.65.2", researchSnapshotDate = "2026-07-15", coverage, priorityRoadmap;
94208
+ var urVersion = "1.65.4", researchSnapshotDate = "2026-07-15", coverage, priorityRoadmap;
94209
94209
  var init_trends = __esm(() => {
94210
94210
  init_a2aCardSignature();
94211
94211
  coverage = [
@@ -97008,7 +97008,7 @@ function getAttributionHeader(fingerprint) {
97008
97008
  if (!isAttributionHeaderEnabled()) {
97009
97009
  return "";
97010
97010
  }
97011
- const version2 = `${"1.65.2"}.${fingerprint}`;
97011
+ const version2 = `${"1.65.4"}.${fingerprint}`;
97012
97012
  const entrypoint = process.env.UR_CODE_ENTRYPOINT ?? "unknown";
97013
97013
  const cch = "";
97014
97014
  const workload = getWorkload();
@@ -154772,7 +154772,7 @@ var init_projectSafety = __esm(() => {
154772
154772
  function getInstruments() {
154773
154773
  if (instruments)
154774
154774
  return instruments;
154775
- const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.65.2");
154775
+ const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.65.4");
154776
154776
  instruments = {
154777
154777
  operationDuration: meter.createHistogram("gen_ai.client.operation.duration", {
154778
154778
  description: "GenAI operation duration.",
@@ -154870,7 +154870,7 @@ function genAiAgentAttributes() {
154870
154870
  "gen_ai.operation.name": GEN_AI_OPERATION_INVOKE_AGENT,
154871
154871
  "gen_ai.provider.name": "ur",
154872
154872
  "gen_ai.agent.name": "UR-Nexus",
154873
- "gen_ai.agent.version": "1.65.2"
154873
+ "gen_ai.agent.version": "1.65.4"
154874
154874
  };
154875
154875
  }
154876
154876
  function genAiWorkflowAttributes(workflowName) {
@@ -154886,7 +154886,7 @@ function genAiWorkflowAttributes(workflowName) {
154886
154886
  function startGenAiWorkflowSpan(workflowName) {
154887
154887
  const attributes = genAiWorkflowAttributes(workflowName);
154888
154888
  const name = typeof attributes["gen_ai.workflow.name"] === "string" ? `invoke_workflow ${attributes["gen_ai.workflow.name"]}` : GEN_AI_OPERATION_INVOKE_WORKFLOW;
154889
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.65.2").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
154889
+ return import_api10.trace.getTracer("ur-agent.gen_ai", "1.65.4").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
154890
154890
  }
154891
154891
  function endGenAiWorkflowSpan(span, options2 = {}) {
154892
154892
  try {
@@ -154924,7 +154924,7 @@ function startGenAiMemorySpan(operation, options2 = {}) {
154924
154924
  if (options2.recordCount !== undefined && Number.isInteger(options2.recordCount) && options2.recordCount >= 0) {
154925
154925
  attributes["gen_ai.memory.record.count"] = options2.recordCount;
154926
154926
  }
154927
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.65.2").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
154927
+ return import_api10.trace.getTracer("ur-agent.gen_ai", "1.65.4").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
154928
154928
  }
154929
154929
  function endGenAiMemorySpan(span, options2 = {}) {
154930
154930
  try {
@@ -206443,7 +206443,7 @@ function getTelemetryAttributes() {
206443
206443
  attributes["session.id"] = sessionId;
206444
206444
  }
206445
206445
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
206446
- attributes["app.version"] = "1.65.2";
206446
+ attributes["app.version"] = "1.65.4";
206447
206447
  }
206448
206448
  const oauthAccount = getOauthAccountInfo();
206449
206449
  if (oauthAccount) {
@@ -252980,7 +252980,7 @@ function getInstallationEnv() {
252980
252980
  return;
252981
252981
  }
252982
252982
  function getURCodeVersion() {
252983
- return "1.65.2";
252983
+ return "1.65.4";
252984
252984
  }
252985
252985
  async function getInstalledVSCodeExtensionVersion(command) {
252986
252986
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -260311,7 +260311,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
260311
260311
  const client2 = new Client({
260312
260312
  name: "ur",
260313
260313
  title: "UR",
260314
- version: "1.65.2",
260314
+ version: "1.65.4",
260315
260315
  description: "UR-Nexus autonomous engineering workflow engine",
260316
260316
  websiteUrl: PRODUCT_URL
260317
260317
  }, {
@@ -260671,7 +260671,7 @@ var init_client5 = __esm(() => {
260671
260671
  const client2 = new Client({
260672
260672
  name: "ur",
260673
260673
  title: "UR",
260674
- version: "1.65.2",
260674
+ version: "1.65.4",
260675
260675
  description: "UR-Nexus autonomous engineering workflow engine",
260676
260676
  websiteUrl: PRODUCT_URL
260677
260677
  }, {
@@ -273272,7 +273272,7 @@ async function createRuntime() {
273272
273272
  bootstrapTelemetry();
273273
273273
  const resource = defaultResource().merge(detectResources({ detectors: [envDetector] })).merge(resourceFromAttributes({
273274
273274
  [import_semantic_conventions7.ATTR_SERVICE_NAME]: "ur-agent",
273275
- [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.65.2"
273275
+ [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.65.4"
273276
273276
  }));
273277
273277
  const tracerProvider = exporters.traces.length > 0 ? new BasicTracerProvider({
273278
273278
  resource,
@@ -273305,11 +273305,11 @@ async function createRuntime() {
273305
273305
  setMeterProvider(meterProvider);
273306
273306
  setLoggerProvider(loggerProvider);
273307
273307
  if (meterProvider) {
273308
- const meter = meterProvider.getMeter("ur-agent", "1.65.2");
273308
+ const meter = meterProvider.getMeter("ur-agent", "1.65.4");
273309
273309
  setMeter(meter, (name, options2) => meter.createCounter(name, options2));
273310
273310
  }
273311
273311
  if (loggerProvider) {
273312
- setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.65.2"));
273312
+ setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.65.4"));
273313
273313
  }
273314
273314
  if (!cleanupRegistered2) {
273315
273315
  cleanupRegistered2 = true;
@@ -273971,9 +273971,9 @@ async function assertMinVersion() {
273971
273971
  if (false) {}
273972
273972
  try {
273973
273973
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
273974
- if (versionConfig.minVersion && lt("1.65.2", versionConfig.minVersion)) {
273974
+ if (versionConfig.minVersion && lt("1.65.4", versionConfig.minVersion)) {
273975
273975
  console.error(`
273976
- It looks like your version of UR (${"1.65.2"}) needs an update.
273976
+ It looks like your version of UR (${"1.65.4"}) needs an update.
273977
273977
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
273978
273978
 
273979
273979
  To update, please run:
@@ -274189,7 +274189,7 @@ async function installGlobalPackage(specificVersion) {
274189
274189
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
274190
274190
  logEvent("tengu_auto_updater_lock_contention", {
274191
274191
  pid: process.pid,
274192
- currentVersion: "1.65.2"
274192
+ currentVersion: "1.65.4"
274193
274193
  });
274194
274194
  return "in_progress";
274195
274195
  }
@@ -274198,7 +274198,7 @@ async function installGlobalPackage(specificVersion) {
274198
274198
  if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
274199
274199
  logError2(new Error("Windows NPM detected in WSL environment"));
274200
274200
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
274201
- currentVersion: "1.65.2"
274201
+ currentVersion: "1.65.4"
274202
274202
  });
274203
274203
  console.error(`
274204
274204
  Error: Windows NPM detected in WSL
@@ -274733,7 +274733,7 @@ function detectLinuxGlobPatternWarnings() {
274733
274733
  }
274734
274734
  async function getDoctorDiagnostic() {
274735
274735
  const installationType = await getCurrentInstallationType();
274736
- const version2 = typeof MACRO !== "undefined" ? "1.65.2" : "unknown";
274736
+ const version2 = typeof MACRO !== "undefined" ? "1.65.4" : "unknown";
274737
274737
  const installationPath = await getInstallationPath();
274738
274738
  const invokedBinary = getInvokedBinary();
274739
274739
  const multipleInstallations = await detectMultipleInstallations();
@@ -275668,8 +275668,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
275668
275668
  const maxVersion = await getMaxVersion();
275669
275669
  if (maxVersion && gt(version2, maxVersion)) {
275670
275670
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
275671
- if (gte("1.65.2", maxVersion)) {
275672
- logForDebugging(`Native installer: current version ${"1.65.2"} is already at or above maxVersion ${maxVersion}, skipping update`);
275671
+ if (gte("1.65.4", maxVersion)) {
275672
+ logForDebugging(`Native installer: current version ${"1.65.4"} is already at or above maxVersion ${maxVersion}, skipping update`);
275673
275673
  logEvent("tengu_native_update_skipped_max_version", {
275674
275674
  latency_ms: Date.now() - startTime,
275675
275675
  max_version: maxVersion,
@@ -275680,7 +275680,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
275680
275680
  version2 = maxVersion;
275681
275681
  }
275682
275682
  }
275683
- if (!forceReinstall && version2 === "1.65.2" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
275683
+ if (!forceReinstall && version2 === "1.65.4" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
275684
275684
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
275685
275685
  logEvent("tengu_native_update_complete", {
275686
275686
  latency_ms: Date.now() - startTime,
@@ -345975,7 +345975,7 @@ function isAnyTracingEnabled() {
345975
345975
  return isTelemetryEnabled() || isEnhancedTelemetryEnabled() || isBetaTracingEnabled();
345976
345976
  }
345977
345977
  function getTracer() {
345978
- return import_api39.trace.getTracer("ur-agent.gen_ai", "1.65.2");
345978
+ return import_api39.trace.getTracer("ur-agent.gen_ai", "1.65.4");
345979
345979
  }
345980
345980
  function createSpanAttributes(spanType, customAttributes = {}) {
345981
345981
  const baseAttributes = getTelemetryAttributes();
@@ -346680,6 +346680,46 @@ var init_taskListGate = __esm(() => {
346680
346680
  ]);
346681
346681
  });
346682
346682
 
346683
+ // src/services/tools/repeatedFailureGuard.ts
346684
+ function callSignature(toolName, input) {
346685
+ let serialized;
346686
+ try {
346687
+ serialized = JSON.stringify(input, Object.keys(input ?? {}).sort());
346688
+ } catch {
346689
+ serialized = "<unserializable>";
346690
+ }
346691
+ return `${toolName}:${serialized}`;
346692
+ }
346693
+ function recordCallFailure(signature) {
346694
+ const next = (failureCounts.get(signature) ?? 0) + 1;
346695
+ failureCounts.set(signature, next);
346696
+ return next;
346697
+ }
346698
+ function checkRepeatedFailure(signature, config2 = REPEATED_FAILURE_DEFAULTS) {
346699
+ const failures = failureCounts.get(signature) ?? 0;
346700
+ if (failures >= config2.abortAfter) {
346701
+ return {
346702
+ action: "abort",
346703
+ reason: `This exact call has failed ${failures} times and is still being ` + `repeated. Stopping the turn rather than continuing to loop.`
346704
+ };
346705
+ }
346706
+ if (failures >= config2.limit) {
346707
+ return {
346708
+ action: "refuse",
346709
+ reason: `This exact call has already failed ${failures} times with the same ` + `arguments, so it will fail again. Do not retry it unchanged. Either ` + `fix the arguments, use a different tool, or tell the user what is ` + `blocking you and stop.`
346710
+ };
346711
+ }
346712
+ return { action: "allow" };
346713
+ }
346714
+ var REPEATED_FAILURE_DEFAULTS, failureCounts;
346715
+ var init_repeatedFailureGuard = __esm(() => {
346716
+ REPEATED_FAILURE_DEFAULTS = {
346717
+ limit: 3,
346718
+ abortAfter: 6
346719
+ };
346720
+ failureCounts = new Map;
346721
+ });
346722
+
346683
346723
  // src/stability/types.ts
346684
346724
  var DEFAULT_LIMITS;
346685
346725
  var init_types12 = __esm(() => {
@@ -347710,6 +347750,32 @@ async function checkPermissionsAndCallTool(tool, toolUseID, input, toolUseContex
347710
347750
  }
347711
347751
  }
347712
347752
  }
347753
+ const callSig = callSignature(tool.name, input);
347754
+ const repeat2 = checkRepeatedFailure(callSig);
347755
+ if (repeat2.action !== "allow") {
347756
+ logEvent("tengu_repeated_failure_guard", {
347757
+ toolName: sanitizeToolNameForAnalytics(tool.name),
347758
+ action: repeat2.action
347759
+ });
347760
+ if (repeat2.action === "abort") {
347761
+ throw new Error(`Repeated tool failure: ${repeat2.reason}`);
347762
+ }
347763
+ return [
347764
+ {
347765
+ message: createUserMessage({
347766
+ content: [
347767
+ {
347768
+ type: "tool_result",
347769
+ content: `<tool_use_error>RepeatedFailure: ${repeat2.reason}</tool_use_error>`,
347770
+ is_error: true,
347771
+ tool_use_id: toolUseID
347772
+ }
347773
+ ]
347774
+ }),
347775
+ shouldSkipPermissionCheck: false
347776
+ }
347777
+ ];
347778
+ }
347713
347779
  const gate = checkTaskListGate({
347714
347780
  toolName: tool.name,
347715
347781
  taskCount: await countTasksForGate(),
@@ -347717,6 +347783,7 @@ async function checkPermissionsAndCallTool(tool, toolUseID, input, toolUseContex
347717
347783
  isSubagent: Boolean(toolUseContext.agentId)
347718
347784
  });
347719
347785
  if (!gate.allowed) {
347786
+ recordCallFailure(callSig);
347720
347787
  logEvent("tengu_task_list_gate_blocked", {
347721
347788
  toolName: sanitizeToolNameForAnalytics(tool.name)
347722
347789
  });
@@ -347737,6 +347804,7 @@ async function checkPermissionsAndCallTool(tool, toolUseID, input, toolUseContex
347737
347804
  ];
347738
347805
  }
347739
347806
  if (!parsedInput.success) {
347807
+ recordCallFailure(callSig);
347740
347808
  let errorContent = formatZodValidationError(tool.name, parsedInput.error);
347741
347809
  const schemaHint = buildSchemaNotSentHint(tool, toolUseContext.messages, toolUseContext.options.tools);
347742
347810
  if (schemaHint) {
@@ -348427,6 +348495,7 @@ var init_toolExecution = __esm(() => {
348427
348495
  init_toolResultStorage();
348428
348496
  init_toolSearch();
348429
348497
  init_taskListGate();
348498
+ init_repeatedFailureGuard();
348430
348499
  init_client5();
348431
348500
  init_mcpStringUtils();
348432
348501
  init_utils3();
@@ -375568,7 +375637,7 @@ function Feedback({
375568
375637
  platform: env2.platform,
375569
375638
  gitRepo: envInfo.isGit,
375570
375639
  terminal: env2.terminal,
375571
- version: "1.65.2",
375640
+ version: "1.65.4",
375572
375641
  transcript: normalizeMessagesForAPI(messages),
375573
375642
  errors: sanitizedErrors,
375574
375643
  lastApiRequest: getLastAPIRequest(),
@@ -375760,7 +375829,7 @@ function Feedback({
375760
375829
  ", ",
375761
375830
  env2.terminal,
375762
375831
  ", v",
375763
- "1.65.2"
375832
+ "1.65.4"
375764
375833
  ]
375765
375834
  }, undefined, true, undefined, this)
375766
375835
  ]
@@ -375866,7 +375935,7 @@ ${sanitizedDescription}
375866
375935
  ` + `**Environment Info**
375867
375936
  ` + `- Platform: ${env2.platform}
375868
375937
  ` + `- Terminal: ${env2.terminal}
375869
- ` + `- Version: ${"1.65.2"}
375938
+ ` + `- Version: ${"1.65.4"}
375870
375939
  ` + `- Feedback ID: ${feedbackId}
375871
375940
  ` + `
375872
375941
  **Errors**
@@ -378976,7 +379045,7 @@ function buildPrimarySection() {
378976
379045
  }, undefined, false, undefined, this);
378977
379046
  return [{
378978
379047
  label: "Version",
378979
- value: "1.65.2"
379048
+ value: "1.65.4"
378980
379049
  }, {
378981
379050
  label: "Session name",
378982
379051
  value: nameValue
@@ -382306,7 +382375,7 @@ function Config({
382306
382375
  }
382307
382376
  }, undefined, false, undefined, this)
382308
382377
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime179.jsxDEV(ChannelDowngradeDialog, {
382309
- currentVersion: "1.65.2",
382378
+ currentVersion: "1.65.4",
382310
382379
  onChoice: (choice) => {
382311
382380
  setShowSubmenu(null);
382312
382381
  setTabsHidden(false);
@@ -382318,7 +382387,7 @@ function Config({
382318
382387
  autoUpdatesChannel: "stable"
382319
382388
  };
382320
382389
  if (choice === "stay") {
382321
- newSettings.minimumVersion = "1.65.2";
382390
+ newSettings.minimumVersion = "1.65.4";
382322
382391
  }
382323
382392
  updateSettingsForSource("userSettings", newSettings);
382324
382393
  setSettingsData((prev_27) => ({
@@ -390382,7 +390451,7 @@ function HelpV2(t0) {
390382
390451
  let t6;
390383
390452
  if ($2[31] !== tabs) {
390384
390453
  t6 = /* @__PURE__ */ jsx_dev_runtime206.jsxDEV(Tabs, {
390385
- title: `UR v${"1.65.2"}`,
390454
+ title: `UR v${"1.65.4"}`,
390386
390455
  color: "professionalBlue",
390387
390456
  defaultTab: "general",
390388
390457
  children: tabs
@@ -391299,7 +391368,7 @@ function buildToolUseContext(tools, readFileStateCache, toolPermissionContext, a
391299
391368
  async function handleInitialize(options2) {
391300
391369
  return {
391301
391370
  name: "UR",
391302
- version: "1.65.2",
391371
+ version: "1.65.4",
391303
391372
  protocolVersion: "0.1.0",
391304
391373
  workspaceRoot: options2.cwd,
391305
391374
  capabilities: {
@@ -408407,7 +408476,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
408407
408476
  return [];
408408
408477
  }
408409
408478
  }
408410
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.65.2") {
408479
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.65.4") {
408411
408480
  if (process.env.USER_TYPE === "ant") {
408412
408481
  const changelog = "";
408413
408482
  if (changelog) {
@@ -408434,7 +408503,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.65.2")
408434
408503
  releaseNotes
408435
408504
  };
408436
408505
  }
408437
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.65.2") {
408506
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.65.4") {
408438
408507
  if (process.env.USER_TYPE === "ant") {
408439
408508
  const changelog = "";
408440
408509
  if (changelog) {
@@ -411291,7 +411360,7 @@ function getRecentActivitySync() {
411291
411360
  return cachedActivity;
411292
411361
  }
411293
411362
  function getLogoDisplayData() {
411294
- const version2 = process.env.DEMO_VERSION ?? "1.65.2";
411363
+ const version2 = process.env.DEMO_VERSION ?? "1.65.4";
411295
411364
  const serverUrl = getDirectConnectServerUrl();
411296
411365
  const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd());
411297
411366
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -412175,7 +412244,7 @@ function LogoV2() {
412175
412244
  if ($2[2] === Symbol.for("react.memo_cache_sentinel")) {
412176
412245
  t2 = () => {
412177
412246
  const currentConfig2 = getGlobalConfig();
412178
- if (currentConfig2.lastReleaseNotesSeen === "1.65.2") {
412247
+ if (currentConfig2.lastReleaseNotesSeen === "1.65.4") {
412179
412248
  return;
412180
412249
  }
412181
412250
  saveGlobalConfig(_temp327);
@@ -412860,12 +412929,12 @@ function LogoV2() {
412860
412929
  return t41;
412861
412930
  }
412862
412931
  function _temp327(current) {
412863
- if (current.lastReleaseNotesSeen === "1.65.2") {
412932
+ if (current.lastReleaseNotesSeen === "1.65.4") {
412864
412933
  return current;
412865
412934
  }
412866
412935
  return {
412867
412936
  ...current,
412868
- lastReleaseNotesSeen: "1.65.2"
412937
+ lastReleaseNotesSeen: "1.65.4"
412869
412938
  };
412870
412939
  }
412871
412940
  function _temp241(s_0) {
@@ -429663,7 +429732,7 @@ function compileAgenticCiWorkflow(specName = "default", options2 = {}) {
429663
429732
  if (spec.name !== specName) {
429664
429733
  throw new Error("Agentic CI workflow spec name does not match");
429665
429734
  }
429666
- const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.65.2" : "1.65.2");
429735
+ const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.65.4" : "1.65.4");
429667
429736
  if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(packageVersion)) {
429668
429737
  throw new Error("invalid ur-agent package version");
429669
429738
  }
@@ -430656,7 +430725,7 @@ runner; \`ur trigger\` is the inbound parser that decides what to run.
430656
430725
  path: ".github/workflows/ur.yml",
430657
430726
  root: "project",
430658
430727
  content: compileAgenticCiWorkflow("default", {
430659
- packageVersion: typeof MACRO !== "undefined" ? "1.65.2" : "1.65.2"
430728
+ packageVersion: typeof MACRO !== "undefined" ? "1.65.4" : "1.65.4"
430660
430729
  })
430661
430730
  },
430662
430731
  {
@@ -430719,7 +430788,7 @@ function value(tokens, flag) {
430719
430788
  return index2 >= 0 ? tokens[index2 + 1] : undefined;
430720
430789
  }
430721
430790
  function cliVersion() {
430722
- return typeof MACRO !== "undefined" ? "1.65.2" : "1.65.2";
430791
+ return typeof MACRO !== "undefined" ? "1.65.4" : "1.65.4";
430723
430792
  }
430724
430793
  function workflowPath(cwd2) {
430725
430794
  return join159(cwd2, ".github", "workflows", "ur-agentic-ci.yml");
@@ -436575,7 +436644,7 @@ function createAcpStdioApp(deps) {
436575
436644
  }
436576
436645
  },
436577
436646
  authMethods: [],
436578
- agentInfo: { name: "UR-Nexus", version: "1.65.2" }
436647
+ agentInfo: { name: "UR-Nexus", version: "1.65.4" }
436579
436648
  })).onRequest("authenticate", () => ({})).onRequest("session/new", async (context6) => {
436580
436649
  const result = runtime2.newSession(context6.params.cwd, context6.params.mcpServers, context6.params.additionalDirectories);
436581
436650
  await runtime2.announce({
@@ -436672,7 +436741,7 @@ function createAcpStdioAgent(deps) {
436672
436741
  }
436673
436742
  },
436674
436743
  authMethods: [],
436675
- agentInfo: { name: "UR-Nexus", version: "1.65.2" }
436744
+ agentInfo: { name: "UR-Nexus", version: "1.65.4" }
436676
436745
  });
436677
436746
  return;
436678
436747
  case "authenticate":
@@ -534920,13 +534989,13 @@ ${lanes.join(`
534920
534989
  }
534921
534990
  function instantiateTypeWithSingleGenericCallSignature(node, type, checkMode) {
534922
534991
  if (checkMode && checkMode & (2 | 8)) {
534923
- const callSignature = getSingleSignature(type, 0, true);
534992
+ const callSignature2 = getSingleSignature(type, 0, true);
534924
534993
  const constructSignature = getSingleSignature(type, 1, true);
534925
- const signature = callSignature || constructSignature;
534994
+ const signature = callSignature2 || constructSignature;
534926
534995
  if (signature && signature.typeParameters) {
534927
534996
  const contextualType = getApparentTypeOfContextualType(node, 2);
534928
534997
  if (contextualType) {
534929
- const contextualSignature = getSingleSignature(getNonNullableType(contextualType), callSignature ? 0 : 1, false);
534998
+ const contextualSignature = getSingleSignature(getNonNullableType(contextualType), callSignature2 ? 0 : 1, false);
534930
534999
  if (contextualSignature && !contextualSignature.typeParameters) {
534931
535000
  if (checkMode & 8) {
534932
535001
  skippedGenericFunction(node, checkMode);
@@ -645049,7 +645118,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
645049
645118
  smapsRollup,
645050
645119
  platform: process.platform,
645051
645120
  nodeVersion: process.version,
645052
- ccVersion: "1.65.2"
645121
+ ccVersion: "1.65.4"
645053
645122
  };
645054
645123
  }
645055
645124
  async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
@@ -645629,7 +645698,7 @@ var init_bridge_kick = __esm(() => {
645629
645698
  var call153 = async () => {
645630
645699
  return {
645631
645700
  type: "text",
645632
- value: "1.65.2"
645701
+ value: "1.65.4"
645633
645702
  };
645634
645703
  }, version2, version_default;
645635
645704
  var init_version = __esm(() => {
@@ -656700,7 +656769,7 @@ function generateHtmlReport(data, insights) {
656700
656769
  </html>`;
656701
656770
  }
656702
656771
  function buildExportData(data, insights, facets, remoteStats) {
656703
- const version3 = typeof MACRO !== "undefined" ? "1.65.2" : "unknown";
656772
+ const version3 = typeof MACRO !== "undefined" ? "1.65.4" : "unknown";
656704
656773
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
656705
656774
  const facets_summary = {
656706
656775
  total: facets.size,
@@ -661011,7 +661080,7 @@ var init_sessionStorage = __esm(() => {
661011
661080
  init_settings2();
661012
661081
  init_slowOperations();
661013
661082
  init_uuid();
661014
- VERSION7 = typeof MACRO !== "undefined" ? "1.65.2" : "unknown";
661083
+ VERSION7 = typeof MACRO !== "undefined" ? "1.65.4" : "unknown";
661015
661084
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
661016
661085
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
661017
661086
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -662226,7 +662295,7 @@ var init_filesystem = __esm(() => {
662226
662295
  });
662227
662296
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
662228
662297
  const nonce = randomBytes20(16).toString("hex");
662229
- return join232(getURTempDir(), "bundled-skills", "1.65.2", nonce);
662298
+ return join232(getURTempDir(), "bundled-skills", "1.65.4", nonce);
662230
662299
  });
662231
662300
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
662232
662301
  });
@@ -668521,7 +668590,7 @@ function computeFingerprint(messageText2, version3) {
668521
668590
  }
668522
668591
  function computeFingerprintFromMessages(messages) {
668523
668592
  const firstMessageText = extractFirstMessageText(messages);
668524
- return computeFingerprint(firstMessageText, "1.65.2");
668593
+ return computeFingerprint(firstMessageText, "1.65.4");
668525
668594
  }
668526
668595
  var FINGERPRINT_SALT = "59cf53e54c78";
668527
668596
  var init_fingerprint = () => {};
@@ -670417,7 +670486,7 @@ async function sideQuery(opts) {
670417
670486
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
670418
670487
  }
670419
670488
  const messageText2 = extractFirstUserMessageText(messages);
670420
- const fingerprint2 = computeFingerprint(messageText2, "1.65.2");
670489
+ const fingerprint2 = computeFingerprint(messageText2, "1.65.4");
670421
670490
  const attributionHeader = getAttributionHeader(fingerprint2);
670422
670491
  const systemBlocks = [
670423
670492
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -675188,7 +675257,7 @@ function buildSystemInitMessage(inputs) {
675188
675257
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
675189
675258
  apiKeySource: getURHQApiKeyWithSource().source,
675190
675259
  betas: getSdkBetas(),
675191
- ur_version: "1.65.2",
675260
+ ur_version: "1.65.4",
675192
675261
  output_style: outputStyle2,
675193
675262
  agents: inputs.agents.map((agent2) => agent2.agentType),
675194
675263
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
@@ -689048,7 +689117,7 @@ var init_useVoiceEnabled = __esm(() => {
689048
689117
  function getSemverPart(version3) {
689049
689118
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
689050
689119
  }
689051
- function useUpdateNotification(updatedVersion, initialVersion = "1.65.2") {
689120
+ function useUpdateNotification(updatedVersion, initialVersion = "1.65.4") {
689052
689121
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react222.useState(() => getSemverPart(initialVersion));
689053
689122
  if (!updatedVersion) {
689054
689123
  return null;
@@ -689097,7 +689166,7 @@ function AutoUpdater({
689097
689166
  return;
689098
689167
  }
689099
689168
  if (false) {}
689100
- const currentVersion = "1.65.2";
689169
+ const currentVersion = "1.65.4";
689101
689170
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
689102
689171
  let latestVersion = await getLatestVersion(channel);
689103
689172
  const isDisabled = isAutoUpdaterDisabled();
@@ -689326,12 +689395,12 @@ function NativeAutoUpdater({
689326
689395
  logEvent("tengu_native_auto_updater_start", {});
689327
689396
  try {
689328
689397
  const maxVersion = await getMaxVersion();
689329
- if (maxVersion && gt("1.65.2", maxVersion)) {
689398
+ if (maxVersion && gt("1.65.4", maxVersion)) {
689330
689399
  const msg = await getMaxVersionMessage();
689331
689400
  setMaxVersionIssue(msg ?? "affects your version");
689332
689401
  }
689333
689402
  const result = await installLatest(channel);
689334
- const currentVersion = "1.65.2";
689403
+ const currentVersion = "1.65.4";
689335
689404
  const latencyMs = Date.now() - startTime;
689336
689405
  if (result.lockFailed) {
689337
689406
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -689468,17 +689537,17 @@ function PackageManagerAutoUpdater(t0) {
689468
689537
  const maxVersion = await getMaxVersion();
689469
689538
  if (maxVersion && latest && gt(latest, maxVersion)) {
689470
689539
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
689471
- if (gte("1.65.2", maxVersion)) {
689472
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.65.2"} is already at or above maxVersion ${maxVersion}, skipping update`);
689540
+ if (gte("1.65.4", maxVersion)) {
689541
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.65.4"} is already at or above maxVersion ${maxVersion}, skipping update`);
689473
689542
  setUpdateAvailable(false);
689474
689543
  return;
689475
689544
  }
689476
689545
  latest = maxVersion;
689477
689546
  }
689478
- const hasUpdate = latest && !gte("1.65.2", latest) && !shouldSkipVersion(latest);
689547
+ const hasUpdate = latest && !gte("1.65.4", latest) && !shouldSkipVersion(latest);
689479
689548
  setUpdateAvailable(!!hasUpdate);
689480
689549
  if (hasUpdate) {
689481
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.65.2"} -> ${latest}`);
689550
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.65.4"} -> ${latest}`);
689482
689551
  }
689483
689552
  };
689484
689553
  $2[0] = t1;
@@ -689512,7 +689581,7 @@ function PackageManagerAutoUpdater(t0) {
689512
689581
  wrap: "truncate",
689513
689582
  children: [
689514
689583
  "currentVersion: ",
689515
- "1.65.2"
689584
+ "1.65.4"
689516
689585
  ]
689517
689586
  }, undefined, true, undefined, this);
689518
689587
  $2[3] = verbose;
@@ -700209,7 +700278,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
700209
700278
  project_dir: getOriginalCwd(),
700210
700279
  added_dirs: addedDirs
700211
700280
  },
700212
- version: "1.65.2",
700281
+ version: "1.65.4",
700213
700282
  output_style: {
700214
700283
  name: outputStyleName
700215
700284
  },
@@ -700292,7 +700361,7 @@ function StatusLineInner({
700292
700361
  const taskValues = Object.values(tasks2);
700293
700362
  const taskRunningCount = taskValues.filter((task2) => task2.status === "running" || task2.status === "pending").length;
700294
700363
  const defaultStatusLineText = buildDefaultStatusBar({
700295
- version: "1.65.2",
700364
+ version: "1.65.4",
700296
700365
  providerLabel: providerRuntime.providerLabel,
700297
700366
  authMode: providerRuntime.authLabel,
700298
700367
  model: providerRuntime.model ?? renderModelName(mainLoopModel),
@@ -712435,7 +712504,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
712435
712504
  } catch {}
712436
712505
  const data = {
712437
712506
  trigger: trigger2,
712438
- version: "1.65.2",
712507
+ version: "1.65.4",
712439
712508
  platform: process.platform,
712440
712509
  transcript,
712441
712510
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -714679,16 +714748,101 @@ var init_tipRegistry = __esm(() => {
714679
714748
  },
714680
714749
  {
714681
714750
  id: "web-app",
714682
- content: async () => "Run tasks in the cloud while you keep coding locally \xB7 ur.ai/web",
714751
+ content: async () => '/cloud run "<task>" to run a task in an isolated worktree while you keep coding',
714683
714752
  cooldownSessions: 15,
714684
714753
  isRelevant: async () => true
714685
714754
  },
714686
714755
  {
714687
- id: "mobile-app",
714688
- content: async () => "/mobile to use UR from the UR app on your phone",
714756
+ id: "model-doctor-capabilities",
714757
+ content: async () => "ur model-doctor shows which local models can actually use tools and vision \u2014 a model without tools will describe work instead of doing it",
714758
+ cooldownSessions: 12,
714759
+ isRelevant: async () => true
714760
+ },
714761
+ {
714762
+ id: "selftest-drills",
714763
+ content: async () => "ur selftest run checks the shipped binary end to end after an upgrade, and prints the checks that need a live model",
714764
+ cooldownSessions: 15,
714765
+ isRelevant: async () => true
714766
+ },
714767
+ {
714768
+ id: "sources-provenance",
714769
+ content: async () => '/sources lists every page and MCP result that entered this session \xB7 /sources --check "<claim>" says whether it came from one',
714770
+ cooldownSessions: 12,
714771
+ isRelevant: async () => true
714772
+ },
714773
+ {
714774
+ id: "agent-inspect-costs",
714775
+ content: async () => "ur agent-inspect --costs breaks a fan-out down per agent, labelled with what each one was doing",
714689
714776
  cooldownSessions: 15,
714690
714777
  isRelevant: async () => true
714691
714778
  },
714779
+ {
714780
+ id: "memory-integrity",
714781
+ content: async () => "ur memory-integrity record then verify detects memory files edited, deleted, or dropped in by something other than UR",
714782
+ cooldownSessions: 20,
714783
+ isRelevant: async () => true
714784
+ },
714785
+ {
714786
+ id: "grade-trajectory",
714787
+ content: async () => "ur grade-trajectory --file <transcript.jsonl> --min-score 70 grades how a run worked, not just what it concluded, and exits non-zero to gate CI",
714788
+ cooldownSessions: 20,
714789
+ isRelevant: async () => true
714790
+ },
714791
+ {
714792
+ id: "ci-loop-heal",
714793
+ content: async () => 'ur ci-loop --command "bun test" fixes failures and reruns until green',
714794
+ cooldownSessions: 12,
714795
+ isRelevant: async () => true
714796
+ },
714797
+ ...[
714798
+ ["spec-driven", "/spec init <name> \u2014 requirements \u2192 design \u2192 tasks, run with proof gates"],
714799
+ ["repo-edit", "/repo-edit rename <sym> --to <new> \u2014 compiler-accurate rename with rollback"],
714800
+ ["code-index", '/code-index search "<idea>" \u2014 semantic search over your code, local embeddings'],
714801
+ ["knowledge", "/knowledge add <file> then /knowledge search \u2014 curated notes with provenance"],
714802
+ ["context-pack", "/context-pack \u2014 scan architecture, record decisions and constraints under .ur/"],
714803
+ ["semantic-memory", '/semantic-memory search "<topic>" \u2014 search past memory by meaning'],
714804
+ ["remember", "/remember <fact> \u2014 store a durable preference \xB7 /forget to remove it"],
714805
+ ["wiki", "/wiki generate \u2014 living repo wiki plus a prompt-injected repo map"],
714806
+ ["crew", "/crew create <name> --workers 3 \u2014 lead splits a goal, workers claim tasks"],
714807
+ ["arena", '/arena "<task>" --agents 3 \u2014 N attempts in isolated worktrees, judged'],
714808
+ ["pattern", '/pattern run debate "<question>" \u2014 PEER, debate, handoff and parallel patterns'],
714809
+ ["goal", '/goal add <name> --objective "<x>" \u2014 objectives that persist across sessions'],
714810
+ ["bg", '/bg run "<task>" \u2014 detached local agent you can steer, log and kill'],
714811
+ ["worktree", "/task start <name> --worktree \u2014 isolated branch per task, PR handoff"],
714812
+ ["eval", "/eval run <suite> --repeat 3 \u2014 replayable graded cases with CI gates"],
714813
+ ["test-first", "/test-first run \u2014 detect the stack, then compile/test/lint loops"],
714814
+ ["guardrails", '/guardrails check "<text>" \u2014 regex, PII and LLM rules with tripwires'],
714815
+ ["audit", "/audit export --format csv \u2014 hash-chained trail with tamper verification"],
714816
+ ["security-suite", "/security scan \u2014 secrets, threat model, dependency vulnerabilities"],
714817
+ ["sandbox", '/sandbox eval "<command>" \u2014 see what the OS sandbox would allow'],
714818
+ ["permission-profile", "/permission-profile use <name> \u2014 switch a named permission set"],
714819
+ ["escalate", '/escalate run "<task>" \u2014 fast model, escalating hard steps to an oracle'],
714820
+ ["model-route", '/model-route "<task>" \u2014 pick the model that fits the work'],
714821
+ ["advisor", "/advisor <model> \u2014 a second model critiques the main one"],
714822
+ ["rewind", "/rewind \u2014 restore code and conversation to an earlier checkpoint"],
714823
+ ["undo", "/undo \u2014 revert the last file edit, including a file it created"],
714824
+ ["diff", "/diff \u2014 uncommitted changes and per-turn diffs"],
714825
+ ["trace", "/trace \u2014 what the last turns actually called, with results"],
714826
+ ["research", "/research, /paper, /cite, /graph \u2014 notes, papers and a claim graph"],
714827
+ ["multimodal", "/image, /video, /youtube, /pdf \u2014 inspect media and documents"],
714828
+ ["browser", '/browser "<url> <task>" \u2014 drive a real browser \xB7 /browser-qa to replay'],
714829
+ ["mcp", "/mcp \u2014 connect MCP servers \xB7 /plugin for plugins and marketplaces"],
714830
+ ["skills", "/skill run <name> \xB7 /create-skill <name> \u2014 reusable workflows"],
714831
+ ["toolsmith", "/toolsmith <name> python \u2014 scaffold a local helper tool UR can run"],
714832
+ ["workflow", "/workflow run <name> \u2014 declarative steps with dependencies"],
714833
+ ["automation", '/automation create <name> --schedule "0 3 * * *" \u2014 project-local cron'],
714834
+ ["devcontainer", "/devcontainer exec -- <cmd> \u2014 run in a reproducible container"],
714835
+ ["ur-doctor", "/ur-doctor \u2014 full health check: tools, Ollama, .ur, MCP, Playwright"],
714836
+ ["dna", "/dna \u2014 detect language, package manager, build, test and lint"],
714837
+ ["statusline", "/statusline \u2014 put model, branch and context in your prompt"],
714838
+ ["speak", "/speak <text> \u2014 read a line aloud with the system voice"],
714839
+ ["computer", "/computer screenshot \u2014 desktop control; changes need --yes"]
714840
+ ].map(([id, text]) => ({
714841
+ id: `cmd-${id}`,
714842
+ content: async () => text,
714843
+ cooldownSessions: 25,
714844
+ isRelevant: async () => true
714845
+ })),
714692
714846
  {
714693
714847
  id: "modelOplan-mode-reminder",
714694
714848
  content: async () => `Your default model setting is plan mode. Press ${getShortcutDisplay("chat:cycleMode", "Chat", "shift+tab")} twice to activate Plan Mode.`,
@@ -724715,7 +724869,7 @@ function WelcomeV2() {
724715
724869
  dimColor: true,
724716
724870
  children: [
724717
724871
  "v",
724718
- "1.65.2"
724872
+ "1.65.4"
724719
724873
  ]
724720
724874
  }, undefined, true, undefined, this)
724721
724875
  ]
@@ -725975,7 +726129,7 @@ function completeOnboarding() {
725975
726129
  saveGlobalConfig((current) => ({
725976
726130
  ...current,
725977
726131
  hasCompletedOnboarding: true,
725978
- lastOnboardingVersion: "1.65.2"
726132
+ lastOnboardingVersion: "1.65.4"
725979
726133
  }));
725980
726134
  }
725981
726135
  function showDialog(root2, renderer) {
@@ -731019,7 +731173,7 @@ function appendToLog(path24, message) {
731019
731173
  cwd: getFsImplementation().cwd(),
731020
731174
  userType: process.env.USER_TYPE,
731021
731175
  sessionId: getSessionId(),
731022
- version: "1.65.2"
731176
+ version: "1.65.4"
731023
731177
  };
731024
731178
  getLogWriter(path24).write(messageWithTimestamp);
731025
731179
  }
@@ -731799,7 +731953,7 @@ function createTokenRefreshScheduler({
731799
731953
  refreshBufferMs = TOKEN_REFRESH_BUFFER_MS
731800
731954
  }) {
731801
731955
  const timers = new Map;
731802
- const failureCounts = new Map;
731956
+ const failureCounts2 = new Map;
731803
731957
  const generations = new Map;
731804
731958
  function nextGeneration(sessionId) {
731805
731959
  const gen = (generations.get(sessionId) ?? 0) + 1;
@@ -731850,8 +732004,8 @@ function createTokenRefreshScheduler({
731850
732004
  return;
731851
732005
  }
731852
732006
  if (!oauthToken) {
731853
- const failures = (failureCounts.get(sessionId) ?? 0) + 1;
731854
- failureCounts.set(sessionId, failures);
732007
+ const failures = (failureCounts2.get(sessionId) ?? 0) + 1;
732008
+ failureCounts2.set(sessionId, failures);
731855
732009
  logForDebugging(`[${label}:token] No OAuth token available for refresh, sessionId=${sessionId} (failure ${failures}/${MAX_REFRESH_FAILURES})`, { level: "error" });
731856
732010
  logForDiagnosticsNoPII("error", "bridge_token_refresh_no_oauth");
731857
732011
  if (failures < MAX_REFRESH_FAILURES) {
@@ -731860,7 +732014,7 @@ function createTokenRefreshScheduler({
731860
732014
  }
731861
732015
  return;
731862
732016
  }
731863
- failureCounts.delete(sessionId);
732017
+ failureCounts2.delete(sessionId);
731864
732018
  logForDebugging(`[${label}:token] Refreshing token for sessionId=${sessionId}: new token prefix=${oauthToken.slice(0, 15)}\u2026`);
731865
732019
  logEvent("tengu_bridge_token_refreshed", {});
731866
732020
  onRefresh(sessionId, oauthToken);
@@ -731875,7 +732029,7 @@ function createTokenRefreshScheduler({
731875
732029
  clearTimeout(timer);
731876
732030
  timers.delete(sessionId);
731877
732031
  }
731878
- failureCounts.delete(sessionId);
732032
+ failureCounts2.delete(sessionId);
731879
732033
  }
731880
732034
  function cancelAll() {
731881
732035
  for (const sessionId of generations.keys()) {
@@ -731885,7 +732039,7 @@ function createTokenRefreshScheduler({
731885
732039
  clearTimeout(timer);
731886
732040
  }
731887
732041
  timers.clear();
731888
- failureCounts.clear();
732042
+ failureCounts2.clear();
731889
732043
  }
731890
732044
  return { schedule: schedule2, scheduleFromExpiresIn, cancel, cancelAll };
731891
732045
  }
@@ -735178,8 +735332,8 @@ async function getEnvLessBridgeConfig() {
735178
735332
  }
735179
735333
  async function checkEnvLessBridgeMinVersion() {
735180
735334
  const cfg = await getEnvLessBridgeConfig();
735181
- if (cfg.min_version && lt("1.65.2", cfg.min_version)) {
735182
- return `Your version of UR (${"1.65.2"}) is too old for Remote Control.
735335
+ if (cfg.min_version && lt("1.65.4", cfg.min_version)) {
735336
+ return `Your version of UR (${"1.65.4"}) is too old for Remote Control.
735183
735337
  Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
735184
735338
  }
735185
735339
  return null;
@@ -735653,7 +735807,7 @@ async function initBridgeCore(params) {
735653
735807
  const rawApi = createBridgeApiClient({
735654
735808
  baseUrl,
735655
735809
  getAccessToken,
735656
- runnerVersion: "1.65.2",
735810
+ runnerVersion: "1.65.4",
735657
735811
  onDebug: logForDebugging,
735658
735812
  onAuth401,
735659
735813
  getTrustedDeviceToken
@@ -745126,7 +745280,7 @@ function getAgUiCapabilities() {
745126
745280
  name: "UR-Nexus",
745127
745281
  type: "ur-nexus",
745128
745282
  description: "Provider-flexible, local-first autonomous engineering workflow agent.",
745129
- version: "1.65.2",
745283
+ version: "1.65.4",
745130
745284
  provider: "UR",
745131
745285
  documentationUrl: "https://github.com/Maitham16/UR/blob/master/docs/AG_UI.md"
745132
745286
  },
@@ -746266,7 +746420,7 @@ function createMCPServer(cwd4, debug2, verbose) {
746266
746420
  };
746267
746421
  const server2 = new Server({
746268
746422
  name: "ur-nexus",
746269
- version: "1.65.2"
746423
+ version: "1.65.4"
746270
746424
  }, {
746271
746425
  capabilities: {
746272
746426
  tools: {}
@@ -747424,7 +747578,7 @@ function thrownResponse(error40) {
747424
747578
  }
747425
747579
  async function createUrMcp2026Runtime(options4) {
747426
747580
  const server2 = createMCPServer(options4.cwd, options4.debug === true, options4.verbose === true);
747427
- const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.65.2" }, { capabilities: {} });
747581
+ const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.65.4" }, { capabilities: {} });
747428
747582
  const [clientTransport, serverTransport] = createLinkedTransportPair();
747429
747583
  try {
747430
747584
  await server2.connect(serverTransport);
@@ -747435,7 +747589,7 @@ async function createUrMcp2026Runtime(options4) {
747435
747589
  }
747436
747590
  const runtime2 = new Mcp2026Runtime({
747437
747591
  cwd: options4.cwd,
747438
- version: "1.65.2",
747592
+ version: "1.65.4",
747439
747593
  backend: {
747440
747594
  listTools: async () => {
747441
747595
  const listed = await client2.listTools();
@@ -749568,7 +749722,7 @@ async function update() {
749568
749722
  logEvent("tengu_update_check", {});
749569
749723
  const diagnostic2 = await getDoctorDiagnostic();
749570
749724
  const result = await checkUpgradeStatus({
749571
- currentVersion: "1.65.2",
749725
+ currentVersion: "1.65.4",
749572
749726
  packageName: UR_AGENT_PACKAGE_NAME,
749573
749727
  installationType: diagnostic2.installationType,
749574
749728
  latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
@@ -750884,7 +751038,7 @@ ${customInstructions}` : customInstructions;
750884
751038
  }
750885
751039
  }
750886
751040
  logForDiagnosticsNoPII("info", "started", {
750887
- version: "1.65.2",
751041
+ version: "1.65.4",
750888
751042
  is_native_binary: isInBundledMode()
750889
751043
  });
750890
751044
  registerCleanup(async () => {
@@ -751670,7 +751824,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
751670
751824
  pendingHookMessages
751671
751825
  }, renderAndRun);
751672
751826
  }
751673
- }).version("1.65.2 (UR-Nexus)", "-v, --version", "Output the version number");
751827
+ }).version("1.65.4 (UR-Nexus)", "-v, --version", "Output the version number");
751674
751828
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
751675
751829
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
751676
751830
  if (canUserConfigureAdvisor()) {
@@ -752722,7 +752876,7 @@ if (false) {}
752722
752876
  async function main2() {
752723
752877
  const args = process.argv.slice(2);
752724
752878
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
752725
- console.log(`${"1.65.2"} (UR-Nexus)`);
752879
+ console.log(`${"1.65.4"} (UR-Nexus)`);
752726
752880
  return;
752727
752881
  }
752728
752882
  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.65.2</p>
48
+ <p class="eyebrow">Version 1.65.4</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.65.2"
10
+ version = "1.65.4"
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.65.2",
5
+ "version": "1.65.4",
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.65.2",
3
+ "version": "1.65.4",
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",