ur-agent 1.76.7 → 1.77.1

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/dist/cli.js CHANGED
@@ -87722,6 +87722,41 @@ function coerceQuestionValueToOptions(question) {
87722
87722
  }
87723
87723
  return null;
87724
87724
  }
87725
+ function looksLikeOptionEntry(value) {
87726
+ if (typeof value === "string")
87727
+ return value.trim().length > 0;
87728
+ const entry = objectValue(value);
87729
+ if (!entry)
87730
+ return false;
87731
+ for (const key of Object.keys(entry)) {
87732
+ if (RESERVED_QUESTION_KEYS.has(key))
87733
+ return false;
87734
+ if (RESERVED_QUESTION_OPTION_KEYS.has(key.toLowerCase()))
87735
+ return false;
87736
+ }
87737
+ return typeof entry.label === "string" || typeof entry.value === "string" || typeof entry.description === "string";
87738
+ }
87739
+ function recoverFlattenedOptions(input, entries) {
87740
+ if (entries.length < 2 || !entries.every(looksLikeOptionEntry))
87741
+ return null;
87742
+ const questionText = stringField(input, [
87743
+ "question",
87744
+ "questionText",
87745
+ "question_text",
87746
+ "q",
87747
+ "query",
87748
+ "prompt",
87749
+ "text",
87750
+ "title",
87751
+ "message",
87752
+ "body",
87753
+ "goal",
87754
+ "header"
87755
+ ]);
87756
+ if (!questionText)
87757
+ return null;
87758
+ return normalizeQuestionInput({ ...input, question: questionText, options: entries }, 0);
87759
+ }
87725
87760
  function normalizeQuestionInput(value, index2) {
87726
87761
  const question = objectValue(value);
87727
87762
  if (!question)
@@ -87800,7 +87835,7 @@ function normalizeAskUserQuestionInput(value) {
87800
87835
  ...commonFields
87801
87836
  };
87802
87837
  }
87803
- return null;
87838
+ return input;
87804
87839
  }
87805
87840
  if (Array.isArray(input.questions)) {
87806
87841
  const normalized = input.questions.map((entry, index2) => normalizeQuestionInput(entry, index2)).filter((entry) => entry !== null && typeof entry === "object");
@@ -87810,7 +87845,14 @@ function normalizeAskUserQuestionInput(value) {
87810
87845
  ...commonFields
87811
87846
  };
87812
87847
  }
87813
- return null;
87848
+ const recovered = recoverFlattenedOptions(input, input.questions);
87849
+ if (recovered && typeof recovered === "object") {
87850
+ return {
87851
+ questions: dedupeQuestions([recovered]),
87852
+ ...commonFields
87853
+ };
87854
+ }
87855
+ return input;
87814
87856
  }
87815
87857
  if (optionsField(input) !== null) {
87816
87858
  const singleQuestion = normalizeQuestionInput(input, 0);
@@ -87821,7 +87863,7 @@ function normalizeAskUserQuestionInput(value) {
87821
87863
  };
87822
87864
  }
87823
87865
  }
87824
- return null;
87866
+ return input;
87825
87867
  }
