ur-agent 1.72.0 → 1.73.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,36 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.73.0
4
+
5
+ - Provider API key entry no longer renders one character per line. The field in
6
+ the provider picker omitted `columns`, `cursorOffset` and
7
+ `onChangeCursorOffset`; the file carries `@ts-nocheck`, so the compiler could
8
+ not flag the missing required props. An absent width reached
9
+ `normalizeCursorColumns`, which floors a non-finite value at 2, leaving a
10
+ 1-column `MeasuredText`. The same omission pinned the cursor at offset 0, so
11
+ every keystroke inserted at the head and the stored key came out reversed,
12
+ and the undefined setter threw on each accepted key. `TextInput` now resolves
13
+ a usable width from the live terminal size and keeps the offset internally
14
+ when a call site does not lift it, so no future call site can reproduce this.
15
+ - Pasted provider keys are normalised to a single line. A bracketed paste
16
+ carries the newline that terminated the copied line, which is not legal in an
17
+ HTTP header value and previously failed later requests with an opaque
18
+ transport error instead of a 401.
19
+ - The provider picker can now change or remove a stored API key. Selecting a
20
+ provider whose key UR stores offers "Continue to models", "Change API key"
21
+ and "Disconnect"; a key supplied through the environment is left alone. The
22
+ key-entry step's advertised Esc-to-go-back now actually works.
23
+ - Subagent completion summaries no longer print "0 tokens" beside a real tool
24
+ count. Tool calls and model tokens are separate quantities, and when a
25
+ provider reports no usage the token segment is omitted rather than rendered
26
+ as zero. Provider-reported input, output, cached and creation tokens are
27
+ unchanged.
28
+ - AskUserQuestion keeps every choice in one continuous list. The select
29
+ components default to a 5-item window, so a question with five or more
30
+ entries (four choices plus "Other") pushed the tail below the footer divider
31
+ and read as a detached second group. The list is now sized to the terminal
32
+ and only windows when the height genuinely cannot fit it.
33
+
3
34
  ## 1.72.0
4
35
 
5
36
  - `AskUserQuestion` no longer rejects a well-formed question because the model