87826
87868
  function AskUserQuestionResultMessage(t0) {
87827
87869
  const $2 = import_compiler_runtime17.c(3);
@@ -89879,13 +89921,15 @@ async function* readOllamaChunks(response, controller, timeoutMs, options) {
89879
89921
  const reader = response.body.getReader();
89880
89922
  const decoder = new TextDecoder;
89881
89923
  let buffer = "";
89882
- const deadline = timeoutMs > 0 ? Date.now() + timeoutMs : Infinity;
89924
+ const nextDeadline = () => timeoutMs > 0 ? Date.now() + timeoutMs : Infinity;
89925
+ let deadline = nextDeadline();
89883
89926
  try {
89884
89927
  while (true) {
89885
89928
  const { done, value } = await readWithDeadline(reader, deadline, controller, options);
89886
89929
  if (done) {
89887
89930
  break;
89888
89931
  }
89932
+ deadline = nextDeadline();
89889
89933
  buffer += decoder.decode(value, { stream: true });
89890
89934
  let newlineIndex = buffer.indexOf(`
89891
89935
  `);
@@ -90463,7 +90507,7 @@ function withStreamIdleTimeout(source, idleMs, onTimeout) {
90463
90507
  }
90464
90508
  });
90465
90509
  }
90466
- var DEFAULT_STREAM_IDLE_TIMEOUT_MS = 60000, StreamIdleTimeoutError;
90510
+ var DEFAULT_STREAM_IDLE_TIMEOUT_MS = 300000, StreamIdleTimeoutError;
90467
90511
  var init_streamIdleTimeout = __esm(() => {
90468
90512
  StreamIdleTimeoutError = class StreamIdleTimeoutError extends Error {
90469
90513
  idleMs;
@@ -90498,6 +90542,12 @@ function parseNonNegativeInteger(value) {
90498
90542
  function getProviderRequestTimeoutMs(override) {
90499
90543
  return parsePositiveInteger(override) ?? parsePositiveInteger(process.env.API_TIMEOUT_MS) ?? parsePositiveInteger(process.env.UR_API_TIMEOUT_MS) ?? parsePositiveInteger(getInitialSettings().provider?.timeoutMs) ?? DEFAULT_PROVIDER_REQUEST_TIMEOUT_MS;
90500
90544
  }
90545
+ function getProviderStreamTimeoutMs(override) {
90546
+ const explicit = parsePositiveInteger(override) ?? parsePositiveInteger(process.env.UR_STREAM_REQUEST_TIMEOUT_MS) ?? parsePositiveInteger(getInitialSettings().provider?.streamTimeoutMs);
90547
+ if (explicit !== undefined)
90548
+ return explicit;
90549
+ return Math.max(DEFAULT_PROVIDER_STREAM_TIMEOUT_MS, getProviderRequestTimeoutMs());
90550
+ }
90501
90551
  function normalizeProviderMaxRetries(value) {
90502
90552
  const parsed = parseNonNegativeInteger(value);
90503
90553
  if (parsed === undefined)
@@ -90644,7 +90694,7 @@ async function waitForResponseBody(response, signal) {
90644
90694
  }
90645
90695
  }
90646
90696
  async function fetchWithProviderReliability(input, init, options) {
90647
- const timeoutMs = getProviderRequestTimeoutMs(options.timeoutMs);
90697
+ const timeoutMs = options.streaming ? getProviderStreamTimeoutMs(options.timeoutMs) : getProviderRequestTimeoutMs(options.timeoutMs);
90648
90698
  const fetchImpl = options.fetch ?? fetch;
90649
90699
  return withProviderRetry(async () => {
90650
90700
  const timeout = createTimeoutSignal(options.signal, timeoutMs);
@@ -90685,7 +90735,7 @@ async function fetchWithProviderReliability(input, init, options) {
90685
90735
  }, options);
90686
90736
  }
90687
90737
  async function axiosPostWithProviderReliability(url3, body, config2, options = {}) {
90688
- const timeout = getProviderRequestTimeoutMs(options.timeoutMs);
90738
+ const timeout = options.streaming ? getProviderStreamTimeoutMs(options.timeoutMs) : getProviderRequestTimeoutMs(options.timeoutMs);
90689
90739
  return withProviderRetry(() => axios_default.post(url3, body, {
90690
90740
  ...config2,
90691
90741
  timeout,
@@ -90726,7 +90776,7 @@ function normalizeProviderEndpoint(baseUrl, defaultBaseUrl, finalSegment) {
90726
90776
  }
90727
90777
  return url3.toString().replace(/\/$/, "");
90728
90778
  }
90729
- var DEFAULT_PROVIDER_REQUEST_TIMEOUT_MS = 120000, DEFAULT_PROVIDER_MAX_RETRIES = 3, DEFAULT_RETRY_BASE_DELAY_MS = 250, RETRYABLE_STATUSES, NON_RETRYABLE_STATUSES, TRANSIENT_NETWORK_CODES, ProviderHTTPError, ProviderTimeoutError;
90779
+ var DEFAULT_PROVIDER_REQUEST_TIMEOUT_MS = 120000, DEFAULT_PROVIDER_STREAM_TIMEOUT_MS = 900000, DEFAULT_PROVIDER_MAX_RETRIES = 3, DEFAULT_RETRY_BASE_DELAY_MS = 250, RETRYABLE_STATUSES, NON_RETRYABLE_STATUSES, TRANSIENT_NETWORK_CODES, ProviderHTTPError, ProviderTimeoutError;
90730
90780
  var init_providerHttp = __esm(() => {
90731
90781
  init_axios2();
90732
90782
  init_settings2();
@@ -90973,6 +91023,10 @@ async function* streamOpenAIEvents(body, options) {
90973
91023
  }
90974
91024
  };
90975
91025
  for await (const payload of readSSEData(body, options.signal)) {
91026
+ if (payload === SSE_KEEPALIVE) {
91027
+ yield { type: "ping" };
91028
+ continue;
91029
+ }
90976
91030
  if (payload === "[DONE]") {
90977
91031
  sawDone = true;
90978
91032
  break;
@@ -91187,6 +91241,10 @@ async function* streamOpenAIResponsesEvents(body, options) {
91187
91241
  };
91188
91242
  };
91189
91243
  for await (const payload of readSSEData(body, options.signal)) {
91244
+ if (payload === SSE_KEEPALIVE) {
91245
+ yield { type: "ping" };
91246
+ continue;
91247
+ }
91190
91248
  if (payload === "[DONE]")
91191
91249
  break;
91192
91250
  const event = parseJSONPayload(payload, `${providerName} SSE event`);
@@ -91339,11 +91397,19 @@ async function* streamAnthropicEvents(body, options) {
91339
91397
  const toolIds = new Set;
91340
91398
  const streamedToolInputs = new Map;
91341
91399
  for await (const payload of readSSEData(body, options.signal)) {
91400
+ if (payload === SSE_KEEPALIVE) {
91401
+ yield { type: "ping" };
91402
+ continue;
91403
+ }
91342
91404
  if (payload === "[DONE]")
91343
91405
  break;
91344
91406
  const event = parseJSONPayload(payload, `${providerName} SSE event`);
91345
- if (!event || event.type === "ping")
91407
+ if (!event)
91408
+ continue;
91409
+ if (event.type === "ping") {
91410
+ yield { type: "ping" };
91346
91411
  continue;
91412
+ }
91347
91413
  throwProviderPayloadError(event, providerName);
91348
91414
  if (!sawMessageStart && event.type !== "message_start") {
91349
91415
  sawMessageStart = true;
@@ -91510,6 +91576,10 @@ async function* streamGeminiEvents(body, options) {
91510
91576
  yield { type: "content_block_stop", index: currentIndex };
91511
91577
  };
91512
91578
  for await (const payload of readSSEData(body, options.signal)) {
91579
+ if (payload === SSE_KEEPALIVE) {
91580
+ yield { type: "ping" };
91581
+ continue;
91582
+ }
91513
91583
  if (payload === "[DONE]")
91514
91584
  break;
91515
91585
  const parsed = parseJSONPayload(payload, `${providerName} SSE chunk`);
@@ -91628,6 +91698,7 @@ async function* readSSEData(body, signal) {
91628
91698
  let buffer = "";
91629
91699
  for await (const chunk of readTextChunks(body, signal)) {
91630
91700
  buffer += chunk;
91701
+ let emitted = false;
91631
91702
  while (true) {
91632
91703
  const delimiter = findSSEDelimiter(buffer);
91633
91704
  if (!delimiter)
@@ -91635,9 +91706,13 @@ async function* readSSEData(body, signal) {
91635
91706
  const rawEvent = buffer.slice(0, delimiter.index);
91636
91707
  buffer = buffer.slice(delimiter.index + delimiter.length);
91637
91708
  const data = parseSSEEvent(rawEvent);
91638
- if (data !== undefined)
91709
+ if (data !== undefined) {
91710
+ emitted = true;
91639
91711
  yield data;
91712
+ }
91640
91713
  }
91714
+ if (!emitted)
91715
+ yield SSE_KEEPALIVE;
91641
91716
  }
91642
91717
  if (buffer.trim()) {
91643
91718
  const data = parseSSEEvent(buffer);
@@ -91845,7 +91920,7 @@ function canonicalJson(value) {
91845
91920
  }
91846
91921
  return JSON.stringify(value);
91847
91922
  }
91848
- var EMPTY_USAGE;
91923
+ var EMPTY_USAGE, SSE_KEEPALIVE = "\x00ur:sse-keepalive";
91849
91924
  var init_streamingAdapters = __esm(() => {
91850
91925
  init_providerClient();
91851
91926
  init_json();
@@ -92788,7 +92863,8 @@ async function createOpenRouterClient(options) {
92788
92863
  }, {
92789
92864
  maxRetries,
92790
92865
  timeoutMs: requestOptions?.timeoutMs,
92791
- signal
92866
+ signal,
92867
+ streaming: true
92792
92868
  });
92793
92869
  const requestId = response.headers?.["x-request-id"] ?? `openrouter-${randomUUID7()}`;
92794
92870
  return {
@@ -94046,7 +94122,8 @@ async function createStandardAPIClient(options) {
94046
94122
  }, {
94047
94123
  maxRetries,
94048
94124
  timeoutMs: requestOptions?.timeoutMs,
94049
- signal
94125
+ signal,
94126
+ streaming: true
94050
94127
  });
94051
94128
  const requestId = providerRequestId(family, response.headers) ?? `${family}-${randomUUID10()}`;
94052
94129
  const streamOptions = {
@@ -107465,7 +107542,7 @@ var init_auth = __esm(() => {
107465
107542
 
107466
107543
  // src/utils/userAgent.ts
107467
107544
  function getURCodeUserAgent() {
107468
- return `ur/${"1.76.7"}`;
107545
+ return `ur/${"1.77.1"}`;
107469
107546
  }
107470
107547
 
107471
107548
  // src/utils/workloadContext.ts
@@ -107487,7 +107564,7 @@ function getUserAgent() {
107487
107564
  const clientApp = process.env.UR_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}` : "";
107488
107565
  const workload = getWorkload();
107489
107566
  const workloadSuffix = workload ? `, workload/${workload}` : "";
107490
- return `ur-cli/${"1.76.7"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
107567
+ return `ur-cli/${"1.77.1"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
107491
107568
  }
107492
107569
  function getMCPUserAgent() {
107493
107570
  const parts = [];
@@ -107501,7 +107578,7 @@ function getMCPUserAgent() {
107501
107578
  parts.push(`client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}`);
107502
107579
  }
107503
107580
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
107504
- return `ur/${"1.76.7"}${suffix}`;
107581
+ return `ur/${"1.77.1"}${suffix}`;
107505
107582
  }
107506
107583
  function getWebFetchUserAgent() {
107507
107584
  return `UR-User (${getURCodeUserAgent()})`;
@@ -107639,7 +107716,7 @@ var init_user = __esm(() => {
107639
107716
  deviceId,
107640
107717
  sessionId: getSessionId(),
107641
107718
  email: getEmail(),
107642
- appVersion: "1.76.7",
107719
+ appVersion: "1.77.1",
107643
107720
  platform: getHostPlatformForAnalytics(),
107644
107721
  organizationUuid,
107645
107722
  accountUuid,
@@ -115526,7 +115603,7 @@ var init_metadata = __esm(() => {
115526
115603
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
115527
115604
  WHITESPACE_REGEX = /\s+/;
115528
115605
  getVersionBase = memoize_default(() => {
115529
- const match = "1.76.7".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
115606
+ const match = "1.77.1".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
115530
115607
  return match ? match[0] : undefined;
115531
115608
  });
115532
115609
  buildEnvContext = memoize_default(async () => {
@@ -115566,7 +115643,7 @@ var init_metadata = __esm(() => {
115566
115643
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
115567
115644
  isURCodeAction: isEnvTruthy(process.env.UR_CODE_ACTION),
115568
115645
  isURAiAuth: isURAISubscriber(),
115569
- version: "1.76.7",
115646
+ version: "1.77.1",
115570
115647
  versionBase: getVersionBase(),
115571
115648
  buildTime: "",
115572
115649
  deploymentEnvironment: env2.detectDeploymentEnvironment(),
@@ -116236,7 +116313,7 @@ function initialize1PEventLogging() {
116236
116313
  const platform2 = getPlatform();
116237
116314
  const attributes = {
116238
116315
  [import_semantic_conventions4.ATTR_SERVICE_NAME]: "ur",
116239
- [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.76.7"
116316
+ [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.77.1"
116240
116317
  };
116241
116318
  if (platform2 === "wsl") {
116242
116319
  const wslVersion = getWslVersion();
@@ -116264,7 +116341,7 @@ function initialize1PEventLogging() {
116264
116341
  })
116265
116342
  ]
116266
116343
  });
116267
- firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.76.7");
116344
+ firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.77.1");
116268
116345
  }
116269
116346
  async function reinitialize1PEventLoggingIfConfigChanged() {
116270
116347
  if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
@@ -118714,6 +118791,7 @@ var init_types2 = __esm(() => {
118714
118791
  model: exports_external.string().optional().describe("Selected model name for the active provider"),
118715
118792
  baseUrl: exports_external.string().optional().describe("Provider base URL without embedded credentials"),
118716
118793
  timeoutMs: exports_external.number().int().positive().optional().describe("Provider HTTP request timeout in milliseconds. Defaults to 120000."),
118794
+ streamTimeoutMs: exports_external.number().int().positive().optional().describe("How long a streaming request may wait for response headers, in milliseconds. Defaults to 900000; mid-stream liveness is governed by the inactivity watchdog."),
118717
118795
  commandPath: exports_external.string().optional().describe("Explicit official CLI executable path for subscription providers"),
118718
118796
  fallback: exports_external.union([exports_external.enum(PROVIDER_SETTING_IDS), exports_external.literal("disabled")]).optional().describe("Optional recovery provider shown by provider diagnostics; switching is always explicit"),
118719
118797
  openaiTransport: exports_external.enum(["chat-completions", "responses"]).optional().describe("OpenAI API transport. Defaults to chat-completions; Responses is explicit opt-in."),
@@ -126045,7 +126123,7 @@ function formatAgentTrendReport(report = buildAgentTrendReport()) {
126045
126123
  function formatA2AAgentCard(options = {}, pretty = true) {
126046
126124
  return JSON.stringify(buildA2AAgentCard(options), null, pretty ? 2 : 0);
126047
126125
  }
126048
- var urVersion = "1.76.7", researchSnapshotDate = "2026-07-15", coverage, priorityRoadmap;
126126
+ var urVersion = "1.77.1", researchSnapshotDate = "2026-07-15", coverage, priorityRoadmap;
126049
126127
  var init_trends = __esm(() => {
126050
126128
  init_a2aCardSignature();
126051
126129
  coverage = [
@@ -128848,7 +128926,7 @@ function getAttributionHeader(fingerprint) {
128848
128926
  if (!isAttributionHeaderEnabled()) {
128849
128927
  return "";
128850
128928
  }
128851
- const version2 = `${"1.76.7"}.${fingerprint}`;
128929
+ const version2 = `${"1.77.1"}.${fingerprint}`;
128852
128930
  const entrypoint = process.env.UR_CODE_ENTRYPOINT ?? "unknown";
128853
128931
  const cch = "";
128854
128932
  const workload = getWorkload();
@@ -156847,7 +156925,7 @@ var init_projectSafety = __esm(() => {
156847
156925
  function getInstruments() {
156848
156926
  if (instruments)
156849
156927
  return instruments;
156850
- const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.76.7");
156928
+ const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.77.1");
156851
156929
  instruments = {
156852
156930
  operationDuration: meter.createHistogram("gen_ai.client.operation.duration", {
156853
156931
  description: "GenAI operation duration.",
@@ -156945,7 +157023,7 @@ function genAiAgentAttributes() {
156945
157023
  "gen_ai.operation.name": GEN_AI_OPERATION_INVOKE_AGENT,
156946
157024
  "gen_ai.provider.name": "ur",
156947
157025
  "gen_ai.agent.name": "UR-Nexus",
156948
- "gen_ai.agent.version": "1.76.7"
157026
+ "gen_ai.agent.version": "1.77.1"
156949
157027
  };
156950
157028
  }
156951
157029
  function genAiWorkflowAttributes(workflowName) {
@@ -156961,7 +157039,7 @@ function genAiWorkflowAttributes(workflowName) {
156961
157039
  function startGenAiWorkflowSpan(workflowName) {
156962
157040
  const attributes = genAiWorkflowAttributes(workflowName);
156963
157041
  const name = typeof attributes["gen_ai.workflow.name"] === "string" ? `invoke_workflow ${attributes["gen_ai.workflow.name"]}` : GEN_AI_OPERATION_INVOKE_WORKFLOW;
156964
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.76.7").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
157042
+ return import_api10.trace.getTracer("ur-agent.gen_ai", "1.77.1").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
156965
157043
  }
156966
157044
  function endGenAiWorkflowSpan(span, options2 = {}) {
156967
157045
  try {
@@ -156999,7 +157077,7 @@ function startGenAiMemorySpan(operation, options2 = {}) {
156999
157077
  if (options2.recordCount !== undefined && Number.isInteger(options2.recordCount) && options2.recordCount >= 0) {
157000
157078
  attributes["gen_ai.memory.record.count"] = options2.recordCount;
157001
157079
  }
157002
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.76.7").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
157080
+ return import_api10.trace.getTracer("ur-agent.gen_ai", "1.77.1").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
157003
157081
  }
157004
157082
  function endGenAiMemorySpan(span, options2 = {}) {
157005
157083
  try {
@@ -200758,7 +200836,7 @@ var require_color_convert = __commonJS((exports, module) => {
200758
200836
  module.exports = convert;
200759
200837
  });
200760
200838
 
200761
- // node_modules/cli-highlight/node_modules/ansi-styles/index.js
200839
+ // node_modules/cli-highlight/node_modules/chalk/node_modules/ansi-styles/index.js
200762
200840
  var require_ansi_styles = __commonJS((exports, module) => {
200763
200841
  var wrapAnsi163 = (fn, offset) => (...args) => {
200764
200842
  const code = fn(...args);
@@ -250647,7 +250725,7 @@ function getTelemetryAttributes() {
250647
250725
  attributes["session.id"] = sessionId;
250648
250726
  }
250649
250727
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
250650
- attributes["app.version"] = "1.76.7";
250728
+ attributes["app.version"] = "1.77.1";
250651
250729
  }
250652
250730
  const oauthAccount = getOauthAccountInfo();
250653
250731
  if (oauthAccount) {
@@ -259139,21 +259217,39 @@ async function* all3(generators, concurrencyCap = Infinity) {
259139
259217
  };
259140
259218
  const waiting = [...generators];
259141
259219
  const promises = new Set;
259142
- while (promises.size < concurrencyCap && waiting.length > 0) {
259143
- const gen = waiting.shift();
259144
- promises.add(next(gen));
259145
- }
259146
- while (promises.size > 0) {
259147
- const { done, value, generator, promise: promise2 } = await Promise.race(promises);
259148
- promises.delete(promise2);
259149
- if (!done) {
259150
- promises.add(next(generator));
259151
- if (value !== undefined) {
259152
- yield value;
259220
+ const running = new Set;
259221
+ const start = (generator) => {
259222
+ running.add(generator);
259223
+ promises.add(next(generator));
259224
+ };
259225
+ try {
259226
+ while (promises.size < concurrencyCap && waiting.length > 0) {
259227
+ start(waiting.shift());
259228
+ }
259229
+ while (promises.size > 0) {
259230
+ const { done, value, generator, promise: promise2 } = await Promise.race(promises);
259231
+ promises.delete(promise2);
259232
+ if (!done) {
259233
+ promises.add(next(generator));
259234
+ if (value !== undefined) {
259235
+ yield value;
259236
+ }
259237
+ } else {
259238
+ running.delete(generator);
259239
+ if (waiting.length > 0) {
259240
+ start(waiting.shift());
259241
+ }
259153
259242
  }
259154
- } else if (waiting.length > 0) {
259155
- const nextGen = waiting.shift();
259156
- promises.add(next(nextGen));
259243
+ }
259244
+ } finally {
259245
+ for (const generator of running) {
259246
+ generator.return(undefined).catch(() => {});
259247
+ }
259248
+ for (const generator of waiting) {
259249
+ generator.return(undefined).catch(() => {});
259250
+ }
259251
+ for (const promise2 of promises) {
259252
+ promise2.catch(() => {});
259157
259253
  }
259158
259254
  }
259159
259255
  }
@@ -259176,11 +259272,16 @@ var init_generators = __esm(() => {
259176
259272
 
259177
259273
  // src/services/tools/toolOrchestration.ts
259178
259274
  function getMaxToolUseConcurrency() {
259179
- const configured = Number.parseInt(process.env.UR_CODE_MAX_TOOL_USE_CONCURRENCY ?? "", 10);
259180
- if (!Number.isFinite(configured) || configured < 1) {
259181
- return DEFAULT_MAX_TOOL_USE_CONCURRENCY;
259275
+ for (const raw of [
259276
+ process.env.UR_CODE_MAX_TOOL_USE_CONCURRENCY,
259277
+ process.env.UR_MAX_CONCURRENT_TOOLS
259278
+ ]) {
259279
+ const configured = Number.parseInt(raw ?? "", 10);
259280
+ if (Number.isFinite(configured) && configured >= 1) {
259281
+ return Math.min(configured, HARD_MAX_TOOL_USE_CONCURRENCY);
259282
+ }
259182
259283
  }
259183
- return Math.min(configured, HARD_MAX_TOOL_USE_CONCURRENCY);
259284
+ return DEFAULT_MAX_TOOL_USE_CONCURRENCY;
259184
259285
  }
259185
259286
  function assistantMessageContainsToolUse(message, toolUseId) {
259186
259287
  const content = message.message?.content;
@@ -297131,7 +297232,7 @@ function getInstallationEnv() {
297131
297232
  return;
297132
297233
  }
297133
297234
  function getURCodeVersion() {
297134
- return "1.76.7";
297235
+ return "1.77.1";
297135
297236
  }
297136
297237
  async function getInstalledVSCodeExtensionVersion(command) {
297137
297238
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -304462,7 +304563,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
304462
304563
  const client2 = new Client({
304463
304564
  name: "ur",
304464
304565
  title: "UR",
304465
- version: "1.76.7",
304566
+ version: "1.77.1",
304466
304567
  description: "UR-Nexus autonomous engineering workflow engine",
304467
304568
  websiteUrl: PRODUCT_URL
304468
304569
  }, {
@@ -304822,7 +304923,7 @@ var init_client5 = __esm(() => {
304822
304923
  const client2 = new Client({
304823
304924
  name: "ur",
304824
304925
  title: "UR",
304825
- version: "1.76.7",
304926
+ version: "1.77.1",
304826
304927
  description: "UR-Nexus autonomous engineering workflow engine",
304827
304928
  websiteUrl: PRODUCT_URL
304828
304929
  }, {
@@ -317375,7 +317476,7 @@ async function createRuntime() {
317375
317476
  bootstrapTelemetry();
317376
317477
  const resource = defaultResource().merge(detectResources({ detectors: [envDetector] })).merge(resourceFromAttributes({
317377
317478
  [import_semantic_conventions7.ATTR_SERVICE_NAME]: "ur-agent",
317378
- [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.76.7"
317479
+ [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.77.1"
317379
317480
  }));
317380
317481
  const tracerProvider = exporters.traces.length > 0 ? new BasicTracerProvider({
317381
317482
  resource,
@@ -317408,11 +317509,11 @@ async function createRuntime() {
317408
317509
  setMeterProvider(meterProvider);
317409
317510
  setLoggerProvider(loggerProvider);
317410
317511
  if (meterProvider) {
317411
- const meter = meterProvider.getMeter("ur-agent", "1.76.7");
317512
+ const meter = meterProvider.getMeter("ur-agent", "1.77.1");
317412
317513
  setMeter(meter, (name, options2) => meter.createCounter(name, options2));
317413
317514
  }
317414
317515
  if (loggerProvider) {
317415
- setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.76.7"));
317516
+ setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.77.1"));
317416
317517
  }
317417
317518
  if (!cleanupRegistered2) {
317418
317519
  cleanupRegistered2 = true;
@@ -318074,9 +318175,9 @@ async function assertMinVersion() {
318074
318175
  if (false) {}
318075
318176
  try {
318076
318177
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
318077
- if (versionConfig.minVersion && lt("1.76.7", versionConfig.minVersion)) {
318178
+ if (versionConfig.minVersion && lt("1.77.1", versionConfig.minVersion)) {
318078
318179
  console.error(`
318079
- It looks like your version of UR (${"1.76.7"}) needs an update.
318180
+ It looks like your version of UR (${"1.77.1"}) needs an update.
318080
318181
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
318081
318182
 
318082
318183
  To update, please run:
@@ -318292,7 +318393,7 @@ async function installGlobalPackage(specificVersion) {
318292
318393
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
318293
318394
  logEvent("tengu_auto_updater_lock_contention", {
318294
318395
  pid: process.pid,
318295
- currentVersion: "1.76.7"
318396
+ currentVersion: "1.77.1"
318296
318397
  });
318297
318398
  return "in_progress";
318298
318399
  }
@@ -318301,7 +318402,7 @@ async function installGlobalPackage(specificVersion) {
318301
318402
  if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
318302
318403
  logError2(new Error("Windows NPM detected in WSL environment"));
318303
318404
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
318304
- currentVersion: "1.76.7"
318405
+ currentVersion: "1.77.1"
318305
318406
  });
318306
318407
  console.error(`
318307
318408
  Error: Windows NPM detected in WSL
@@ -318836,7 +318937,7 @@ function detectLinuxGlobPatternWarnings() {
318836
318937
  }
318837
318938
  async function getDoctorDiagnostic() {
318838
318939
  const installationType = await getCurrentInstallationType();
318839
- const version2 = typeof MACRO !== "undefined" ? "1.76.7" : "unknown";
318940
+ const version2 = typeof MACRO !== "undefined" ? "1.77.1" : "unknown";
318840
318941
  const installationPath = await getInstallationPath();
318841
318942
  const invokedBinary = getInvokedBinary();
318842
318943
  const multipleInstallations = await detectMultipleInstallations();
@@ -319771,8 +319872,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
319771
319872
  const maxVersion = await getMaxVersion();
319772
319873
  if (maxVersion && gt(version2, maxVersion)) {
319773
319874
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
319774
- if (gte("1.76.7", maxVersion)) {
319775
- logForDebugging(`Native installer: current version ${"1.76.7"} is already at or above maxVersion ${maxVersion}, skipping update`);
319875
+ if (gte("1.77.1", maxVersion)) {
319876
+ logForDebugging(`Native installer: current version ${"1.77.1"} is already at or above maxVersion ${maxVersion}, skipping update`);
319776
319877
  logEvent("tengu_native_update_skipped_max_version", {
319777
319878
  latency_ms: Date.now() - startTime,
319778
319879
  max_version: maxVersion,
@@ -319783,7 +319884,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
319783
319884
  version2 = maxVersion;
319784
319885
  }
319785
319886
  }
319786
- if (!forceReinstall && version2 === "1.76.7" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
319887
+ if (!forceReinstall && version2 === "1.77.1" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
319787
319888
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
319788
319889
  logEvent("tengu_native_update_complete", {
319789
319890
  latency_ms: Date.now() - startTime,
@@ -340957,16 +341058,8 @@ async function* runAgent({
340957
341058
  }
340958
341059
  if (message.type === "attachment") {
340959
341060
  if (message.attachment.type === "max_turns_reached") {
340960
- logForDebugging(`[Agent
340961
- : $
340962
- {
340963
- agentDefinition.agentType
340964
- }
340965
- ] Reached max turns limit ($
340966
- {
340967
- message.attachment.maxTurns
340968
- }
340969
- )`);
341061
+ logForDebugging(`[Agent: ${agentDefinition.agentType}] Reached max turns limit (${message.attachment.maxTurns})`);
341062
+ yield message;
340970
341063
  break;
340971
341064
  }
340972
341065
  yield message;
@@ -353962,6 +354055,15 @@ async function getShellConfigImpl() {
353962
354055
  const provider = await createBashShellProvider(binShell);
353963
354056
  return { provider };
353964
354057
  }
354058
+ function ensureTaskOutputDir() {
354059
+ taskOutputDirReady ??= mkdir20(getTaskOutputDir(), { recursive: true }).then(() => {
354060
+ return;
354061
+ }, (error40) => {
354062
+ taskOutputDirReady = undefined;
354063
+ throw error40;
354064
+ });
354065
+ return taskOutputDirReady;
354066
+ }
353965
354067
  async function exec3(command, abortSignal, shellType, options2) {
353966
354068
  const {
353967
354069
  timeout,
@@ -354018,7 +354120,7 @@ async function exec3(command, abortSignal, shellType, options2) {
354018
354120
  const usePipeMode = !!onStdout;
354019
354121
  const taskId = generateTaskId("local_bash");
354020
354122
  const taskOutput = new TaskOutput(taskId, onProgress ?? null, !usePipeMode);
354021
- await mkdir20(getTaskOutputDir(), { recursive: true });
354123
+ await ensureTaskOutputDir();
354022
354124
  let outputHandle;
354023
354125
  let stderrHandle;
354024
354126
  if (!usePipeMode) {
@@ -354124,7 +354226,7 @@ function setCwd(path13, relativeTo) {
354124
354226
  } catch (_error) {}
354125
354227
  }
354126
354228
  }
354127
- var DEFAULT_TIMEOUT, getShellConfig, getPsProvider, resolveProvider;
354229
+ var DEFAULT_TIMEOUT, getShellConfig, getPsProvider, resolveProvider, taskOutputDirReady;
354128
354230
  var init_Shell = __esm(() => {
354129
354231
  init_memoize();
354130
354232
  init_analytics();
@@ -365348,8 +365450,43 @@ function stripTrailingWhitespace(str2) {
365348
365450
  }
365349
365451
  return result;
365350
365452
  }
365453
+ function foldInvisibleChars(line) {
365454
+ return line.normalize("NFC").replace(EXOTIC_SPACES, " ").replace(ZERO_WIDTH, "");
365455
+ }
365351
365456
  function normalizeLineForMatch(line) {
365352
- return line.replaceAll("\t", " ").replace(/\s+$/, "");
365457
+ return foldInvisibleChars(line).replaceAll("\t", " ").replace(/\s+$/, "");
365458
+ }
365459
+ function lineBody(line) {
365460
+ return normalizeLineForMatch(line).trimStart();
365461
+ }
365462
+ function indentWidth(line) {
365463
+ const normalized = normalizeLineForMatch(line);
365464
+ return normalized.length - normalized.trimStart().length;
365465
+ }
365466
+ function shiftIndentation(text, columns) {
365467
+ if (columns === 0)
365468
+ return text;
365469
+ return text.split(`
365470
+ `).map((line) => {
365471
+ if (line.trim() === "")
365472
+ return line;
365473
+ if (columns > 0)
365474
+ return " ".repeat(columns) + line;
365475
+ const removable = line.length - line.trimStart().length;
365476
+ return line.slice(Math.min(-columns, removable));
365477
+ }).join(`
365478
+ `);
365479
+ }
365480
+ function stripLineNumberPrefixes(searchString) {
365481
+ const lines = searchString.split(`
365482
+ `);
365483
+ const meaningful = lines.filter((line) => line.trim() !== "");
365484
+ if (meaningful.length === 0)
365485
+ return null;
365486
+ if (!meaningful.every((line) => LINE_NUMBER_PREFIX.test(line)))
365487
+ return null;
365488
+ return lines.map((line) => line.replace(LINE_NUMBER_PREFIX, "")).join(`
365489
+ `);
365353
365490
  }
365354
365491
  function findActualStringWhitespaceTolerant(fileContent, searchString) {
365355
365492
  const searchLines = searchString.split(`
@@ -365382,17 +365519,110 @@ function findActualStringWhitespaceTolerant(fileContent, searchString) {
365382
365519
  }
365383
365520
  return null;
365384
365521
  }
365385
- function findActualString(fileContent, searchString) {
365522
+ function findActualStringIndentTolerant(fileContent, searchString) {
365523
+ const searchLines = searchString.split(`
365524
+ `);
365525
+ const fileLines = fileContent.split(`
365526
+ `);
365527
+ if (searchLines.length === 0 || searchLines.length > fileLines.length) {
365528
+ return null;
365529
+ }
365530
+ const searchBodies = searchLines.map(lineBody);
365531
+ const firstBody = searchBodies[0];
365532
+ if (searchBodies.every((body) => body === ""))
365533
+ return null;
365534
+ for (let start = 0;start <= fileLines.length - searchLines.length; start++) {
365535
+ if (lineBody(fileLines[start]) !== firstBody)
365536
+ continue;
365537
+ let shift = null;
365538
+ let match = true;
365539
+ for (let j2 = 0;j2 < searchLines.length; j2++) {
365540
+ const fileLine = fileLines[start + j2];
365541
+ const searchBody = searchBodies[j2];
365542
+ if (lineBody(fileLine) !== searchBody) {
365543
+ match = false;
365544
+ break;
365545
+ }
365546
+ if (searchBody === "")
365547
+ continue;
365548
+ const lineShift = indentWidth(fileLine) - indentWidth(searchLines[j2]);
365549
+ if (shift === null) {
365550
+ shift = lineShift;
365551
+ } else if (shift !== lineShift) {
365552
+ match = false;
365553
+ break;
365554
+ }
365555
+ }
365556
+ if (match && shift !== null && shift !== 0) {
365557
+ return {
365558
+ actual: fileLines.slice(start, start + searchLines.length).join(`
365559
+ `),
365560
+ indentShift: shift
365561
+ };
365562
+ }
365563
+ }
365564
+ return null;
365565
+ }
365566
+ function findEditTarget(fileContent, searchString) {
365386
365567
  if (fileContent.includes(searchString)) {
365387
- return searchString;
365568
+ return { actual: searchString, indentShift: 0 };
365388
365569
  }
365389
365570
  const normalizedSearch = normalizeQuotes(searchString);
365390
365571
  const normalizedFile = normalizeQuotes(fileContent);
365391
365572
  const searchIndex = normalizedFile.indexOf(normalizedSearch);
365392
365573
  if (searchIndex !== -1) {
365393
- return fileContent.substring(searchIndex, searchIndex + searchString.length);
365574
+ return {
365575
+ actual: fileContent.substring(searchIndex, searchIndex + searchString.length),
365576
+ indentShift: 0
365577
+ };
365578
+ }
365579
+ const whitespaceMatch = findActualStringWhitespaceTolerant(fileContent, searchString);
365580
+ if (whitespaceMatch !== null) {
365581
+ return { actual: whitespaceMatch, indentShift: 0 };
365394
365582
  }
365395
- return findActualStringWhitespaceTolerant(fileContent, searchString);
365583
+ const indentMatch = findActualStringIndentTolerant(fileContent, searchString);
365584
+ if (indentMatch !== null) {
365585
+ return indentMatch;
365586
+ }
365587
+ const withoutPrefixes = stripLineNumberPrefixes(searchString);
365588
+ if (withoutPrefixes !== null && withoutPrefixes !== searchString) {
365589
+ return findEditTarget(fileContent, withoutPrefixes);
365590
+ }
365591
+ return null;
365592
+ }
365593
+ function findActualString(fileContent, searchString) {
365594
+ return findEditTarget(fileContent, searchString)?.actual ?? null;
365595
+ }
365596
+ function describeEditMatchFailure(fileContent, searchString) {
365597
+ const searchLines = searchString.split(`
365598
+ `);
365599
+ const firstSearchLine = searchLines.find((line) => line.trim() !== "");
365600
+ if (firstSearchLine === undefined) {
365601
+ return "String to replace not found in file. The string is blank.";
365602
+ }
365603
+ const fileLines = fileContent.split(`
365604
+ `);
365605
+ const anchorBody = lineBody(firstSearchLine);
365606
+ const anchors = fileLines.map((line, index2) => ({ line, index: index2 })).filter((entry) => lineBody(entry.line) === anchorBody);
365607
+ if (anchors.length === 0) {
365608
+ return "String to replace not found in file. No line in the file matches its " + `first line: ${JSON.stringify(firstSearchLine.trim())}. Read the file ` + "again and copy the target text from the current contents.";
365609
+ }
365610
+ const anchor = anchors[0];
365611
+ const offset = searchLines.indexOf(firstSearchLine);
365612
+ const details = anchors.slice(0, 3).map((entry) => {
365613
+ const start = entry.index - offset;
365614
+ for (let j2 = 0;j2 < searchLines.length; j2++) {
365615
+ const fileLine = fileLines[start + j2];
365616
+ if (fileLine === undefined) {
365617
+ return `line ${entry.index + 1}: the file ends before the string does`;
365618
+ }
365619
+ if (lineBody(fileLine) !== lineBody(searchLines[j2])) {
365620
+ return `line ${start + j2 + 1}: file has ${JSON.stringify(fileLine)}, ` + `string has ${JSON.stringify(searchLines[j2])}`;
365621
+ }
365622
+ }
365623
+ return `line ${entry.index + 1}: matches`;
365624
+ }).join("; ");
365625
+ return `String to replace not found in file. Its first line appears at line ` + `${anchor.index + 1}, but the block diverges \u2014 ${details}.`;
365396
365626
  }
365397
365627
  function preserveQuoteStyle(oldString, actualOldString, newString) {
365398
365628
  if (oldString === actualOldString) {
@@ -365693,7 +365923,7 @@ function areFileEditsInputsEquivalent(input1, input2) {
365693
365923
  }
365694
365924
  return areFileEditsEquivalent(input1.edits, input2.edits, fileContent);
365695
365925
  }
365696
- var LEFT_SINGLE_CURLY_QUOTE = "\u2018", RIGHT_SINGLE_CURLY_QUOTE = "\u2019", LEFT_DOUBLE_CURLY_QUOTE = "\u201C", RIGHT_DOUBLE_CURLY_QUOTE = "\u201D", DIFF_SNIPPET_MAX_BYTES = 8192, DESANITIZATIONS;
365926
+ var LEFT_SINGLE_CURLY_QUOTE = "\u2018", RIGHT_SINGLE_CURLY_QUOTE = "\u2019", LEFT_DOUBLE_CURLY_QUOTE = "\u201C", RIGHT_DOUBLE_CURLY_QUOTE = "\u201D", EXOTIC_SPACES, ZERO_WIDTH, LINE_NUMBER_PREFIX, DIFF_SNIPPET_MAX_BYTES = 8192, DESANITIZATIONS;
365697
365927
  var init_utils10 = __esm(() => {
365698
365928
  init_libesm();
365699
365929
  init_log2();
@@ -365702,6 +365932,9 @@ var init_utils10 = __esm(() => {
365702
365932
  init_diff2();
365703
365933
  init_errors();
365704
365934
  init_file();
365935
+ EXOTIC_SPACES = /[\u00A0\u1680\u2000-\u200A\u202F\u205F\u3000]/g;
365936
+ ZERO_WIDTH = /[\u200B-\u200D\u2060\uFEFF]/g;
365937
+ LINE_NUMBER_PREFIX = /^\s*\d+[\u2192\t]/;
365705
365938
  DESANITIZATIONS = {
365706
365939
  "<fnr>": "<function_results>",
365707
365940
  "<n>": "<name>",
@@ -366224,42 +366457,28 @@ var init_FileEditTool = __esm(() => {
366224
366457
  };
366225
366458
  }
366226
366459
  const readTimestamp = toolUseContext.readFileState.get(fullFilePath);
366227
- if (!readTimestamp || readTimestamp.isPartialView) {
366228
- return {
366229
- result: false,
366230
- behavior: "ask",
366231
- message: "File has not been read yet. Read it first before writing to it.",
366232
- meta: {
366233
- isFilePathAbsolute: String(isAbsolute24(file_path))
366234
- },
366235
- errorCode: 6
366236
- };
366237
- }
366238
- if (readTimestamp) {
366239
- const lastWriteTime = getFileModificationTime(fullFilePath);
366240
- if (lastWriteTime > readTimestamp.timestamp || !fileStateMatchesContent(fileContent, readTimestamp)) {
366241
- return {
366242
- result: false,
366243
- behavior: "ask",
366244
- message: "File has been modified since read, either by the user or by a linter. Read it again before attempting to write it.",
366245
- errorCode: 7
366246
- };
366247
- }
366248
- }
366249
366460
  const file2 = fileContent;
366250
- const actualOldString = findActualString(file2, old_string);
366461
+ const editTarget = findEditTarget(file2, old_string);
366462
+ const actualOldString = editTarget?.actual ?? null;
366251
366463
  if (!actualOldString) {
366252
366464
  return {
366253
366465
  result: false,
366254
366466
  behavior: "ask",
366255
- message: `String to replace not found in file.
366256
- String: ${old_string}`,
366467
+ message: readTimestamp === undefined ? `${describeEditMatchFailure(file2, old_string)} This file has not been read in this session \u2014 read it and copy the target text from the result.` : describeEditMatchFailure(file2, old_string),
366257
366468
  meta: {
366258
366469
  isFilePathAbsolute: String(isAbsolute24(file_path))
366259
366470
  },
366260
366471
  errorCode: 8
366261
366472
  };
366262
366473
  }
366474
+ if (readTimestamp === undefined || readTimestamp.isPartialView || !fileStateMatchesContent(file2, readTimestamp)) {
366475
+ toolUseContext.readFileState.set(fullFilePath, {
366476
+ content: file2,
366477
+ timestamp: getFileModificationTime(fullFilePath),
366478
+ offset: undefined,
366479
+ limit: undefined
366480
+ });
366481
+ }
366263
366482
  const matches = file2.split(actualOldString).length - 1;
366264
366483
  if (matches > 1 && !replace_all) {
366265
366484
  return {
@@ -366275,7 +366494,8 @@ String: ${old_string}`,
366275
366494
  };
366276
366495
  }
366277
366496
  const settingsValidationResult = validateInputForSettingsFileEdit(fullFilePath, file2, () => {
366278
- return replace_all ? file2.replaceAll(actualOldString, new_string) : file2.replace(actualOldString, new_string);
366497
+ const simulatedNewString = shiftIndentation(new_string, editTarget?.indentShift ?? 0);
366498
+ return replace_all ? file2.replaceAll(actualOldString, simulatedNewString) : file2.replace(actualOldString, simulatedNewString);
366279
366499
  });
366280
366500
  if (settingsValidationResult !== null) {
366281
366501
  return settingsValidationResult;
@@ -366338,12 +366558,13 @@ String: ${old_string}`,
366338
366558
  if (fileExists) {
366339
366559
  const lastWriteTime = getFileModificationTime(absoluteFilePath);
366340
366560
  const lastRead = readFileState.get(absoluteFilePath);
366341
- if (!lastRead || lastWriteTime > lastRead.timestamp || !fileStateMatchesContent(originalFileContents, lastRead)) {
366561
+ if (lastRead && (lastWriteTime > lastRead.timestamp || !fileStateMatchesContent(originalFileContents, lastRead))) {
366342
366562
  throw new Error(FILE_UNEXPECTEDLY_MODIFIED_ERROR);
366343
366563
  }
366344
366564
  }
366345
- let actualOldString = findActualString(originalFileContents, old_string) || old_string;
366346
- let actualNewString = preserveQuoteStyle(old_string, actualOldString, new_string);
366565
+ const target = findEditTarget(originalFileContents, old_string);
366566
+ let actualOldString = target?.actual ?? old_string;
366567
+ let actualNewString = shiftIndentation(preserveQuoteStyle(old_string, actualOldString, new_string), target?.indentShift ?? 0);
366347
366568
  const toolUseID = toolUseContext.toolUseId ?? parentMessage?.uuid ?? "";
366348
366569
  const beforeEdit = await executeBeforeEditHooks(absoluteFilePath, actualOldString, actualNewString, replace_all, toolUseContext, toolUseID, toolUseContext.abortController.signal);
366349
366570
  if (beforeEdit.updatedInput) {
@@ -367052,14 +367273,16 @@ var init_FileWriteTool = __esm(() => {
367052
367273
  throw e;
367053
367274
  }
367054
367275
  const readTimestamp = toolUseContext.readFileState.get(fullFilePath);
367276
+ const lastWriteTime = Math.floor(fileMtimeMs);
367055
367277
  if (!readTimestamp || readTimestamp.isPartialView) {
367056
- return {
367057
- result: false,
367058
- message: "File has not been read yet. Read it first before writing to it.",
367059
- errorCode: 2
367060
- };
367278
+ toolUseContext.readFileState.set(fullFilePath, {
367279
+ content: readFileSyncCached(fullFilePath),
367280
+ timestamp: lastWriteTime,
367281
+ offset: undefined,
367282
+ limit: undefined
367283
+ });
367284
+ return { result: true };
367061
367285
  }
367062
- const lastWriteTime = Math.floor(fileMtimeMs);
367063
367286
  if (lastWriteTime > readTimestamp.timestamp) {
367064
367287
  return {
367065
367288
  result: false,
@@ -383820,6 +384043,11 @@ var init_AgentTool = __esm(() => {
383820
384043
  let finalMessage = extractTextContent(agentResult2.content, `
383821
384044
  `);
383822
384045
  if (false) {}
384046
+ if (agentMessages.some((_) => _.type === "attachment" && _.attachment?.type === "max_turns_reached")) {
384047
+ finalMessage = `Note: this agent stopped after reaching its maximum number of turns, so the result below is incomplete.
384048
+
384049
+ ${finalMessage}`;
384050
+ }
383823
384051
  const worktreeResult2 = await cleanupWorktreeIfNeeded();
383824
384052
  enqueueAgentNotification({
383825
384053
  taskId: backgroundedTaskId,
@@ -384020,10 +384248,12 @@ var init_AgentTool = __esm(() => {
384020
384248
  }
384021
384249
  const agentResult = finalizeAgentTool(agentMessages, syncAgentId, metadata);
384022
384250
  if (false) {}
384251
+ const truncatedByMaxTurns = agentMessages.some((_) => _.type === "attachment" && _.attachment?.type === "max_turns_reached");
384252
+ const incompleteReason = syncAgentError ? errorMessage2(syncAgentError) : truncatedByMaxTurns ? "Agent stopped after reaching its maximum number of turns; the result is incomplete." : undefined;
384023
384253
  return {
384024
384254
  data: {
384025
- status: syncAgentError ? "partial" : "completed",
384026
- ...syncAgentError && { error: errorMessage2(syncAgentError) },
384255
+ status: incompleteReason ? "partial" : "completed",
384256
+ ...incompleteReason && { error: incompleteReason },
384027
384257
  prompt,
384028
384258
  ...agentResult,
384029
384259
  ...worktreeResult
@@ -389358,7 +389588,7 @@ function isAnyTracingEnabled() {
389358
389588
  return isTelemetryEnabled() || isEnhancedTelemetryEnabled() || isBetaTracingEnabled();
389359
389589
  }
389360
389590
  function getTracer() {
389361
- return import_api39.trace.getTracer("ur-agent.gen_ai", "1.76.7");
389591
+ return import_api39.trace.getTracer("ur-agent.gen_ai", "1.77.1");
389362
389592
  }
389363
389593
  function createSpanAttributes(spanType, customAttributes = {}) {
389364
389594
  const baseAttributes = getTelemetryAttributes();
@@ -392486,9 +392716,7 @@ class StreamingToolExecutor {
392486
392716
  return false;
392487
392717
  if (!executingTools.every((t) => t.isConcurrencySafe))
392488
392718
  return false;
392489
- const envCap = Number(process.env.UR_MAX_CONCURRENT_TOOLS);
392490
- const cap = Number.isFinite(envCap) && envCap >= 1 ? Math.min(Math.floor(envCap), 32) : MAX_CONCURRENT_TOOLS;
392491
- return executingTools.length < cap;
392719
+ return executingTools.length < getMaxToolUseConcurrency();
392492
392720
  }
392493
392721
  async processQueue() {
392494
392722
  if (this.discarded) {
@@ -392733,12 +392961,12 @@ function markToolUseAsComplete2(toolUseContext, toolUseID) {
392733
392961
  return next;
392734
392962
  });
392735
392963
  }
392736
- var MAX_CONCURRENT_TOOLS = 8;
392737
392964
  var init_StreamingToolExecutor = __esm(() => {
392738
392965
  init_messages();
392739
392966
  init_Tool();
392740
392967
  init_abortController();
392741
392968
  init_toolExecution();
392969
+ init_toolOrchestration();
392742
392970
  });
392743
392971
 
392744
392972
  // src/utils/queryProfiler.ts
@@ -419527,7 +419755,7 @@ function Feedback({
419527
419755
  platform: env2.platform,
419528
419756
  gitRepo: envInfo.isGit,
419529
419757
  terminal: env2.terminal,
419530
- version: "1.76.7",
419758
+ version: "1.77.1",
419531
419759
  transcript: normalizeMessagesForAPI(messages),
419532
419760
  errors: sanitizedErrors,
419533
419761
  lastApiRequest: getLastAPIRequest(),
@@ -419719,7 +419947,7 @@ function Feedback({
419719
419947
  ", ",
419720
419948
  env2.terminal,
419721
419949
  ", v",
419722
- "1.76.7"
419950
+ "1.77.1"
419723
419951
  ]
419724
419952
  }, undefined, true, undefined, this)
419725
419953
  ]
@@ -419825,7 +420053,7 @@ ${sanitizedDescription}
419825
420053
  ` + `**Environment Info**
419826
420054
  ` + `- Platform: ${env2.platform}
419827
420055
  ` + `- Terminal: ${env2.terminal}
419828
- ` + `- Version: ${"1.76.7"}
420056
+ ` + `- Version: ${"1.77.1"}
419829
420057
  ` + `- Feedback ID: ${feedbackId}
419830
420058
  ` + `
419831
420059
  **Errors**
@@ -422935,7 +423163,7 @@ function buildPrimarySection() {
422935
423163
  }, undefined, false, undefined, this);
422936
423164
  return [{
422937
423165
  label: "Version",
422938
- value: "1.76.7"
423166
+ value: "1.77.1"
422939
423167
  }, {
422940
423168
  label: "Session name",
422941
423169
  value: nameValue
@@ -426317,7 +426545,7 @@ function Config({
426317
426545
  }
426318
426546
  }, undefined, false, undefined, this)
426319
426547
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime179.jsxDEV(ChannelDowngradeDialog, {
426320
- currentVersion: "1.76.7",
426548
+ currentVersion: "1.77.1",
426321
426549
  onChoice: (choice) => {
426322
426550
  setShowSubmenu(null);
426323
426551
  setTabsHidden(false);
@@ -426329,7 +426557,7 @@ function Config({
426329
426557
  autoUpdatesChannel: "stable"
426330
426558
  };
426331
426559
  if (choice === "stay") {
426332
- newSettings.minimumVersion = "1.76.7";
426560
+ newSettings.minimumVersion = "1.77.1";
426333
426561
  }
426334
426562
  updateSettingsForSource("userSettings", newSettings);
426335
426563
  setSettingsData((prev_27) => ({
@@ -434393,7 +434621,7 @@ function HelpV2(t0) {
434393
434621
  let t6;
434394
434622
  if ($2[31] !== tabs) {
434395
434623
  t6 = /* @__PURE__ */ jsx_dev_runtime206.jsxDEV(Tabs, {
434396
- title: `UR v${"1.76.7"}`,
434624
+ title: `UR v${"1.77.1"}`,
434397
434625
  color: "professionalBlue",
434398
434626
  defaultTab: "general",
434399
434627
  children: tabs
@@ -435326,7 +435554,7 @@ function buildToolUseContext(tools, readFileStateCache, toolPermissionContext, a
435326
435554
  async function handleInitialize(options2) {
435327
435555
  return {
435328
435556
  name: "UR",
435329
- version: "1.76.7",
435557
+ version: "1.77.1",
435330
435558
  protocolVersion: "0.1.0",
435331
435559
  workspaceRoot: options2.cwd,
435332
435560
  capabilities: {
@@ -452434,7 +452662,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
452434
452662
  return [];
452435
452663
  }
452436
452664
  }
452437
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.76.7") {
452665
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.77.1") {
452438
452666
  if (process.env.USER_TYPE === "ant") {
452439
452667
  const changelog = "";
452440
452668
  if (changelog) {
@@ -452461,7 +452689,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.76.7")
452461
452689
  releaseNotes
452462
452690
  };
452463
452691
  }
452464
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.76.7") {
452692
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.77.1") {
452465
452693
  if (process.env.USER_TYPE === "ant") {
452466
452694
  const changelog = "";
452467
452695
  if (changelog) {
@@ -455327,7 +455555,7 @@ function getRecentActivitySync() {
455327
455555
  return cachedActivity;
455328
455556
  }
455329
455557
  function getLogoDisplayData() {
455330
- const version2 = process.env.DEMO_VERSION ?? "1.76.7";
455558
+ const version2 = process.env.DEMO_VERSION ?? "1.77.1";
455331
455559
  const serverUrl = getDirectConnectServerUrl();
455332
455560
  const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd());
455333
455561
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -456194,7 +456422,7 @@ function LogoV2() {
456194
456422
  if ($2[2] === Symbol.for("react.memo_cache_sentinel")) {
456195
456423
  t2 = () => {
456196
456424
  const currentConfig2 = getGlobalConfig();
456197
- if (currentConfig2.lastReleaseNotesSeen === "1.76.7") {
456425
+ if (currentConfig2.lastReleaseNotesSeen === "1.77.1") {
456198
456426
  return;
456199
456427
  }
456200
456428
  saveGlobalConfig(_temp325);
@@ -456879,12 +457107,12 @@ function LogoV2() {
456879
457107
  return t41;
456880
457108
  }
456881
457109
  function _temp325(current) {
456882
- if (current.lastReleaseNotesSeen === "1.76.7") {
457110
+ if (current.lastReleaseNotesSeen === "1.77.1") {
456883
457111
  return current;
456884
457112
  }
456885
457113
  return {
456886
457114
  ...current,
456887
- lastReleaseNotesSeen: "1.76.7"
457115
+ lastReleaseNotesSeen: "1.77.1"
456888
457116
  };
456889
457117
  }
456890
457118
  function _temp241(s_0) {
@@ -473698,7 +473926,7 @@ function compileAgenticCiWorkflow(specName = "default", options2 = {}) {
473698
473926
  if (spec.name !== specName) {
473699
473927
  throw new Error("Agentic CI workflow spec name does not match");
473700
473928
  }
473701
- const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.76.7" : "1.76.7");
473929
+ const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.77.1" : "1.77.1");
473702
473930
  if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(packageVersion)) {
473703
473931
  throw new Error("invalid ur-agent package version");
473704
473932
  }
@@ -474691,7 +474919,7 @@ runner; \`ur trigger\` is the inbound parser that decides what to run.
474691
474919
  path: ".github/workflows/ur.yml",
474692
474920
  root: "project",
474693
474921
  content: compileAgenticCiWorkflow("default", {
474694
- packageVersion: typeof MACRO !== "undefined" ? "1.76.7" : "1.76.7"
474922
+ packageVersion: typeof MACRO !== "undefined" ? "1.77.1" : "1.77.1"
474695
474923
  })
474696
474924
  },
474697
474925
  {
@@ -474754,7 +474982,7 @@ function value(tokens, flag) {
474754
474982
  return index2 >= 0 ? tokens[index2 + 1] : undefined;
474755
474983
  }
474756
474984
  function cliVersion() {
474757
- return typeof MACRO !== "undefined" ? "1.76.7" : "1.76.7";
474985
+ return typeof MACRO !== "undefined" ? "1.77.1" : "1.77.1";
474758
474986
  }
474759
474987
  function workflowPath(cwd2) {
474760
474988
  return join159(cwd2, ".github", "workflows", "ur-agentic-ci.yml");
@@ -480610,7 +480838,7 @@ function createAcpStdioApp(deps) {
480610
480838
  }
480611
480839
  },
480612
480840
  authMethods: [],
480613
- agentInfo: { name: "UR-Nexus", version: "1.76.7" }
480841
+ agentInfo: { name: "UR-Nexus", version: "1.77.1" }
480614
480842
  })).onRequest("authenticate", () => ({})).onRequest("session/new", async (context6) => {
480615
480843
  const result = runtime2.newSession(context6.params.cwd, context6.params.mcpServers, context6.params.additionalDirectories);
480616
480844
  await runtime2.announce({
@@ -480707,7 +480935,7 @@ function createAcpStdioAgent(deps) {
480707
480935
  }
480708
480936
  },
480709
480937
  authMethods: [],
480710
- agentInfo: { name: "UR-Nexus", version: "1.76.7" }
480938
+ agentInfo: { name: "UR-Nexus", version: "1.77.1" }
480711
480939
  });
480712
480940
  return;
480713
480941
  case "authenticate":
@@ -492667,6 +492895,11 @@ async function runCrew(name, options2) {
492667
492895
  options2.onEvent?.({ kind: "worker-exit", worker: workerId, handled: count5 });
492668
492896
  return count5;
492669
492897
  }
492898
+ const workerFailures = [];
492899
+ const track = (promise3) => promise3.catch((error40) => {
492900
+ workerFailures.push(error40);
492901
+ return 0;
492902
+ });
492670
492903
  let spawned = 0;
492671
492904
  if (options2.dynamic) {
492672
492905
  const governor = boundedInteger2(options2.maxWorkers, 8, 1, 32);
@@ -492683,13 +492916,13 @@ async function runCrew(name, options2) {
492683
492916
  while (active3.size < governor && runnableCount() > 0) {
492684
492917
  spawned += 1;
492685
492918
  const id = `w${spawned}`;
492686
- const p2 = worker(id).finally(() => active3.delete(p2));
492919
+ const p2 = track(worker(id)).finally(() => active3.delete(p2));
492687
492920
  active3.add(p2);
492688
492921
  }
492689
492922
  if (active3.size === 0) {
492690
492923
  if (todoCount() > 0) {
492691
492924
  spawned += 1;
492692
- await worker(`w${spawned}`);
492925
+ await track(worker(`w${spawned}`));
492693
492926
  continue;
492694
492927
  }
492695
492928
  break;
@@ -492702,7 +492935,10 @@ async function runCrew(name, options2) {
492702
492935
  } else {
492703
492936
  spawned = workerCount;
492704
492937
  const workerIds = Array.from({ length: workerCount }, (_, i3) => `w${i3 + 1}`);
492705
- await Promise.all(workerIds.map(worker));
492938
+ await Promise.all(workerIds.map((id) => track(worker(id))));
492939
+ }
492940
+ if (workerFailures.length > 0) {
492941
+ throw workerFailures[0];
492706
492942
  }
492707
492943
  const finalSpec = loadCrew(cwd2, name) ?? baseSpec;
492708
492944
  return { name, workers: spawned, progress: crewProgress(finalSpec), handled };
@@ -690159,7 +690395,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
690159
690395
  smapsRollup,
690160
690396
  platform: process.platform,
690161
690397
  nodeVersion: process.version,
690162
- ccVersion: "1.76.7"
690398
+ ccVersion: "1.77.1"
690163
690399
  };
690164
690400
  }
690165
690401
  async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
@@ -690739,7 +690975,7 @@ var init_bridge_kick = __esm(() => {
690739
690975
  var call154 = async () => {
690740
690976
  return {
690741
690977
  type: "text",
690742
- value: "1.76.7"
690978
+ value: "1.77.1"
690743
690979
  };
690744
690980
  }, version2, version_default;
690745
690981
  var init_version = __esm(() => {
@@ -702006,7 +702242,7 @@ function generateHtmlReport(data, insights) {
702006
702242
  </html>`;
702007
702243
  }
702008
702244
  function buildExportData(data, insights, facets, remoteStats) {
702009
- const version3 = typeof MACRO !== "undefined" ? "1.76.7" : "unknown";
702245
+ const version3 = typeof MACRO !== "undefined" ? "1.77.1" : "unknown";
702010
702246
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
702011
702247
  const facets_summary = {
702012
702248
  total: facets.size,
@@ -706320,7 +706556,7 @@ var init_sessionStorage = __esm(() => {
706320
706556
  init_settings2();
706321
706557
  init_slowOperations();
706322
706558
  init_uuid();
706323
- VERSION7 = typeof MACRO !== "undefined" ? "1.76.7" : "unknown";
706559
+ VERSION7 = typeof MACRO !== "undefined" ? "1.77.1" : "unknown";
706324
706560
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
706325
706561
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
706326
706562
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -707535,7 +707771,7 @@ var init_filesystem = __esm(() => {
707535
707771
  });
707536
707772
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
707537
707773
  const nonce = randomBytes20(16).toString("hex");
707538
- return join232(getURTempDir(), "bundled-skills", "1.76.7", nonce);
707774
+ return join232(getURTempDir(), "bundled-skills", "1.77.1", nonce);
707539
707775
  });
707540
707776
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
707541
707777
  });
@@ -713174,6 +713410,12 @@ Focus text output on:
713174
713410
  - High-level status updates at natural milestones
713175
713411
  - Errors or blockers that change the plan
713176
713412
 
713413
+ Finishing a task is not an invitation to write at length. The work is in the files and the tool calls; the final message only says what changed and anything the user must act on. Specifically:
713414
+ - Never paste code, file contents, or diffs you already wrote to disk. Cite \`file_path:line\` instead. The user can open the file.
713415
+ - Report an audit, review, or investigation as its findings \u2014 one line each, and only the ones that matter. Do not narrate how you searched or restate what you read.
713416
+ - Do not re-explain a change you already described, list every file touched, or add a closing recap of the conversation.
713417
+ - Write a long explanation only when the user asks for one.
713418
+
713177
713419
  If you can say it in one sentence, don't use three. Prefer short, direct sentences over long explanations. This does not apply to code or tool calls.`;
713178
713420
  }
713179
713421
  function getSimpleToneAndStyleSection() {
@@ -713396,7 +713638,7 @@ function getFunctionResultClearingSection(model) {
713396
713638
 
713397
713639
  Old tool results will be automatically cleared from context to free up space. The ${config3.keepRecent} most recent results are always kept.`;
713398
713640
  }
713399
- var getCachedMCConfigForFRC = null, DISCOVER_SKILLS_TOOL_NAME = null, SYSTEM_PROMPT_DYNAMIC_BOUNDARY = "__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__", DEFAULT_AGENT_PROMPT = `You are an agent for Ur. Given the user's message, you should use the tools available to complete the task. Complete the task fully\u2014don't gold-plate, but don't leave it half-done. When you complete the task, respond with a concise report covering what was done and any key findings \u2014 the caller will relay this to the user, so it only needs the essentials.`, SUMMARIZE_TOOL_RESULTS_SECTION = `When working with tool results, write down any important information you might need later in your response, as the original tool result may be cleared later.`;
713641
+ var getCachedMCConfigForFRC = null, DISCOVER_SKILLS_TOOL_NAME = null, SYSTEM_PROMPT_DYNAMIC_BOUNDARY = "__SYSTEM_PROMPT_DYNAMIC_BOUNDARY__", DEFAULT_AGENT_PROMPT = `You are an agent for Ur. Given the user's message, you should use the tools available to complete the task. Complete the task fully\u2014don't gold-plate, but don't leave it half-done. When you complete the task, respond with a concise report covering what was done and any key findings \u2014 the caller will relay this to the user, so it only needs the essentials. Do not include code or file contents you already wrote; cite \`file_path:line\`.`, SUMMARIZE_TOOL_RESULTS_SECTION = `When working with tool results, write down any important information you might need later in your response, as the original tool result may be cleared later.`;
713400
713642
  var init_prompts4 = __esm(() => {
713401
713643
  init_env();
713402
713644
  init_git();
@@ -713884,7 +714126,7 @@ function computeFingerprint(messageText2, version3) {
713884
714126
  }
713885
714127
  function computeFingerprintFromMessages(messages) {
713886
714128
  const firstMessageText = extractFirstMessageText(messages);
713887
- return computeFingerprint(firstMessageText, "1.76.7");
714129
+ return computeFingerprint(firstMessageText, "1.77.1");
713888
714130
  }
713889
714131
  var FINGERPRINT_SALT = "59cf53e54c78";
713890
714132
  var init_fingerprint = () => {};
@@ -714831,7 +715073,7 @@ ${deferredToolList}
714831
715073
  stopReason = null;
714832
715074
  isAdvisorInProgress = false;
714833
715075
  const streamWatchdogEnabled = isStreamWatchdogEnabled();
714834
- const STREAM_IDLE_TIMEOUT_MS = parseInt(process.env.UR_STREAM_IDLE_TIMEOUT_MS || "", 10) || 90000;
715076
+ const STREAM_IDLE_TIMEOUT_MS = parseInt(process.env.UR_STREAM_IDLE_TIMEOUT_MS || "", 10) || 300000;
714835
715077
  const STREAM_IDLE_WARNING_MS = STREAM_IDLE_TIMEOUT_MS / 2;
714836
715078
  let streamIdleAborted = false;
714837
715079
  let streamWatchdogFiredAt = null;
@@ -714849,6 +715091,9 @@ ${deferredToolList}
714849
715091
  for await (const _part of stream5) {
714850
715092
  const part = _part;
714851
715093
  resetStreamIdleTimer();
715094
+ if (part?.type === "ping") {
715095
+ continue;
715096
+ }
714852
715097
  const outputChunkAt = performance.now();
714853
715098
  if (previousOutputChunkAt !== undefined) {
714854
715099
  recordGenAiOutputChunkMetric({
@@ -715803,7 +716048,7 @@ async function sideQuery(opts) {
715803
716048
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
715804
716049
  }
715805
716050
  const messageText2 = extractFirstUserMessageText(messages);
715806
- const fingerprint2 = computeFingerprint(messageText2, "1.76.7");
716051
+ const fingerprint2 = computeFingerprint(messageText2, "1.77.1");
715807
716052
  const attributionHeader = getAttributionHeader(fingerprint2);
715808
716053
  const systemBlocks = [
715809
716054
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -720640,7 +720885,7 @@ function buildSystemInitMessage(inputs) {
720640
720885
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
720641
720886
  apiKeySource: getURHQApiKeyWithSource().source,
720642
720887
  betas: getSdkBetas(),
720643
- ur_version: "1.76.7",
720888
+ ur_version: "1.77.1",
720644
720889
  output_style: outputStyle2,
720645
720890
  agents: inputs.agents.map((agent2) => agent2.agentType),
720646
720891
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
@@ -734512,7 +734757,7 @@ var init_useVoiceEnabled = __esm(() => {
734512
734757
  function getSemverPart(version3) {
734513
734758
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
734514
734759
  }
734515
- function useUpdateNotification(updatedVersion, initialVersion = "1.76.7") {
734760
+ function useUpdateNotification(updatedVersion, initialVersion = "1.77.1") {
734516
734761
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react223.useState(() => getSemverPart(initialVersion));
734517
734762
  if (!updatedVersion) {
734518
734763
  return null;
@@ -734561,7 +734806,7 @@ function AutoUpdater({
734561
734806
  return;
734562
734807
  }
734563
734808
  if (false) {}
734564
- const currentVersion = "1.76.7";
734809
+ const currentVersion = "1.77.1";
734565
734810
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
734566
734811
  let latestVersion = await getLatestVersion(channel);
734567
734812
  const isDisabled = isAutoUpdaterDisabled();
@@ -734790,12 +735035,12 @@ function NativeAutoUpdater({
734790
735035
  logEvent("tengu_native_auto_updater_start", {});
734791
735036
  try {
734792
735037
  const maxVersion = await getMaxVersion();
734793
- if (maxVersion && gt("1.76.7", maxVersion)) {
735038
+ if (maxVersion && gt("1.77.1", maxVersion)) {
734794
735039
  const msg = await getMaxVersionMessage();
734795
735040
  setMaxVersionIssue(msg ?? "affects your version");
734796
735041
  }
734797
735042
  const result = await installLatest(channel);
734798
- const currentVersion = "1.76.7";
735043
+ const currentVersion = "1.77.1";
734799
735044
  const latencyMs = Date.now() - startTime;
734800
735045
  if (result.lockFailed) {
734801
735046
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -734932,17 +735177,17 @@ function PackageManagerAutoUpdater(t0) {
734932
735177
  const maxVersion = await getMaxVersion();
734933
735178
  if (maxVersion && latest && gt(latest, maxVersion)) {
734934
735179
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
734935
- if (gte("1.76.7", maxVersion)) {
734936
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.76.7"} is already at or above maxVersion ${maxVersion}, skipping update`);
735180
+ if (gte("1.77.1", maxVersion)) {
735181
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.77.1"} is already at or above maxVersion ${maxVersion}, skipping update`);
734937
735182
  setUpdateAvailable(false);
734938
735183
  return;
734939
735184
  }
734940
735185
  latest = maxVersion;
734941
735186
  }
734942
- const hasUpdate = latest && !gte("1.76.7", latest) && !shouldSkipVersion(latest);
735187
+ const hasUpdate = latest && !gte("1.77.1", latest) && !shouldSkipVersion(latest);
734943
735188
  setUpdateAvailable(!!hasUpdate);
734944
735189
  if (hasUpdate) {
734945
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.76.7"} -> ${latest}`);
735190
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.77.1"} -> ${latest}`);
734946
735191
  }
734947
735192
  };
734948
735193
  $2[0] = t1;
@@ -734976,7 +735221,7 @@ function PackageManagerAutoUpdater(t0) {
734976
735221
  wrap: "truncate",
734977
735222
  children: [
734978
735223
  "currentVersion: ",
734979
- "1.76.7"
735224
+ "1.77.1"
734980
735225
  ]
734981
735226
  }, undefined, true, undefined, this);
734982
735227
  $2[3] = verbose;
@@ -745776,7 +746021,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
745776
746021
  project_dir: getOriginalCwd(),
745777
746022
  added_dirs: addedDirs
745778
746023
  },
745779
- version: "1.76.7",
746024
+ version: "1.77.1",
745780
746025
  output_style: {
745781
746026
  name: outputStyleName
745782
746027
  },
@@ -745911,7 +746156,7 @@ function StatusLineInner({
745911
746156
  const attention = customStatusError ?? taskAttention;
745912
746157
  const terminalSize = React132.useContext(TerminalSizeContext);
745913
746158
  const defaultStatusLineText = buildDefaultStatusBar({
745914
- version: "1.76.7",
746159
+ version: "1.77.1",
745915
746160
  providerLabel: providerRuntime.providerLabel,
745916
746161
  authMode: providerRuntime.authLabel,
745917
746162
  model: renderModelName(mainLoopModel) || providerRuntime.model || "",
@@ -758196,7 +758441,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
758196
758441
  } catch {}
758197
758442
  const data = {
758198
758443
  trigger: trigger2,
758199
- version: "1.76.7",
758444
+ version: "1.77.1",
758200
758445
  platform: process.platform,
758201
758446
  transcript,
758202
758447
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -770570,7 +770815,7 @@ function WelcomeV2() {
770570
770815
  dimColor: true,
770571
770816
  children: [
770572
770817
  "v",
770573
- "1.76.7"
770818
+ "1.77.1"
770574
770819
  ]
770575
770820
  }, undefined, true, undefined, this)
770576
770821
  ]
@@ -771830,7 +772075,7 @@ function completeOnboarding() {
771830
772075
  saveGlobalConfig((current) => ({
771831
772076
  ...current,
771832
772077
  hasCompletedOnboarding: true,
771833
- lastOnboardingVersion: "1.76.7"
772078
+ lastOnboardingVersion: "1.77.1"
771834
772079
  }));
771835
772080
  }
771836
772081
  function showDialog(root2, renderer) {
@@ -776874,7 +777119,7 @@ function appendToLog(path24, message) {
776874
777119
  cwd: getFsImplementation().cwd(),
776875
777120
  userType: process.env.USER_TYPE,
776876
777121
  sessionId: getSessionId(),
776877
- version: "1.76.7"
777122
+ version: "1.77.1"
776878
777123
  };
776879
777124
  getLogWriter(path24).write(messageWithTimestamp);
776880
777125
  }
@@ -781033,8 +781278,8 @@ async function getEnvLessBridgeConfig() {
781033
781278
  }
781034
781279
  async function checkEnvLessBridgeMinVersion() {
781035
781280
  const cfg = await getEnvLessBridgeConfig();
781036
- if (cfg.min_version && lt("1.76.7", cfg.min_version)) {
781037
- return `Your version of UR (${"1.76.7"}) is too old for Remote Control.
781281
+ if (cfg.min_version && lt("1.77.1", cfg.min_version)) {
781282
+ return `Your version of UR (${"1.77.1"}) is too old for Remote Control.
781038
781283
  Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
781039
781284
  }
781040
781285
  return null;
@@ -781508,7 +781753,7 @@ async function initBridgeCore(params) {
781508
781753
  const rawApi = createBridgeApiClient({
781509
781754
  baseUrl,
781510
781755
  getAccessToken,
781511
- runnerVersion: "1.76.7",
781756
+ runnerVersion: "1.77.1",
781512
781757
  onDebug: logForDebugging,
781513
781758
  onAuth401,
781514
781759
  getTrustedDeviceToken
@@ -790981,7 +791226,7 @@ function getAgUiCapabilities() {
790981
791226
  name: "UR-Nexus",
790982
791227
  type: "ur-nexus",
790983
791228
  description: "Provider-flexible, local-first autonomous engineering workflow agent.",
790984
- version: "1.76.7",
791229
+ version: "1.77.1",
790985
791230
  provider: "UR",
790986
791231
  documentationUrl: "https://github.com/Maitham16/UR/blob/master/docs/AG_UI.md"
790987
791232
  },
@@ -792121,7 +792366,7 @@ function createMCPServer(cwd4, debug2, verbose) {
792121
792366
  };
792122
792367
  const server2 = new Server({
792123
792368
  name: "ur-nexus",
792124
- version: "1.76.7"
792369
+ version: "1.77.1"
792125
792370
  }, {
792126
792371
  capabilities: {
792127
792372
  tools: {}
@@ -793279,7 +793524,7 @@ function thrownResponse(error40) {
793279
793524
  }
793280
793525
  async function createUrMcp2026Runtime(options4) {
793281
793526
  const server2 = createMCPServer(options4.cwd, options4.debug === true, options4.verbose === true);
793282
- const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.76.7" }, { capabilities: {} });
793527
+ const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.77.1" }, { capabilities: {} });
793283
793528
  const [clientTransport, serverTransport] = createLinkedTransportPair();
793284
793529
  try {
793285
793530
  await server2.connect(serverTransport);
@@ -793290,7 +793535,7 @@ async function createUrMcp2026Runtime(options4) {
793290
793535
  }
793291
793536
  const runtime2 = new Mcp2026Runtime({
793292
793537
  cwd: options4.cwd,
793293
- version: "1.76.7",
793538
+ version: "1.77.1",
793294
793539
  backend: {
793295
793540
  listTools: async () => {
793296
793541
  const listed = await client2.listTools();
@@ -795431,7 +795676,7 @@ async function update() {
795431
795676
  logEvent("tengu_update_check", {});
795432
795677
  const diagnostic2 = await getDoctorDiagnostic();
795433
795678
  const result = await checkUpgradeStatus({
795434
- currentVersion: "1.76.7",
795679
+ currentVersion: "1.77.1",
795435
795680
  packageName: UR_AGENT_PACKAGE_NAME,
795436
795681
  installationType: diagnostic2.installationType,
795437
795682
  latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
@@ -796747,7 +796992,7 @@ ${customInstructions}` : customInstructions;
796747
796992
  }
796748
796993
  }
796749
796994
  logForDiagnosticsNoPII("info", "started", {
796750
- version: "1.76.7",
796995
+ version: "1.77.1",
796751
796996
  is_native_binary: isInBundledMode()
796752
796997
  });
796753
796998
  registerCleanup(async () => {
@@ -797533,7 +797778,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
797533
797778
  pendingHookMessages
797534
797779
  }, renderAndRun);
797535
797780
  }
797536
- }).version("1.76.7 (UR-Nexus)", "-v, --version", "Output the version number");
797781
+ }).version("1.77.1 (UR-Nexus)", "-v, --version", "Output the version number");
797537
797782
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
797538
797783
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
797539
797784
  if (canUserConfigureAdvisor()) {
@@ -798585,7 +798830,7 @@ if (false) {}
798585
798830
  async function main2() {
798586
798831
  const args = process.argv.slice(2);
798587
798832
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
798588
- console.log(`${"1.76.7"} (UR-Nexus)`);
798833
+ console.log(`${"1.77.1"} (UR-Nexus)`);
798589
798834
  return;
798590
798835
  }
798591
798836
  if (args[0] === "a2a" && args[1] === "serve" && !args.includes("--help") && !args.includes("-h")) {