package/dist/cli.js CHANGED
@@ -75577,7 +75577,7 @@ var init_auth = __esm(() => {
75577
75577
 
75578
75578
  // src/utils/userAgent.ts
75579
75579
  function getURCodeUserAgent() {
75580
- return `ur/${"1.72.0"}`;
75580
+ return `ur/${"1.73.0"}`;
75581
75581
  }
75582
75582
 
75583
75583
  // src/utils/workloadContext.ts
@@ -75599,7 +75599,7 @@ function getUserAgent() {
75599
75599
  const clientApp = process.env.UR_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}` : "";
75600
75600
  const workload = getWorkload();
75601
75601
  const workloadSuffix = workload ? `, workload/${workload}` : "";
75602
- return `ur-cli/${"1.72.0"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
75602
+ return `ur-cli/${"1.73.0"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
75603
75603
  }
75604
75604
  function getMCPUserAgent() {
75605
75605
  const parts = [];
@@ -75613,7 +75613,7 @@ function getMCPUserAgent() {
75613
75613
  parts.push(`client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}`);
75614
75614
  }
75615
75615
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
75616
- return `ur/${"1.72.0"}${suffix}`;
75616
+ return `ur/${"1.73.0"}${suffix}`;
75617
75617
  }
75618
75618
  function getWebFetchUserAgent() {
75619
75619
  return `UR-User (${getURCodeUserAgent()})`;
@@ -75751,7 +75751,7 @@ var init_user = __esm(() => {
75751
75751
  deviceId,
75752
75752
  sessionId: getSessionId(),
75753
75753
  email: getEmail(),
75754
- appVersion: "1.72.0",
75754
+ appVersion: "1.73.0",
75755
75755
  platform: getHostPlatformForAnalytics(),
75756
75756
  organizationUuid,
75757
75757
  accountUuid,
@@ -83951,7 +83951,7 @@ var init_metadata = __esm(() => {
83951
83951
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
83952
83952
  WHITESPACE_REGEX = /\s+/;
83953
83953
  getVersionBase = memoize_default(() => {
83954
- const match = "1.72.0".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
83954
+ const match = "1.73.0".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
83955
83955
  return match ? match[0] : undefined;
83956
83956
  });
83957
83957
  buildEnvContext = memoize_default(async () => {
@@ -83991,7 +83991,7 @@ var init_metadata = __esm(() => {
83991
83991
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
83992
83992
  isURCodeAction: isEnvTruthy(process.env.UR_CODE_ACTION),
83993
83993
  isURAiAuth: isURAISubscriber(),
83994
- version: "1.72.0",
83994
+ version: "1.73.0",
83995
83995
  versionBase: getVersionBase(),
83996
83996
  buildTime: "",
83997
83997
  deploymentEnvironment: env2.detectDeploymentEnvironment(),
@@ -84661,7 +84661,7 @@ function initialize1PEventLogging() {
84661
84661
  const platform2 = getPlatform();
84662
84662
  const attributes = {
84663
84663
  [import_semantic_conventions4.ATTR_SERVICE_NAME]: "ur",
84664
- [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.72.0"
84664
+ [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.73.0"
84665
84665
  };
84666
84666
  if (platform2 === "wsl") {
84667
84667
  const wslVersion = getWslVersion();
@@ -84689,7 +84689,7 @@ function initialize1PEventLogging() {
84689
84689
  })
84690
84690
  ]
84691
84691
  });
84692
- firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.72.0");
84692
+ firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.73.0");
84693
84693
  }
84694
84694
  async function reinitialize1PEventLoggingIfConfigChanged() {
84695
84695
  if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
@@ -94565,7 +94565,7 @@ function formatAgentTrendReport(report = buildAgentTrendReport()) {
94565
94565
  function formatA2AAgentCard(options = {}, pretty = true) {
94566
94566
  return JSON.stringify(buildA2AAgentCard(options), null, pretty ? 2 : 0);
94567
94567
  }
94568
- var urVersion = "1.72.0", researchSnapshotDate = "2026-07-15", coverage, priorityRoadmap;
94568
+ var urVersion = "1.73.0", researchSnapshotDate = "2026-07-15", coverage, priorityRoadmap;
94569
94569
  var init_trends = __esm(() => {
94570
94570
  init_a2aCardSignature();
94571
94571
  coverage = [
@@ -97368,7 +97368,7 @@ function getAttributionHeader(fingerprint) {
97368
97368
  if (!isAttributionHeaderEnabled()) {
97369
97369
  return "";
97370
97370
  }
97371
- const version2 = `${"1.72.0"}.${fingerprint}`;
97371
+ const version2 = `${"1.73.0"}.${fingerprint}`;
97372
97372
  const entrypoint = process.env.UR_CODE_ENTRYPOINT ?? "unknown";
97373
97373
  const cch = "";
97374
97374
  const workload = getWorkload();
@@ -151743,6 +151743,19 @@ function getAssistantMessageId(message) {
151743
151743
  function getTokenCountFromUsage(usage) {
151744
151744
  return usage.input_tokens + (usage.cache_creation_input_tokens ?? 0) + (usage.cache_read_input_tokens ?? 0) + usage.output_tokens;
151745
151745
  }
151746
+ function hasReportedTokenUsage(usage) {
151747
+ if (!usage || typeof usage !== "object") {
151748
+ return false;
151749
+ }
151750
+ const counted = (usage.input_tokens ?? 0) + (usage.cache_creation_input_tokens ?? 0) + (usage.cache_read_input_tokens ?? 0) + (usage.output_tokens ?? 0);
151751
+ return Number.isFinite(counted) && counted > 0;
151752
+ }
151753
+ function formatReportedTokens(usage, totalTokens, format4) {
151754
+ if (!hasReportedTokenUsage(usage) || !Number.isFinite(totalTokens) || totalTokens <= 0) {
151755
+ return null;
151756
+ }
151757
+ return `${format4(totalTokens)} tokens`;
151758
+ }
151746
151759
  function tokenCountFromLastAPIResponse(messages) {
151747
151760
  let i3 = messages.length - 1;
151748
151761
  while (i3 >= 0) {
@@ -155132,7 +155145,7 @@ var init_projectSafety = __esm(() => {
155132
155145
  function getInstruments() {
155133
155146
  if (instruments)
155134
155147
  return instruments;
155135
- const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.72.0");
155148
+ const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.73.0");
155136
155149
  instruments = {
155137
155150
  operationDuration: meter.createHistogram("gen_ai.client.operation.duration", {
155138
155151
  description: "GenAI operation duration.",
@@ -155230,7 +155243,7 @@ function genAiAgentAttributes() {
155230
155243
  "gen_ai.operation.name": GEN_AI_OPERATION_INVOKE_AGENT,
155231
155244
  "gen_ai.provider.name": "ur",
155232
155245
  "gen_ai.agent.name": "UR-Nexus",
155233
- "gen_ai.agent.version": "1.72.0"
155246
+ "gen_ai.agent.version": "1.73.0"
155234
155247
  };
155235
155248
  }
155236
155249
  function genAiWorkflowAttributes(workflowName) {
@@ -155246,7 +155259,7 @@ function genAiWorkflowAttributes(workflowName) {
155246
155259
  function startGenAiWorkflowSpan(workflowName) {
155247
155260
  const attributes = genAiWorkflowAttributes(workflowName);
155248
155261
  const name = typeof attributes["gen_ai.workflow.name"] === "string" ? `invoke_workflow ${attributes["gen_ai.workflow.name"]}` : GEN_AI_OPERATION_INVOKE_WORKFLOW;
155249
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.72.0").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
155262
+ return import_api10.trace.getTracer("ur-agent.gen_ai", "1.73.0").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
155250
155263
  }
155251
155264
  function endGenAiWorkflowSpan(span, options2 = {}) {
155252
155265
  try {
@@ -155284,7 +155297,7 @@ function startGenAiMemorySpan(operation, options2 = {}) {
155284
155297
  if (options2.recordCount !== undefined && Number.isInteger(options2.recordCount) && options2.recordCount >= 0) {
155285
155298
  attributes["gen_ai.memory.record.count"] = options2.recordCount;
155286
155299
  }
155287
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.72.0").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
155300
+ return import_api10.trace.getTracer("ur-agent.gen_ai", "1.73.0").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
155288
155301
  }
155289
155302
  function endGenAiMemorySpan(span, options2 = {}) {
155290
155303
  try {
@@ -248755,7 +248768,7 @@ function getTelemetryAttributes() {
248755
248768
  attributes["session.id"] = sessionId;
248756
248769
  }
248757
248770
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
248758
- attributes["app.version"] = "1.72.0";
248771
+ attributes["app.version"] = "1.73.0";
248759
248772
  }
248760
248773
  const oauthAccount = getOauthAccountInfo();
248761
248774
  if (oauthAccount) {
@@ -295298,7 +295311,7 @@ function getInstallationEnv() {
295298
295311
  return;
295299
295312
  }
295300
295313
  function getURCodeVersion() {
295301
- return "1.72.0";
295314
+ return "1.73.0";
295302
295315
  }
295303
295316
  async function getInstalledVSCodeExtensionVersion(command) {
295304
295317
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -302629,7 +302642,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
302629
302642
  const client2 = new Client({
302630
302643
  name: "ur",
302631
302644
  title: "UR",
302632
- version: "1.72.0",
302645
+ version: "1.73.0",
302633
302646
  description: "UR-Nexus autonomous engineering workflow engine",
302634
302647
  websiteUrl: PRODUCT_URL
302635
302648
  }, {
@@ -302989,7 +303002,7 @@ var init_client5 = __esm(() => {
302989
303002
  const client2 = new Client({
302990
303003
  name: "ur",
302991
303004
  title: "UR",
302992
- version: "1.72.0",
303005
+ version: "1.73.0",
302993
303006
  description: "UR-Nexus autonomous engineering workflow engine",
302994
303007
  websiteUrl: PRODUCT_URL
302995
303008
  }, {
@@ -315528,7 +315541,7 @@ async function createRuntime() {
315528
315541
  bootstrapTelemetry();
315529
315542
  const resource = defaultResource().merge(detectResources({ detectors: [envDetector] })).merge(resourceFromAttributes({
315530
315543
  [import_semantic_conventions7.ATTR_SERVICE_NAME]: "ur-agent",
315531
- [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.72.0"
315544
+ [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.73.0"
315532
315545
  }));
315533
315546
  const tracerProvider = exporters.traces.length > 0 ? new BasicTracerProvider({
315534
315547
  resource,
@@ -315561,11 +315574,11 @@ async function createRuntime() {
315561
315574
  setMeterProvider(meterProvider);
315562
315575
  setLoggerProvider(loggerProvider);
315563
315576
  if (meterProvider) {
315564
- const meter = meterProvider.getMeter("ur-agent", "1.72.0");
315577
+ const meter = meterProvider.getMeter("ur-agent", "1.73.0");
315565
315578
  setMeter(meter, (name, options2) => meter.createCounter(name, options2));
315566
315579
  }
315567
315580
  if (loggerProvider) {
315568
- setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.72.0"));
315581
+ setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.73.0"));
315569
315582
  }
315570
315583
  if (!cleanupRegistered2) {
315571
315584
  cleanupRegistered2 = true;
@@ -316227,9 +316240,9 @@ async function assertMinVersion() {
316227
316240
  if (false) {}
316228
316241
  try {
316229
316242
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
316230
- if (versionConfig.minVersion && lt("1.72.0", versionConfig.minVersion)) {
316243
+ if (versionConfig.minVersion && lt("1.73.0", versionConfig.minVersion)) {
316231
316244
  console.error(`
316232
- It looks like your version of UR (${"1.72.0"}) needs an update.
316245
+ It looks like your version of UR (${"1.73.0"}) needs an update.
316233
316246
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
316234
316247
 
316235
316248
  To update, please run:
@@ -316445,7 +316458,7 @@ async function installGlobalPackage(specificVersion) {
316445
316458
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
316446
316459
  logEvent("tengu_auto_updater_lock_contention", {
316447
316460
  pid: process.pid,
316448
- currentVersion: "1.72.0"
316461
+ currentVersion: "1.73.0"
316449
316462
  });
316450
316463
  return "in_progress";
316451
316464
  }
@@ -316454,7 +316467,7 @@ async function installGlobalPackage(specificVersion) {
316454
316467
  if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
316455
316468
  logError2(new Error("Windows NPM detected in WSL environment"));
316456
316469
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
316457
- currentVersion: "1.72.0"
316470
+ currentVersion: "1.73.0"
316458
316471
  });
316459
316472
  console.error(`
316460
316473
  Error: Windows NPM detected in WSL
@@ -316989,7 +317002,7 @@ function detectLinuxGlobPatternWarnings() {
316989
317002
  }
316990
317003
  async function getDoctorDiagnostic() {
316991
317004
  const installationType = await getCurrentInstallationType();
316992
- const version2 = typeof MACRO !== "undefined" ? "1.72.0" : "unknown";
317005
+ const version2 = typeof MACRO !== "undefined" ? "1.73.0" : "unknown";
316993
317006
  const installationPath = await getInstallationPath();
316994
317007
  const invokedBinary = getInvokedBinary();
316995
317008
  const multipleInstallations = await detectMultipleInstallations();
@@ -317924,8 +317937,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
317924
317937
  const maxVersion = await getMaxVersion();
317925
317938
  if (maxVersion && gt(version2, maxVersion)) {
317926
317939
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
317927
- if (gte("1.72.0", maxVersion)) {
317928
- logForDebugging(`Native installer: current version ${"1.72.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
317940
+ if (gte("1.73.0", maxVersion)) {
317941
+ logForDebugging(`Native installer: current version ${"1.73.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
317929
317942
  logEvent("tengu_native_update_skipped_max_version", {
317930
317943
  latency_ms: Date.now() - startTime,
317931
317944
  max_version: maxVersion,
@@ -317936,7 +317949,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
317936
317949
  version2 = maxVersion;
317937
317950
  }
317938
317951
  }
317939
- if (!forceReinstall && version2 === "1.72.0" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
317952
+ if (!forceReinstall && version2 === "1.73.0" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
317940
317953
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
317941
317954
  logEvent("tengu_native_update_complete", {
317942
317955
  latency_ms: Date.now() - startTime,
@@ -337472,7 +337485,8 @@ function renderToolResultMessage4(data, progressMessagesForMessage, {
337472
337485
  content,
337473
337486
  prompt
337474
337487
  } = data;
337475
- const result = [totalToolUseCount === 1 ? "1 tool use" : `${totalToolUseCount} tool uses`, formatNumber(totalTokens) + " tokens", formatDuration(totalDurationMs)];
337488
+ const tokenSegment = formatReportedTokens(usage, totalTokens, formatNumber);
337489
+ const result = [totalToolUseCount === 1 ? "1 tool use" : `${totalToolUseCount} tool uses`, ...tokenSegment ? [tokenSegment] : [], formatDuration(totalDurationMs)];
337476
337490
  const completionMessage = `Done (${result.join(" \xB7 ")})`;
337477
337491
  const finalAssistantMessage = createAssistantMessage({
337478
337492
  content: completionMessage,
@@ -338032,6 +338046,7 @@ var init_UI4 = __esm(() => {
338032
338046
  init_collapseReadSearch();
338033
338047
  init_file();
338034
338048
  init_format2();
338049
+ init_tokens();
338035
338050
  init_messages();
338036
338051
  init_model();
338037
338052
  init_AgentTool();
@@ -387741,7 +387756,7 @@ function isAnyTracingEnabled() {
387741
387756
  return isTelemetryEnabled() || isEnhancedTelemetryEnabled() || isBetaTracingEnabled();
387742
387757
  }
387743
387758
  function getTracer() {
387744
- return import_api39.trace.getTracer("ur-agent.gen_ai", "1.72.0");
387759
+ return import_api39.trace.getTracer("ur-agent.gen_ai", "1.73.0");
387745
387760
  }
387746
387761
  function createSpanAttributes(spanType, customAttributes = {}) {
387747
387762
  const baseAttributes = getTelemetryAttributes();
@@ -415896,9 +415911,22 @@ var init_BaseTextInput = __esm(() => {
415896
415911
  });
415897
415912
 
415898
415913
  // src/components/TextInput.tsx
415914
+ function resolveImplicitInputColumns(terminalColumns) {
415915
+ const base2 = Number.isFinite(terminalColumns) && terminalColumns > 0 ? terminalColumns : IMPLICIT_WIDTH_FALLBACK;
415916
+ return Math.max(2, Math.floor(base2) - IMPLICIT_WIDTH_GUTTER);
415917
+ }
415918
+ function hasUsableColumns(columns) {
415919
+ return typeof columns === "number" && Number.isFinite(columns) && columns >= 2;
415920
+ }
415899
415921
  function TextInput(props) {
415900
415922
  const [theme] = useTheme();
415901
415923
  const isTerminalFocused = useTerminalFocus();
415924
+ const terminalSize = import_react91.useContext(TerminalSizeContext);
415925
+ const resolvedColumns = hasUsableColumns(props.columns) ? props.columns : resolveImplicitInputColumns(terminalSize?.columns);
415926
+ const [internalOffset, setInternalOffset] = import_react91.useState(0);
415927
+ const hasExternalOffset = typeof props.onChangeCursorOffset === "function";
415928
+ const resolvedOffset = hasExternalOffset ? props.cursorOffset : internalOffset;
415929
+ const resolvedOnOffsetChange = hasExternalOffset ? props.onChangeCursorOffset : setInternalOffset;
415902
415930
  const accessibilityEnabled = import_react91.useMemo(() => isEnvTruthy(process.env.UR_CODE_ACCESSIBILITY), []);
415903
415931
  const settings = useSettings();
415904
415932
  const reducedMotion = settings.prefersReducedMotion ?? false;
@@ -415952,13 +415980,13 @@ function TextInput(props) {
415952
415980
  highlightPastedText: props.highlightPastedText,
415953
415981
  invert,
415954
415982
  themeText: color("text", theme),
415955
- columns: props.columns,
415983
+ columns: resolvedColumns,
415956
415984
  maxVisibleLines: props.maxVisibleLines,
415957
415985
  onImagePaste: props.onImagePaste,
415958
415986
  disableCursorMovementForUpDownKeys: props.disableCursorMovementForUpDownKeys,
415959
415987
  disableEscapeDoublePress: props.disableEscapeDoublePress,
415960
- externalOffset: props.cursorOffset,
415961
- onOffsetChange: props.onChangeCursorOffset,
415988
+ externalOffset: resolvedOffset,
415989
+ onOffsetChange: resolvedOnOffsetChange,
415962
415990
  inputFilter: props.inputFilter,
415963
415991
  inlineGhostText: props.inlineGhostText,
415964
415992
  dim: source_default.dim
@@ -415971,17 +415999,21 @@ function TextInput(props) {
415971
415999
  highlights: props.highlights,
415972
416000
  invert,
415973
416001
  hidePlaceholderText: isVoiceRecording,
415974
- ...props
416002
+ ...props,
416003
+ columns: resolvedColumns,
416004
+ cursorOffset: resolvedOffset,
416005
+ onChangeCursorOffset: resolvedOnOffsetChange
415975
416006
  }, undefined, false, undefined, this)
415976
416007
  }, undefined, false, undefined, this);
415977
416008
  }
415978
- var import_react91, jsx_dev_runtime159, BARS = " \u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588", CURSOR_WAVEFORM_WIDTH = 1, SMOOTH = 0.7, LEVEL_BOOST = 1.8, SILENCE_THRESHOLD2 = 0.15;
416009
+ var import_react91, jsx_dev_runtime159, BARS = " \u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588", CURSOR_WAVEFORM_WIDTH = 1, SMOOTH = 0.7, LEVEL_BOOST = 1.8, SILENCE_THRESHOLD2 = 0.15, IMPLICIT_WIDTH_GUTTER = 4, IMPLICIT_WIDTH_FALLBACK = 80;
415979
416010
  var init_TextInput = __esm(() => {
415980
416011
  init_source2();
415981
416012
  init_voice();
415982
416013
  init_useClipboardImageHint();
415983
416014
  init_useSettings();
415984
416015
  init_useTextInput();
416016
+ init_TerminalSizeContext();
415985
416017
  init_ink2();
415986
416018
  init_envUtils();
415987
416019
  init_BaseTextInput();
@@ -417930,7 +417962,7 @@ function Feedback({
417930
417962
  platform: env2.platform,
417931
417963
  gitRepo: envInfo.isGit,
417932
417964
  terminal: env2.terminal,
417933
- version: "1.72.0",
417965
+ version: "1.73.0",
417934
417966
  transcript: normalizeMessagesForAPI(messages),
417935
417967
  errors: sanitizedErrors,
417936
417968
  lastApiRequest: getLastAPIRequest(),
@@ -418122,7 +418154,7 @@ function Feedback({
418122
418154
  ", ",
418123
418155
  env2.terminal,
418124
418156
  ", v",
418125
- "1.72.0"
418157
+ "1.73.0"
418126
418158
  ]
418127
418159
  }, undefined, true, undefined, this)
418128
418160
  ]
@@ -418228,7 +418260,7 @@ ${sanitizedDescription}
418228
418260
  ` + `**Environment Info**
418229
418261
  ` + `- Platform: ${env2.platform}
418230
418262
  ` + `- Terminal: ${env2.terminal}
418231
- ` + `- Version: ${"1.72.0"}
418263
+ ` + `- Version: ${"1.73.0"}
418232
418264
  ` + `- Feedback ID: ${feedbackId}
418233
418265
  ` + `
418234
418266
  **Errors**
@@ -421338,7 +421370,7 @@ function buildPrimarySection() {
421338
421370
  }, undefined, false, undefined, this);
421339
421371
  return [{
421340
421372
  label: "Version",
421341
- value: "1.72.0"
421373
+ value: "1.73.0"
421342
421374
  }, {
421343
421375
  label: "Session name",
421344
421376
  value: nameValue
@@ -424668,7 +424700,7 @@ function Config({
424668
424700
  }
424669
424701
  }, undefined, false, undefined, this)
424670
424702
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime179.jsxDEV(ChannelDowngradeDialog, {
424671
- currentVersion: "1.72.0",
424703
+ currentVersion: "1.73.0",
424672
424704
  onChoice: (choice) => {
424673
424705
  setShowSubmenu(null);
424674
424706
  setTabsHidden(false);
@@ -424680,7 +424712,7 @@ function Config({
424680
424712
  autoUpdatesChannel: "stable"
424681
424713
  };
424682
424714
  if (choice === "stay") {
424683
- newSettings.minimumVersion = "1.72.0";
424715
+ newSettings.minimumVersion = "1.73.0";
424684
424716
  }
424685
424717
  updateSettingsForSource("userSettings", newSettings);
424686
424718
  setSettingsData((prev_27) => ({
@@ -432744,7 +432776,7 @@ function HelpV2(t0) {
432744
432776
  let t6;
432745
432777
  if ($2[31] !== tabs) {
432746
432778
  t6 = /* @__PURE__ */ jsx_dev_runtime206.jsxDEV(Tabs, {
432747
- title: `UR v${"1.72.0"}`,
432779
+ title: `UR v${"1.73.0"}`,
432748
432780
  color: "professionalBlue",
432749
432781
  defaultTab: "general",
432750
432782
  children: tabs
@@ -433677,7 +433709,7 @@ function buildToolUseContext(tools, readFileStateCache, toolPermissionContext, a
433677
433709
  async function handleInitialize(options2) {
433678
433710
  return {
433679
433711
  name: "UR",
433680
- version: "1.72.0",
433712
+ version: "1.73.0",
433681
433713
  protocolVersion: "0.1.0",
433682
433714
  workspaceRoot: options2.cwd,
433683
433715
  capabilities: {
@@ -450785,7 +450817,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
450785
450817
  return [];
450786
450818
  }
450787
450819
  }
450788
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.72.0") {
450820
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.73.0") {
450789
450821
  if (process.env.USER_TYPE === "ant") {
450790
450822
  const changelog = "";
450791
450823
  if (changelog) {
@@ -450812,7 +450844,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.72.0")
450812
450844
  releaseNotes
450813
450845
  };
450814
450846
  }
450815
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.72.0") {
450847
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.73.0") {
450816
450848
  if (process.env.USER_TYPE === "ant") {
450817
450849
  const changelog = "";
450818
450850
  if (changelog) {
@@ -453678,7 +453710,7 @@ function getRecentActivitySync() {
453678
453710
  return cachedActivity;
453679
453711
  }
453680
453712
  function getLogoDisplayData() {
453681
- const version2 = process.env.DEMO_VERSION ?? "1.72.0";
453713
+ const version2 = process.env.DEMO_VERSION ?? "1.73.0";
453682
453714
  const serverUrl = getDirectConnectServerUrl();
453683
453715
  const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd());
453684
453716
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -454545,7 +454577,7 @@ function LogoV2() {
454545
454577
  if ($2[2] === Symbol.for("react.memo_cache_sentinel")) {
454546
454578
  t2 = () => {
454547
454579
  const currentConfig2 = getGlobalConfig();
454548
- if (currentConfig2.lastReleaseNotesSeen === "1.72.0") {
454580
+ if (currentConfig2.lastReleaseNotesSeen === "1.73.0") {
454549
454581
  return;
454550
454582
  }
454551
454583
  saveGlobalConfig(_temp325);
@@ -455230,12 +455262,12 @@ function LogoV2() {
455230
455262
  return t41;
455231
455263
  }
455232
455264
  function _temp325(current) {
455233
- if (current.lastReleaseNotesSeen === "1.72.0") {
455265
+ if (current.lastReleaseNotesSeen === "1.73.0") {
455234
455266
  return current;
455235
455267
  }
455236
455268
  return {
455237
455269
  ...current,
455238
- lastReleaseNotesSeen: "1.72.0"
455270
+ lastReleaseNotesSeen: "1.73.0"
455239
455271
  };
455240
455272
  }
455241
455273
  function _temp241(s_0) {
@@ -472049,7 +472081,7 @@ function compileAgenticCiWorkflow(specName = "default", options2 = {}) {
472049
472081
  if (spec.name !== specName) {
472050
472082
  throw new Error("Agentic CI workflow spec name does not match");
472051
472083
  }
472052
- const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.72.0" : "1.72.0");
472084
+ const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.73.0" : "1.73.0");
472053
472085
  if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(packageVersion)) {
472054
472086
  throw new Error("invalid ur-agent package version");
472055
472087
  }
@@ -473042,7 +473074,7 @@ runner; \`ur trigger\` is the inbound parser that decides what to run.
473042
473074
  path: ".github/workflows/ur.yml",
473043
473075
  root: "project",
473044
473076
  content: compileAgenticCiWorkflow("default", {
473045
- packageVersion: typeof MACRO !== "undefined" ? "1.72.0" : "1.72.0"
473077
+ packageVersion: typeof MACRO !== "undefined" ? "1.73.0" : "1.73.0"
473046
473078
  })
473047
473079
  },
473048
473080
  {
@@ -473105,7 +473137,7 @@ function value(tokens, flag) {
473105
473137
  return index2 >= 0 ? tokens[index2 + 1] : undefined;
473106
473138
  }
473107
473139
  function cliVersion() {
473108
- return typeof MACRO !== "undefined" ? "1.72.0" : "1.72.0";
473140
+ return typeof MACRO !== "undefined" ? "1.73.0" : "1.73.0";
473109
473141
  }
473110
473142
  function workflowPath(cwd2) {
473111
473143
  return join159(cwd2, ".github", "workflows", "ur-agentic-ci.yml");
@@ -478961,7 +478993,7 @@ function createAcpStdioApp(deps) {
478961
478993
  }
478962
478994
  },
478963
478995
  authMethods: [],
478964
- agentInfo: { name: "UR-Nexus", version: "1.72.0" }
478996
+ agentInfo: { name: "UR-Nexus", version: "1.73.0" }
478965
478997
  })).onRequest("authenticate", () => ({})).onRequest("session/new", async (context6) => {
478966
478998
  const result = runtime2.newSession(context6.params.cwd, context6.params.mcpServers, context6.params.additionalDirectories);
478967
478999
  await runtime2.announce({
@@ -479058,7 +479090,7 @@ function createAcpStdioAgent(deps) {
479058
479090
  }
479059
479091
  },
479060
479092
  authMethods: [],
479061
- agentInfo: { name: "UR-Nexus", version: "1.72.0" }
479093
+ agentInfo: { name: "UR-Nexus", version: "1.73.0" }
479062
479094
  });
479063
479095
  return;
479064
479096
  case "authenticate":
@@ -688223,7 +688255,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
688223
688255
  smapsRollup,
688224
688256
  platform: process.platform,
688225
688257
  nodeVersion: process.version,
688226
- ccVersion: "1.72.0"
688258
+ ccVersion: "1.73.0"
688227
688259
  };
688228
688260
  }
688229
688261
  async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
@@ -688803,7 +688835,7 @@ var init_bridge_kick = __esm(() => {
688803
688835
  var call153 = async () => {
688804
688836
  return {
688805
688837
  type: "text",
688806
- value: "1.72.0"
688838
+ value: "1.73.0"
688807
688839
  };
688808
688840
  }, version2, version_default;
688809
688841
  var init_version = __esm(() => {
@@ -691767,6 +691799,28 @@ var init_export2 = __esm(() => {
691767
691799
  export_default = exportCommand;
691768
691800
  });
691769
691801
 
691802
+ // src/services/providers/apiKeyInput.ts
691803
+ function sanitizeApiKeyInput(raw) {
691804
+ if (typeof raw !== "string" || raw.length === 0) {
691805
+ return "";
691806
+ }
691807
+ return raw.replace(CONTROL_AND_LINE_BREAKS, "").trim();
691808
+ }
691809
+ function describeApiKeyProblem(raw) {
691810
+ const cleaned = sanitizeApiKeyInput(raw);
691811
+ if (!cleaned) {
691812
+ return "API key is empty.";
691813
+ }
691814
+ if (/\s/.test(cleaned)) {
691815
+ return "API key contains whitespace. Check the value you pasted.";
691816
+ }
691817
+ return null;
691818
+ }
691819
+ var CONTROL_AND_LINE_BREAKS;
691820
+ var init_apiKeyInput = __esm(() => {
691821
+ CONTROL_AND_LINE_BREAKS = /[\u0000-\u001F\u007F-\u009F\u2028\u2029]/g;
691822
+ });
691823
+
691770
691824
  // src/components/ProviderFirstModelPicker.tsx
691771
691825
  function ProviderFirstModelPicker({
691772
691826
  initial,
@@ -691790,7 +691844,11 @@ function ProviderFirstModelPicker({
691790
691844
  const [providerWarning, setProviderWarning] = import_react183.useState(null);
691791
691845
  const [connectingProvider, setConnectingProvider] = import_react183.useState(null);
691792
691846
  const [apiKeyInput, setApiKeyInput] = import_react183.useState("");
691847
+ const [apiKeyCursorOffset, setApiKeyCursorOffset] = import_react183.useState(0);
691793
691848
  const [connectError, setConnectError] = import_react183.useState(null);
691849
+ const [credentialNotice, setCredentialNotice] = import_react183.useState(null);
691850
+ const terminalSize = import_react183.useContext(TerminalSizeContext);
691851
+ const keyInputColumns = Math.max(20, (terminalSize?.columns ?? 80) - 14);
691794
691852
  const effortValue = useAppState(selectEffortValue2);
691795
691853
  const [effort] = import_react183.useState(effortValue !== undefined ? convertEffortValueToLevel(effortValue) : undefined);
691796
691854
  const appThinkingEnabled = useAppState(selectThinkingEnabled2);
@@ -691848,6 +691906,11 @@ function ProviderFirstModelPicker({
691848
691906
  }
691849
691907
  loadModels();
691850
691908
  }, [selectedProvider]);
691909
+ use_input_default((_input, key) => {
691910
+ if (key.escape) {
691911
+ handleKeyCancel();
691912
+ }
691913
+ }, { isActive: step === "connect" });
691851
691914
  const providerSelectOptions = providerOptions.map((opt) => ({
691852
691915
  value: opt.value,
691853
691916
  label: opt.label,
@@ -691875,10 +691938,20 @@ function ProviderFirstModelPicker({
691875
691938
  setProviderWarning(provider.runtimeBlockedReason);
691876
691939
  return;
691877
691940
  }
691941
+ if (provider.status === "connected" && provider.credentialType === "api-key") {
691942
+ if (getProviderApiKeySource(provider.value) === "stored") {
691943
+ setConnectingProvider(provider);
691944
+ setCredentialNotice(null);
691945
+ setConnectError(null);
691946
+ setStep("manage");
691947
+ return;
691948
+ }
691949
+ }
691878
691950
  if (provider.status !== "connected") {
691879
691951
  if (provider.credentialType === "api-key") {
691880
691952
  setConnectingProvider(provider);
691881
691953
  setApiKeyInput("");
691954
+ setApiKeyCursorOffset(0);
691882
691955
  setConnectError(null);
691883
691956
  setStep("connect");
691884
691957
  return;
@@ -691966,27 +692039,124 @@ function ProviderFirstModelPicker({
691966
692039
  function handleKeySubmit() {
691967
692040
  if (!connectingProvider)
691968
692041
  return;
691969
- const key = apiKeyInput.trim();
692042
+ const key = sanitizeApiKeyInput(apiKeyInput);
691970
692043
  if (!key) {
691971
692044
  setConnectError("Enter your API key (or press Esc to go back).");
691972
692045
  return;
691973
692046
  }
692047
+ const problem = describeApiKeyProblem(apiKeyInput);
692048
+ if (problem) {
692049
+ setConnectError(problem);
692050
+ return;
692051
+ }
691974
692052
  const saved = setProviderApiKey(connectingProvider.value, key);
691975
692053
  if (!saved.ok) {
691976
692054
  setConnectError(saved.message);
691977
692055
  return;
691978
692056
  }
691979
692057
  setApiKeyInput("");
692058
+ setApiKeyCursorOffset(0);
691980
692059
  setConnectError(null);
692060
+ setCredentialNotice(saved.message);
691981
692061
  setSelectedProvider(connectingProvider);
691982
692062
  setStep("model");
691983
692063
  }
691984
692064
  function handleKeyCancel() {
691985
692065
  setApiKeyInput("");
692066
+ setApiKeyCursorOffset(0);
691986
692067
  setConnectingProvider(null);
691987
692068
  setConnectError(null);
691988
692069
  setStep("provider");
691989
692070
  }
692071
+ function handleManageSelect(action3) {
692072
+ if (!connectingProvider)
692073
+ return;
692074
+ if (action3 === "use") {
692075
+ setSelectedProvider(connectingProvider);
692076
+ setStep("model");
692077
+ setFocusedModelValue(null);
692078
+ return;
692079
+ }
692080
+ if (action3 === "replace") {
692081
+ setApiKeyInput("");
692082
+ setApiKeyCursorOffset(0);
692083
+ setConnectError(null);
692084
+ setStep("connect");
692085
+ return;
692086
+ }
692087
+ if (action3 === "disconnect") {
692088
+ const cleared = clearProviderApiKey(connectingProvider.value);
692089
+ if (!cleared.ok) {
692090
+ setCredentialNotice(cleared.message);
692091
+ return;
692092
+ }
692093
+ setCredentialNotice(cleared.message);
692094
+ setProviderOptions((prev) => prev.map((opt) => opt.value === connectingProvider.value ? { ...opt, status: "missing", statusLabel: "No stored API key" } : opt));
692095
+ setConnectingProvider(null);
692096
+ setStep("provider");
692097
+ }
692098
+ }
692099
+ function handleManageCancel() {
692100
+ setConnectingProvider(null);
692101
+ setStep("provider");
692102
+ }
692103
+ if (step === "manage" && connectingProvider) {
692104
+ const manageContent = /* @__PURE__ */ jsx_dev_runtime335.jsxDEV(ThemedBox_default, {
692105
+ flexDirection: "column",
692106
+ children: [
692107
+ /* @__PURE__ */ jsx_dev_runtime335.jsxDEV(ThemedBox_default, {
692108
+ marginBottom: 1,
692109
+ flexDirection: "column",
692110
+ children: [
692111
+ /* @__PURE__ */ jsx_dev_runtime335.jsxDEV(ThemedText, {
692112
+ color: "remember",
692113
+ bold: true,
692114
+ children: connectingProvider.label
692115
+ }, undefined, false, undefined, this),
692116
+ /* @__PURE__ */ jsx_dev_runtime335.jsxDEV(ThemedText, {
692117
+ dimColor: true,
692118
+ children: "Connected with an API key stored by UR. Choose an action, or press Esc to go back."
692119
+ }, undefined, false, undefined, this)
692120
+ ]
692121
+ }, undefined, true, undefined, this),
692122
+ /* @__PURE__ */ jsx_dev_runtime335.jsxDEV(Select, {
692123
+ defaultValue: "use",
692124
+ options: [
692125
+ {
692126
+ value: "use",
692127
+ label: "Continue to models",
692128
+ description: "Keep the stored key and pick a model"
692129
+ },
692130
+ {
692131
+ value: "replace",
692132
+ label: "Change API key",
692133
+ description: "Replace the stored key with a new one"
692134
+ },
692135
+ {
692136
+ value: "disconnect",
692137
+ label: "Disconnect",
692138
+ description: "Remove the stored key from this machine"
692139
+ }
692140
+ ],
692141
+ onChange: handleManageSelect,
692142
+ onCancel: handleManageCancel,
692143
+ visibleOptionCount: 3
692144
+ }, undefined, false, undefined, this),
692145
+ credentialNotice && /* @__PURE__ */ jsx_dev_runtime335.jsxDEV(ThemedBox_default, {
692146
+ marginTop: 1,
692147
+ children: /* @__PURE__ */ jsx_dev_runtime335.jsxDEV(ThemedText, {
692148
+ dimColor: true,
692149
+ color: "subtle",
692150
+ children: credentialNotice
692151
+ }, undefined, false, undefined, this)
692152
+ }, undefined, false, undefined, this)
692153
+ ]
692154
+ }, undefined, true, undefined, this);
692155
+ return isStandaloneCommand ? /* @__PURE__ */ jsx_dev_runtime335.jsxDEV(Pane, {
692156
+ color: "permission",
692157
+ children: manageContent
692158
+ }, undefined, false, undefined, this) : manageContent;
692159
+ }
691990
692160
  if (step === "connect" && connectingProvider) {
691991
692161
  const envKey = connectingProvider.provider.envKey;
691992
692162
  const content2 = /* @__PURE__ */ jsx_dev_runtime335.jsxDEV(ThemedBox_default, {
@@ -692029,7 +692199,13 @@ function ProviderFirstModelPicker({
692029
692199
  onChange: setApiKeyInput,
692030
692200
  onSubmit: handleKeySubmit,
692031
692201
  mask: "*",
692032
- placeholder: "paste key, then Enter"
692202
+ placeholder: "paste key, then Enter",
692203
+ focus: true,
692204
+ showCursor: true,
692205
+ multiline: false,
692206
+ columns: keyInputColumns,
692207
+ cursorOffset: apiKeyCursorOffset,
692208
+ onChangeCursorOffset: setApiKeyCursorOffset
692033
692209
  }, undefined, false, undefined, this)
692034
692210
  ]
692035
692211
  }, undefined, true, undefined, this),
@@ -692364,6 +692540,8 @@ var init_ProviderFirstModelPicker = __esm(() => {
692364
692540
  init_analytics();
692365
692541
  init_providerRegistry();
692366
692542
  init_providerCredentials();
692543
+ init_apiKeyInput();
692544
+ init_TerminalSizeContext();
692367
692545
  init_AppState();
692368
692546
  init_settings2();
692369
692547
  init_ink2();
@@ -699874,7 +700052,7 @@ function generateHtmlReport(data, insights) {
699874
700052
  </html>`;
699875
700053
  }
699876
700054
  function buildExportData(data, insights, facets, remoteStats) {
699877
- const version3 = typeof MACRO !== "undefined" ? "1.72.0" : "unknown";
700055
+ const version3 = typeof MACRO !== "undefined" ? "1.73.0" : "unknown";
699878
700056
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
699879
700057
  const facets_summary = {
699880
700058
  total: facets.size,
@@ -704185,7 +704363,7 @@ var init_sessionStorage = __esm(() => {
704185
704363
  init_settings2();
704186
704364
  init_slowOperations();
704187
704365
  init_uuid();
704188
- VERSION7 = typeof MACRO !== "undefined" ? "1.72.0" : "unknown";
704366
+ VERSION7 = typeof MACRO !== "undefined" ? "1.73.0" : "unknown";
704189
704367
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
704190
704368
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
704191
704369
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -705400,7 +705578,7 @@ var init_filesystem = __esm(() => {
705400
705578
  });
705401
705579
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
705402
705580
  const nonce = randomBytes20(16).toString("hex");
705403
- return join232(getURTempDir(), "bundled-skills", "1.72.0", nonce);
705581
+ return join232(getURTempDir(), "bundled-skills", "1.73.0", nonce);
705404
705582
  });
705405
705583
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
705406
705584
  });
@@ -711703,7 +711881,7 @@ function computeFingerprint(messageText2, version3) {
711703
711881
  }
711704
711882
  function computeFingerprintFromMessages(messages) {
711705
711883
  const firstMessageText = extractFirstMessageText(messages);
711706
- return computeFingerprint(firstMessageText, "1.72.0");
711884
+ return computeFingerprint(firstMessageText, "1.73.0");
711707
711885
  }
711708
711886
  var FINGERPRINT_SALT = "59cf53e54c78";
711709
711887
  var init_fingerprint = () => {};
@@ -713599,7 +713777,7 @@ async function sideQuery(opts) {
713599
713777
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
713600
713778
  }
713601
713779
  const messageText2 = extractFirstUserMessageText(messages);
713602
- const fingerprint2 = computeFingerprint(messageText2, "1.72.0");
713780
+ const fingerprint2 = computeFingerprint(messageText2, "1.73.0");
713603
713781
  const attributionHeader = getAttributionHeader(fingerprint2);
713604
713782
  const systemBlocks = [
713605
713783
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -718386,7 +718564,7 @@ function buildSystemInitMessage(inputs) {
718386
718564
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
718387
718565
  apiKeySource: getURHQApiKeyWithSource().source,
718388
718566
  betas: getSdkBetas(),
718389
- ur_version: "1.72.0",
718567
+ ur_version: "1.73.0",
718390
718568
  output_style: outputStyle2,
718391
718569
  agents: inputs.agents.map((agent2) => agent2.agentType),
718392
718570
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
@@ -720449,6 +720627,22 @@ var init_PreviewQuestionView = __esm(() => {
720449
720627
  jsx_dev_runtime359 = __toESM(require_jsx_dev_runtime(), 1);
720450
720628
  });
720451
720629
 
720630
+ // src/components/permissions/AskUserQuestionPermissionRequest/choiceListLayout.ts
720631
+ function visibleChoiceCount(optionCount, terminalRows, descriptionRows = 1) {
720632
+ if (!Number.isFinite(optionCount) || optionCount <= 0) {
720633
+ return MIN_VISIBLE_CHOICES;
720634
+ }
720635
+ const total = Math.floor(optionCount);
720636
+ const rows = Number.isFinite(terminalRows) && terminalRows > 0 ? Math.floor(terminalRows) : FALLBACK_TERMINAL_ROWS;
720637
+ const rowsPerOption = Math.max(1, Math.floor(descriptionRows) + 1);
720638
+ const budget = Math.floor((rows - CHOICE_LIST_CHROME_ROWS) / rowsPerOption);
720639
+ if (budget >= total) {
720640
+ return total;
720641
+ }
720642
+ return Math.max(MIN_VISIBLE_CHOICES, Math.min(total, budget));
720643
+ }
720644
+ var CHOICE_LIST_CHROME_ROWS = 9, MIN_VISIBLE_CHOICES = 3, FALLBACK_TERMINAL_ROWS = 24;
720645
+
720452
720646
  // src/components/permissions/AskUserQuestionPermissionRequest/QuestionView.tsx
720453
720647
  function QuestionView({
720454
720648
  question,
@@ -720474,6 +720668,7 @@ function QuestionView({
720474
720668
  onRemoveImage
720475
720669
  }) {
720476
720670
  const isInPlanMode = useAppState((s) => s.toolPermissionContext.mode) === "plan";
720671
+ const terminalSize = import_react199.useContext(TerminalSizeContext);
720477
720672
  const [isFooterFocused, setIsFooterFocused] = import_react199.useState(false);
720478
720673
  const [footerIndex, setFooterIndex] = import_react199.useState(0);
720479
720674
  const [isOtherFocused, setIsOtherFocused] = import_react199.useState(false);
@@ -720596,6 +720791,7 @@ function QuestionView({
720596
720791
  ]
720597
720792
  }, undefined, true, undefined, this);
720598
720793
  const footerIndexStart = options4.length + 1;
720794
+ const choiceCount = visibleChoiceCount(options4.length, terminalSize?.rows);
720599
720795
  return /* @__PURE__ */ jsx_dev_runtime360.jsxDEV(ThemedBox_default, {
720600
720796
  flexDirection: "column",
720601
720797
  marginTop: 0,
@@ -720631,6 +720827,7 @@ function QuestionView({
720631
720827
  onSubmit,
720632
720828
  onDownFromLastItem: handleDownFromLastItem,
720633
720829
  isDisabled: isFooterFocused,
720830
+ visibleOptionCount: choiceCount,
720634
720831
  onImagePaste,
720635
720832
  pastedContents,
720636
720833
  onRemoveImage
@@ -720646,6 +720843,7 @@ function QuestionView({
720646
720843
  onCancel,
720647
720844
  onDownFromLastItem: handleDownFromLastItem,
720648
720845
  isDisabled: isFooterFocused,
720846
+ visibleOptionCount: choiceCount,
720649
720847
  layout: "compact-vertical",
720650
720848
  onImagePaste,
720651
720849
  pastedContents,
@@ -720743,6 +720941,7 @@ var init_QuestionView = __esm(() => {
720743
720941
  init_FilePathLink();
720744
720942
  init_QuestionNavigationBar();
720745
720943
  init_PreviewQuestionView();
720944
+ init_TerminalSizeContext();
720746
720945
  import_react199 = __toESM(require_react(), 1);
720747
720946
  jsx_dev_runtime360 = __toESM(require_jsx_dev_runtime(), 1);
720748
720947
  });
@@ -732246,7 +732445,7 @@ var init_useVoiceEnabled = __esm(() => {
732246
732445
  function getSemverPart(version3) {
732247
732446
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
732248
732447
  }
732249
- function useUpdateNotification(updatedVersion, initialVersion = "1.72.0") {
732448
+ function useUpdateNotification(updatedVersion, initialVersion = "1.73.0") {
732250
732449
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react222.useState(() => getSemverPart(initialVersion));
732251
732450
  if (!updatedVersion) {
732252
732451
  return null;
@@ -732295,7 +732494,7 @@ function AutoUpdater({
732295
732494
  return;
732296
732495
  }
732297
732496
  if (false) {}
732298
- const currentVersion = "1.72.0";
732497
+ const currentVersion = "1.73.0";
732299
732498
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
732300
732499
  let latestVersion = await getLatestVersion(channel);
732301
732500
  const isDisabled = isAutoUpdaterDisabled();
@@ -732524,12 +732723,12 @@ function NativeAutoUpdater({
732524
732723
  logEvent("tengu_native_auto_updater_start", {});
732525
732724
  try {
732526
732725
  const maxVersion = await getMaxVersion();
732527
- if (maxVersion && gt("1.72.0", maxVersion)) {
732726
+ if (maxVersion && gt("1.73.0", maxVersion)) {
732528
732727
  const msg = await getMaxVersionMessage();
732529
732728
  setMaxVersionIssue(msg ?? "affects your version");
732530
732729
  }
732531
732730
  const result = await installLatest(channel);
732532
- const currentVersion = "1.72.0";
732731
+ const currentVersion = "1.73.0";
732533
732732
  const latencyMs = Date.now() - startTime;
732534
732733
  if (result.lockFailed) {
732535
732734
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -732666,17 +732865,17 @@ function PackageManagerAutoUpdater(t0) {
732666
732865
  const maxVersion = await getMaxVersion();
732667
732866
  if (maxVersion && latest && gt(latest, maxVersion)) {
732668
732867
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
732669
- if (gte("1.72.0", maxVersion)) {
732670
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.72.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
732868
+ if (gte("1.73.0", maxVersion)) {
732869
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.73.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
732671
732870
  setUpdateAvailable(false);
732672
732871
  return;
732673
732872
  }
732674
732873
  latest = maxVersion;
732675
732874
  }
732676
- const hasUpdate = latest && !gte("1.72.0", latest) && !shouldSkipVersion(latest);
732875
+ const hasUpdate = latest && !gte("1.73.0", latest) && !shouldSkipVersion(latest);
732677
732876
  setUpdateAvailable(!!hasUpdate);
732678
732877
  if (hasUpdate) {
732679
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.72.0"} -> ${latest}`);
732878
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.73.0"} -> ${latest}`);
732680
732879
  }
732681
732880
  };
732682
732881
  $2[0] = t1;
@@ -732710,7 +732909,7 @@ function PackageManagerAutoUpdater(t0) {
732710
732909
  wrap: "truncate",
732711
732910
  children: [
732712
732911
  "currentVersion: ",
732713
- "1.72.0"
732912
+ "1.73.0"
732714
732913
  ]
732715
732914
  }, undefined, true, undefined, this);
732716
732915
  $2[3] = verbose;
@@ -743422,7 +743621,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
743422
743621
  project_dir: getOriginalCwd(),
743423
743622
  added_dirs: addedDirs
743424
743623
  },
743425
- version: "1.72.0",
743624
+ version: "1.73.0",
743426
743625
  output_style: {
743427
743626
  name: outputStyleName
743428
743627
  },
@@ -743500,7 +743699,7 @@ function StatusLineInner({
743500
743699
  const taskValues = Object.values(tasks2);
743501
743700
  const taskRunningCount = taskValues.filter((task2) => task2.status === "running" || task2.status === "pending").length;
743502
743701
  const defaultStatusLineText = buildDefaultStatusBar({
743503
- version: "1.72.0",
743702
+ version: "1.73.0",
743504
743703
  providerLabel: providerRuntime.providerLabel,
743505
743704
  authMode: providerRuntime.authLabel,
743506
743705
  model: renderModelName(mainLoopModel) || providerRuntime.model || "",
@@ -755678,7 +755877,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
755678
755877
  } catch {}
755679
755878
  const data = {
755680
755879
  trigger: trigger2,
755681
- version: "1.72.0",
755880
+ version: "1.73.0",
755682
755881
  platform: process.platform,
755683
755882
  transcript,
755684
755883
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -768043,7 +768242,7 @@ function WelcomeV2() {
768043
768242
  dimColor: true,
768044
768243
  children: [
768045
768244
  "v",
768046
- "1.72.0"
768245
+ "1.73.0"
768047
768246
  ]
768048
768247
  }, undefined, true, undefined, this)
768049
768248
  ]
@@ -769303,7 +769502,7 @@ function completeOnboarding() {
769303
769502
  saveGlobalConfig((current) => ({
769304
769503
  ...current,
769305
769504
  hasCompletedOnboarding: true,
769306
- lastOnboardingVersion: "1.72.0"
769505
+ lastOnboardingVersion: "1.73.0"
769307
769506
  }));
769308
769507
  }
769309
769508
  function showDialog(root2, renderer) {
@@ -774347,7 +774546,7 @@ function appendToLog(path24, message) {
774347
774546
  cwd: getFsImplementation().cwd(),
774348
774547
  userType: process.env.USER_TYPE,
774349
774548
  sessionId: getSessionId(),
774350
- version: "1.72.0"
774549
+ version: "1.73.0"
774351
774550
  };
774352
774551
  getLogWriter(path24).write(messageWithTimestamp);
774353
774552
  }
@@ -778506,8 +778705,8 @@ async function getEnvLessBridgeConfig() {
778506
778705
  }
778507
778706
  async function checkEnvLessBridgeMinVersion() {
778508
778707
  const cfg = await getEnvLessBridgeConfig();
778509
- if (cfg.min_version && lt("1.72.0", cfg.min_version)) {
778510
- return `Your version of UR (${"1.72.0"}) is too old for Remote Control.
778708
+ if (cfg.min_version && lt("1.73.0", cfg.min_version)) {
778709
+ return `Your version of UR (${"1.73.0"}) is too old for Remote Control.
778511
778710
  Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
778512
778711
  }
778513
778712
  return null;
@@ -778981,7 +779180,7 @@ async function initBridgeCore(params) {
778981
779180
  const rawApi = createBridgeApiClient({
778982
779181
  baseUrl,
778983
779182
  getAccessToken,
778984
- runnerVersion: "1.72.0",
779183
+ runnerVersion: "1.73.0",
778985
779184
  onDebug: logForDebugging,
778986
779185
  onAuth401,
778987
779186
  getTrustedDeviceToken
@@ -788454,7 +788653,7 @@ function getAgUiCapabilities() {
788454
788653
  name: "UR-Nexus",
788455
788654
  type: "ur-nexus",
788456
788655
  description: "Provider-flexible, local-first autonomous engineering workflow agent.",
788457
- version: "1.72.0",
788656
+ version: "1.73.0",
788458
788657
  provider: "UR",
788459
788658
  documentationUrl: "https://github.com/Maitham16/UR/blob/master/docs/AG_UI.md"
788460
788659
  },
@@ -789594,7 +789793,7 @@ function createMCPServer(cwd4, debug2, verbose) {
789594
789793
  };
789595
789794
  const server2 = new Server({
789596
789795
  name: "ur-nexus",
789597
- version: "1.72.0"
789796
+ version: "1.73.0"
789598
789797
  }, {
789599
789798
  capabilities: {
789600
789799
  tools: {}
@@ -790752,7 +790951,7 @@ function thrownResponse(error40) {
790752
790951
  }
790753
790952
  async function createUrMcp2026Runtime(options4) {
790754
790953
  const server2 = createMCPServer(options4.cwd, options4.debug === true, options4.verbose === true);
790755
- const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.72.0" }, { capabilities: {} });
790954
+ const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.73.0" }, { capabilities: {} });
790756
790955
  const [clientTransport, serverTransport] = createLinkedTransportPair();
790757
790956
  try {
790758
790957
  await server2.connect(serverTransport);
@@ -790763,7 +790962,7 @@ async function createUrMcp2026Runtime(options4) {
790763
790962
  }
790764
790963
  const runtime2 = new Mcp2026Runtime({
790765
790964
  cwd: options4.cwd,
790766
- version: "1.72.0",
790965
+ version: "1.73.0",
790767
790966
  backend: {
790768
790967
  listTools: async () => {
790769
790968
  const listed = await client2.listTools();
@@ -792896,7 +793095,7 @@ async function update() {
792896
793095
  logEvent("tengu_update_check", {});
792897
793096
  const diagnostic2 = await getDoctorDiagnostic();
792898
793097
  const result = await checkUpgradeStatus({
792899
- currentVersion: "1.72.0",
793098
+ currentVersion: "1.73.0",
792900
793099
  packageName: UR_AGENT_PACKAGE_NAME,
792901
793100
  installationType: diagnostic2.installationType,
792902
793101
  latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
@@ -794212,7 +794411,7 @@ ${customInstructions}` : customInstructions;
794212
794411
  }
794213
794412
  }
794214
794413
  logForDiagnosticsNoPII("info", "started", {
794215
- version: "1.72.0",
794414
+ version: "1.73.0",
794216
794415
  is_native_binary: isInBundledMode()
794217
794416
  });
794218
794417
  registerCleanup(async () => {
@@ -794998,7 +795197,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
794998
795197
  pendingHookMessages
794999
795198
  }, renderAndRun);
795000
795199
  }
795001
- }).version("1.72.0 (UR-Nexus)", "-v, --version", "Output the version number");
795200
+ }).version("1.73.0 (UR-Nexus)", "-v, --version", "Output the version number");
795002
795201
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
795003
795202
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
795004
795203
  if (canUserConfigureAdvisor()) {
@@ -796050,7 +796249,7 @@ if (false) {}
796050
796249
  async function main2() {
796051
796250
  const args = process.argv.slice(2);
796052
796251
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
796053
- console.log(`${"1.72.0"} (UR-Nexus)`);
796252
+ console.log(`${"1.73.0"} (UR-Nexus)`);
796054
796253
  return;
796055
796254
  }
796056
796255
  if (args[0] === "a2a" && args[1] === "serve" && !args.includes("--help") && !args.includes("-h")) {
@@ -19,7 +19,7 @@ You need:
19
19
 
20
20
  ```sh
21
21
  ur --version
22
- # expected for this release: "1.72.0 (UR-Nexus)"
22
+ # expected for this release: "1.73.0 (UR-Nexus)"
23
23
  ```
24
24
 
25
25
  ## 0.1 First-workspace model selection (1.45.4)
@@ -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.72.0</p>
48
+ <p class="eyebrow">Version 1.73.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.72.0"
10
+ version = "1.73.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.72.0",
5
+ "version": "1.73.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.72.0",
3
+ "version": "1.73.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",