ur-agent 1.55.0 → 1.56.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,33 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.56.0
4
+
5
+ - Added a subagent fan-out governor. Agents could spawn agents with no depth or
6
+ concurrency bound, and `/crew`, `/arena`, `/bg fanout` and `/pattern` all
7
+ spawn several at once, so a single prompt could expand into an unbounded tree
8
+ until the machine wedged. Spawning is now refused past a nesting depth of 3
9
+ or 20 concurrent agents, checked before any work starts so a refusal is free.
10
+ The slot is released in the existing `finally`, so an aborted or crashed
11
+ agent cannot strand the budget.
12
+ - Limits are configurable through `agents.maxDepth` and `agents.maxConcurrent`,
13
+ clamped to hard ceilings of 10 and 100. A settings file cannot disable the
14
+ governor, and out-of-range or non-numeric values clamp rather than switching
15
+ it off. Refusal messages name the limit that fired and the setting that
16
+ raises it.
17
+ - Added `src/security/promptInjection.ts`: detection of injection phrasing
18
+ (instruction override, role reassignment, exfiltration, tool coercion, forged
19
+ system turns, secrecy demands, boundary forgery), removal of zero-width and
20
+ bidirectional characters used to hide payloads from human review, a
21
+ nonce-bound content boundary that untrusted text cannot close because it
22
+ cannot predict the nonce, and canary tokens that prove whether a boundary was
23
+ crossed. Framed as detection and privilege separation rather than filtering,
24
+ because no reliable injection classifier exists.
25
+ - Added `denyByDefault` to the Seatbelt profile builder. Without a read
26
+ allowlist the profile previously fell back to `(allow default)` plus targeted
27
+ denials — a blocklist rather than a sandbox, and the shape behind the 2026
28
+ Seatbelt escape write-ups. Opt-in for back-compatibility, since it can break
29
+ agents that read outside the standard runtime roots.
30
+
3
31
  ## 1.55.0
4
32
 
5
33
  - Narrowed `APIProvider` to the two values `getAPIProvider()` can actually
package/dist/cli.js CHANGED
@@ -75097,7 +75097,7 @@ var init_auth = __esm(() => {
75097
75097
 
75098
75098
  // src/utils/userAgent.ts
75099
75099
  function getURCodeUserAgent() {
75100
- return `ur/${"1.55.0"}`;
75100
+ return `ur/${"1.56.0"}`;
75101
75101
  }
75102
75102
 
75103
75103
  // src/utils/workloadContext.ts
@@ -75119,7 +75119,7 @@ function getUserAgent() {
75119
75119
  const clientApp = process.env.UR_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}` : "";
75120
75120
  const workload = getWorkload();
75121
75121
  const workloadSuffix = workload ? `, workload/${workload}` : "";
75122
- return `ur-cli/${"1.55.0"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
75122
+ return `ur-cli/${"1.56.0"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
75123
75123
  }
75124
75124
  function getMCPUserAgent() {
75125
75125
  const parts = [];
@@ -75133,7 +75133,7 @@ function getMCPUserAgent() {
75133
75133
  parts.push(`client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}`);
75134
75134
  }
75135
75135
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
75136
- return `ur/${"1.55.0"}${suffix}`;
75136
+ return `ur/${"1.56.0"}${suffix}`;
75137
75137
  }
75138
75138
  function getWebFetchUserAgent() {
75139
75139
  return `UR-User (${getURCodeUserAgent()})`;
@@ -75271,7 +75271,7 @@ var init_user = __esm(() => {
75271
75271
  deviceId,
75272
75272
  sessionId: getSessionId(),
75273
75273
  email: getEmail(),
75274
- appVersion: "1.55.0",
75274
+ appVersion: "1.56.0",
75275
75275
  platform: getHostPlatformForAnalytics(),
75276
75276
  organizationUuid,
75277
75277
  accountUuid,
@@ -83471,7 +83471,7 @@ var init_metadata = __esm(() => {
83471
83471
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
83472
83472
  WHITESPACE_REGEX = /\s+/;
83473
83473
  getVersionBase = memoize_default(() => {
83474
- const match = "1.55.0".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
83474
+ const match = "1.56.0".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
83475
83475
  return match ? match[0] : undefined;
83476
83476
  });
83477
83477
  buildEnvContext = memoize_default(async () => {
@@ -83511,7 +83511,7 @@ var init_metadata = __esm(() => {
83511
83511
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
83512
83512
  isURCodeAction: isEnvTruthy(process.env.UR_CODE_ACTION),
83513
83513
  isURAiAuth: isURAISubscriber(),
83514
- version: "1.55.0",
83514
+ version: "1.56.0",
83515
83515
  versionBase: getVersionBase(),
83516
83516
  buildTime: "",
83517
83517
  deploymentEnvironment: env2.detectDeploymentEnvironment(),
@@ -84181,7 +84181,7 @@ function initialize1PEventLogging() {
84181
84181
  const platform2 = getPlatform();
84182
84182
  const attributes = {
84183
84183
  [import_semantic_conventions4.ATTR_SERVICE_NAME]: "ur",
84184
- [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.55.0"
84184
+ [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.56.0"
84185
84185
  };
84186
84186
  if (platform2 === "wsl") {
84187
84187
  const wslVersion = getWslVersion();
@@ -84209,7 +84209,7 @@ function initialize1PEventLogging() {
84209
84209
  })
84210
84210
  ]
84211
84211
  });
84212
- firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.55.0");
84212
+ firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.56.0");
84213
84213
  }
84214
84214
  async function reinitialize1PEventLoggingIfConfigChanged() {
84215
84215
  if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
@@ -86723,6 +86723,10 @@ var init_types2 = __esm(() => {
86723
86723
  includeCoAuthoredBy: exports_external.boolean().optional().describe("Deprecated: Use attribution instead. " + "Whether to include UR's co-authored by attribution in commits and PRs (defaults to true)"),
86724
86724
  includeGitInstructions: exports_external.boolean().optional().describe("Include built-in commit and PR workflow instructions in UR's system prompt (default: true)"),
86725
86725
  permissions: PermissionsSchema().optional().describe("Tool usage permissions configuration"),
86726
+ agents: exports_external.object({
86727
+ maxDepth: exports_external.number().optional().describe("Maximum subagent nesting depth (default 3, hard ceiling 10)"),
86728
+ maxConcurrent: exports_external.number().optional().describe("Maximum subagents running at once (default 20, hard ceiling 100)")
86729
+ }).optional().describe("Subagent fan-out limits"),
86726
86730
  model: exports_external.string().optional().describe("Override the default model used by UR"),
86727
86731
  provider: exports_external.object({
86728
86732
  active: exports_external.enum(PROVIDER_SETTING_IDS).optional().describe("Active legal model provider adapter"),
@@ -94035,7 +94039,7 @@ function formatAgentTrendReport(report = buildAgentTrendReport()) {
94035
94039
  function formatA2AAgentCard(options = {}, pretty = true) {
94036
94040
  return JSON.stringify(buildA2AAgentCard(options), null, pretty ? 2 : 0);
94037
94041
  }
94038
- var urVersion = "1.55.0", researchSnapshotDate = "2026-07-15", coverage, priorityRoadmap;
94042
+ var urVersion = "1.56.0", researchSnapshotDate = "2026-07-15", coverage, priorityRoadmap;
94039
94043
  var init_trends = __esm(() => {
94040
94044
  init_a2aCardSignature();
94041
94045
  coverage = [
@@ -96836,7 +96840,7 @@ function getAttributionHeader(fingerprint) {
96836
96840
  if (!isAttributionHeaderEnabled()) {
96837
96841
  return "";
96838
96842
  }
96839
- const version2 = `${"1.55.0"}.${fingerprint}`;
96843
+ const version2 = `${"1.56.0"}.${fingerprint}`;
96840
96844
  const entrypoint = process.env.UR_CODE_ENTRYPOINT ?? "unknown";
96841
96845
  const cch = "";
96842
96846
  const workload = getWorkload();
@@ -137758,7 +137762,7 @@ function buildSeatbeltProfile(root2, options) {
137758
137762
  const denyReadRules = normalizedPaths(root2, options.denyRead).map((path10) => ` (subpath "${sbplString(path10)}")`).join(`
137759
137763
  `);
137760
137764
  const allowRead = normalizedPaths(root2, options.allowRead);
137761
- const restrictReads = allowRead.length > 0;
137765
+ const restrictReads = allowRead.length > 0 || options.denyByDefault === true;
137762
137766
  if (restrictReads) {
137763
137767
  const runtimeReadRoots = normalizedPaths(root2, [
137764
137768
  "/System",
@@ -154425,7 +154429,7 @@ var init_projectSafety = __esm(() => {
154425
154429
  function getInstruments() {
154426
154430
  if (instruments)
154427
154431
  return instruments;
154428
- const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.55.0");
154432
+ const meter = import_api10.metrics.getMeter("ur-agent.gen_ai", "1.56.0");
154429
154433
  instruments = {
154430
154434
  operationDuration: meter.createHistogram("gen_ai.client.operation.duration", {
154431
154435
  description: "GenAI operation duration.",
@@ -154523,7 +154527,7 @@ function genAiAgentAttributes() {
154523
154527
  "gen_ai.operation.name": GEN_AI_OPERATION_INVOKE_AGENT,
154524
154528
  "gen_ai.provider.name": "ur",
154525
154529
  "gen_ai.agent.name": "UR-Nexus",
154526
- "gen_ai.agent.version": "1.55.0"
154530
+ "gen_ai.agent.version": "1.56.0"
154527
154531
  };
154528
154532
  }
154529
154533
  function genAiWorkflowAttributes(workflowName) {
@@ -154539,7 +154543,7 @@ function genAiWorkflowAttributes(workflowName) {
154539
154543
  function startGenAiWorkflowSpan(workflowName) {
154540
154544
  const attributes = genAiWorkflowAttributes(workflowName);
154541
154545
  const name = typeof attributes["gen_ai.workflow.name"] === "string" ? `invoke_workflow ${attributes["gen_ai.workflow.name"]}` : GEN_AI_OPERATION_INVOKE_WORKFLOW;
154542
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.55.0").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
154546
+ return import_api10.trace.getTracer("ur-agent.gen_ai", "1.56.0").startSpan(name, { kind: import_api10.SpanKind.INTERNAL, attributes });
154543
154547
  }
154544
154548
  function endGenAiWorkflowSpan(span, options2 = {}) {
154545
154549
  try {
@@ -154577,7 +154581,7 @@ function startGenAiMemorySpan(operation, options2 = {}) {
154577
154581
  if (options2.recordCount !== undefined && Number.isInteger(options2.recordCount) && options2.recordCount >= 0) {
154578
154582
  attributes["gen_ai.memory.record.count"] = options2.recordCount;
154579
154583
  }
154580
- return import_api10.trace.getTracer("ur-agent.gen_ai", "1.55.0").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
154584
+ return import_api10.trace.getTracer("ur-agent.gen_ai", "1.56.0").startSpan(operation, { kind: import_api10.SpanKind.INTERNAL, attributes });
154581
154585
  }
154582
154586
  function endGenAiMemorySpan(span, options2 = {}) {
154583
154587
  try {
@@ -206096,7 +206100,7 @@ function getTelemetryAttributes() {
206096
206100
  attributes["session.id"] = sessionId;
206097
206101
  }
206098
206102
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
206099
- attributes["app.version"] = "1.55.0";
206103
+ attributes["app.version"] = "1.56.0";
206100
206104
  }
206101
206105
  const oauthAccount = getOauthAccountInfo();
206102
206106
  if (oauthAccount) {
@@ -222630,6 +222634,73 @@ var init_coordinatorMode = __esm(() => {
222630
222634
  ]);
222631
222635
  });
222632
222636
 
222637
+ // src/tools/AgentTool/fanOutLimits.ts
222638
+ function depthFor(parentId) {
222639
+ if (!parentId)
222640
+ return 1;
222641
+ const parent = active.get(parentId);
222642
+ return parent ? parent.depth + 1 : 1;
222643
+ }
222644
+ function canSpawnAgent(parentId, limits) {
222645
+ const depth = depthFor(parentId);
222646
+ if (depth > limits.maxDepth) {
222647
+ return {
222648
+ allowed: false,
222649
+ depth,
222650
+ reason: `Subagent nesting limit reached (depth ${depth} > ${limits.maxDepth}). ` + "Raise agents.maxDepth in settings if this task genuinely needs deeper delegation."
222651
+ };
222652
+ }
222653
+ if (active.size >= limits.maxConcurrent) {
222654
+ return {
222655
+ allowed: false,
222656
+ depth,
222657
+ reason: `Concurrent subagent limit reached (${active.size}/${limits.maxConcurrent} running). ` + "Wait for running agents to finish, or raise agents.maxConcurrent in settings."
222658
+ };
222659
+ }
222660
+ return { allowed: true, depth };
222661
+ }
222662
+ function registerAgent(agentId, parentId, depth, now5 = Date.now) {
222663
+ active.set(agentId, {
222664
+ agentId,
222665
+ parentId: parentId ?? "session",
222666
+ depth,
222667
+ startedAt: now5()
222668
+ });
222669
+ let released = false;
222670
+ return () => {
222671
+ if (released)
222672
+ return;
222673
+ released = true;
222674
+ active.delete(agentId);
222675
+ };
222676
+ }
222677
+ var DEFAULT_MAX_AGENT_DEPTH = 3, DEFAULT_MAX_CONCURRENT_AGENTS = 20, active;
222678
+ var init_fanOutLimits = __esm(() => {
222679
+ active = new Map;
222680
+ });
222681
+
222682
+ // src/tools/AgentTool/fanOutSettings.ts
222683
+ function clamp2(value, fallback, hardMax) {
222684
+ if (typeof value !== "number" || !Number.isFinite(value))
222685
+ return fallback;
222686
+ const rounded = Math.floor(value);
222687
+ if (rounded < 1)
222688
+ return 1;
222689
+ return Math.min(rounded, hardMax);
222690
+ }
222691
+ function resolveFanOutLimits(settings = getInitialSettings()) {
222692
+ const agents = settings.agents ?? {};
222693
+ return {
222694
+ maxDepth: clamp2(agents.maxDepth, DEFAULT_MAX_AGENT_DEPTH, HARD_MAX_DEPTH),
222695
+ maxConcurrent: clamp2(agents.maxConcurrent, DEFAULT_MAX_CONCURRENT_AGENTS, HARD_MAX_CONCURRENT)
222696
+ };
222697
+ }
222698
+ var HARD_MAX_DEPTH = 10, HARD_MAX_CONCURRENT = 100;
222699
+ var init_fanOutSettings = __esm(() => {
222700
+ init_settings2();
222701
+ init_fanOutLimits();
222702
+ });
222703
+
222633
222704
  // node_modules/zod/v3/helpers/util.js
222634
222705
  var util4, objectUtil, ZodParsedType, getParsedType2 = (data) => {
222635
222706
  const t = typeof data;
@@ -241596,7 +241667,7 @@ function getInstallationEnv() {
241596
241667
  return;
241597
241668
  }
241598
241669
  function getURCodeVersion() {
241599
- return "1.55.0";
241670
+ return "1.56.0";
241600
241671
  }
241601
241672
  async function getInstalledVSCodeExtensionVersion(command) {
241602
241673
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -243532,7 +243603,7 @@ var init_computerUseCompat = __esm(() => {
243532
243603
  function useDeclaredCursor({
243533
243604
  line,
243534
243605
  column,
243535
- active
243606
+ active: active2
243536
243607
  }) {
243537
243608
  const setCursorDeclaration = import_react41.useContext(CursorDeclarationContext_default);
243538
243609
  const nodeRef = import_react41.useRef(null);
@@ -243541,7 +243612,7 @@ function useDeclaredCursor({
243541
243612
  }, []);
243542
243613
  import_react41.useLayoutEffect(() => {
243543
243614
  const node = nodeRef.current;
243544
- if (active && node) {
243615
+ if (active2 && node) {
243545
243616
  setCursorDeclaration({ relativeX: column, relativeY: line, node });
243546
243617
  } else {
243547
243618
  setCursorDeclaration(null, node);
@@ -248927,7 +248998,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
248927
248998
  const client2 = new Client({
248928
248999
  name: "ur",
248929
249000
  title: "UR",
248930
- version: "1.55.0",
249001
+ version: "1.56.0",
248931
249002
  description: "UR-Nexus autonomous engineering workflow engine",
248932
249003
  websiteUrl: PRODUCT_URL
248933
249004
  }, {
@@ -249287,7 +249358,7 @@ var init_client5 = __esm(() => {
249287
249358
  const client2 = new Client({
249288
249359
  name: "ur",
249289
249360
  title: "UR",
249290
- version: "1.55.0",
249361
+ version: "1.56.0",
249291
249362
  description: "UR-Nexus autonomous engineering workflow engine",
249292
249363
  websiteUrl: PRODUCT_URL
249293
249364
  }, {
@@ -250508,7 +250579,7 @@ function emitProcessMetadata(agentInfo) {
250508
250579
  function isPerfettoTracingEnabled() {
250509
250580
  return isEnabled;
250510
250581
  }
250511
- function registerAgent(agentId, agentName, parentAgentId) {
250582
+ function registerAgent2(agentId, agentName, parentAgentId) {
250512
250583
  if (!isEnabled)
250513
250584
  return;
250514
250585
  const info = {
@@ -258169,8 +258240,8 @@ class DeltaMetricProcessor {
258169
258240
  }
258170
258241
  }
258171
258242
  if (this._activeCollectionStorage.has(attributes, hashCode)) {
258172
- const active = this._activeCollectionStorage.get(attributes, hashCode);
258173
- delta = this._aggregator.merge(active, delta);
258243
+ const active2 = this._activeCollectionStorage.get(attributes, hashCode);
258244
+ delta = this._aggregator.merge(active2, delta);
258174
258245
  }
258175
258246
  this._cumulativeMemoStorage.set(attributes, accumulation, hashCode);
258176
258247
  this._activeCollectionStorage.set(attributes, delta, hashCode);
@@ -261888,7 +261959,7 @@ async function createRuntime() {
261888
261959
  bootstrapTelemetry();
261889
261960
  const resource = defaultResource().merge(detectResources({ detectors: [envDetector] })).merge(resourceFromAttributes({
261890
261961
  [import_semantic_conventions7.ATTR_SERVICE_NAME]: "ur-agent",
261891
- [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.55.0"
261962
+ [import_semantic_conventions7.ATTR_SERVICE_VERSION]: "1.56.0"
261892
261963
  }));
261893
261964
  const tracerProvider = exporters.traces.length > 0 ? new BasicTracerProvider({
261894
261965
  resource,
@@ -261921,11 +261992,11 @@ async function createRuntime() {
261921
261992
  setMeterProvider(meterProvider);
261922
261993
  setLoggerProvider(loggerProvider);
261923
261994
  if (meterProvider) {
261924
- const meter = meterProvider.getMeter("ur-agent", "1.55.0");
261995
+ const meter = meterProvider.getMeter("ur-agent", "1.56.0");
261925
261996
  setMeter(meter, (name, options2) => meter.createCounter(name, options2));
261926
261997
  }
261927
261998
  if (loggerProvider) {
261928
- setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.55.0"));
261999
+ setEventLogger(loggerProvider.getLogger("ur-agent.events", "1.56.0"));
261929
262000
  }
261930
262001
  if (!cleanupRegistered2) {
261931
262002
  cleanupRegistered2 = true;
@@ -262587,9 +262658,9 @@ async function assertMinVersion() {
262587
262658
  if (false) {}
262588
262659
  try {
262589
262660
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
262590
- if (versionConfig.minVersion && lt("1.55.0", versionConfig.minVersion)) {
262661
+ if (versionConfig.minVersion && lt("1.56.0", versionConfig.minVersion)) {
262591
262662
  console.error(`
262592
- It looks like your version of UR (${"1.55.0"}) needs an update.
262663
+ It looks like your version of UR (${"1.56.0"}) needs an update.
262593
262664
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
262594
262665
 
262595
262666
  To update, please run:
@@ -262805,7 +262876,7 @@ async function installGlobalPackage(specificVersion) {
262805
262876
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
262806
262877
  logEvent("tengu_auto_updater_lock_contention", {
262807
262878
  pid: process.pid,
262808
- currentVersion: "1.55.0"
262879
+ currentVersion: "1.56.0"
262809
262880
  });
262810
262881
  return "in_progress";
262811
262882
  }
@@ -262814,7 +262885,7 @@ async function installGlobalPackage(specificVersion) {
262814
262885
  if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
262815
262886
  logError2(new Error("Windows NPM detected in WSL environment"));
262816
262887
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
262817
- currentVersion: "1.55.0"
262888
+ currentVersion: "1.56.0"
262818
262889
  });
262819
262890
  console.error(`
262820
262891
  Error: Windows NPM detected in WSL
@@ -263349,7 +263420,7 @@ function detectLinuxGlobPatternWarnings() {
263349
263420
  }
263350
263421
  async function getDoctorDiagnostic() {
263351
263422
  const installationType = await getCurrentInstallationType();
263352
- const version2 = typeof MACRO !== "undefined" ? "1.55.0" : "unknown";
263423
+ const version2 = typeof MACRO !== "undefined" ? "1.56.0" : "unknown";
263353
263424
  const installationPath = await getInstallationPath();
263354
263425
  const invokedBinary = getInvokedBinary();
263355
263426
  const multipleInstallations = await detectMultipleInstallations();
@@ -264284,8 +264355,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
264284
264355
  const maxVersion = await getMaxVersion();
264285
264356
  if (maxVersion && gt(version2, maxVersion)) {
264286
264357
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
264287
- if (gte("1.55.0", maxVersion)) {
264288
- logForDebugging(`Native installer: current version ${"1.55.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
264358
+ if (gte("1.56.0", maxVersion)) {
264359
+ logForDebugging(`Native installer: current version ${"1.56.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
264289
264360
  logEvent("tengu_native_update_skipped_max_version", {
264290
264361
  latency_ms: Date.now() - startTime,
264291
264362
  max_version: maxVersion,
@@ -264296,7 +264367,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
264296
264367
  version2 = maxVersion;
264297
264368
  }
264298
264369
  }
264299
- if (!forceReinstall && version2 === "1.55.0" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
264370
+ if (!forceReinstall && version2 === "1.56.0" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
264300
264371
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
264301
264372
  logEvent("tengu_native_update_complete", {
264302
264373
  latency_ms: Date.now() - startTime,
@@ -270858,9 +270929,9 @@ class InProcessBackend {
270858
270929
  }
270859
270930
  const isRunning = task.status === "running";
270860
270931
  const isAborted2 = task.abortController?.signal.aborted ?? true;
270861
- const active = isRunning && !isAborted2;
270862
- logForDebugging(`[InProcessBackend] isActive() for ${agentId}: ${active} (running=${isRunning}, aborted=${isAborted2})`);
270863
- return active;
270932
+ const active2 = isRunning && !isAborted2;
270933
+ logForDebugging(`[InProcessBackend] isActive() for ${agentId}: ${active2} (running=${isRunning}, aborted=${isAborted2})`);
270934
+ return active2;
270864
270935
  }
270865
270936
  }
270866
270937
  function createInProcessBackend() {
@@ -272550,7 +272621,7 @@ async function spawnInProcessTeammate(config2, context5) {
272550
272621
  abortController
272551
272622
  });
272552
272623
  if (isPerfettoTracingEnabled()) {
272553
- registerAgent(agentId, name, parentSessionId);
272624
+ registerAgent2(agentId, name, parentSessionId);
272554
272625
  }
272555
272626
  const description = `${name}: ${prompt.substring(0, 50)}${prompt.length > 50 ? "..." : ""}`;
272556
272627
  const taskState = {
@@ -285807,12 +285878,18 @@ async function* runAgent({
285807
285878
  const rootSetAppState = toolUseContext.setAppStateForTasks ?? toolUseContext.setAppState;
285808
285879
  const resolvedAgentModel = getAgentModel(agentDefinition.model, toolUseContext.options.mainLoopModel, model, permissionMode);
285809
285880
  const agentId = override?.agentId ? override.agentId : createAgentId();
285881
+ const fanOutParentId = toolUseContext.agentId;
285882
+ const fanOutDecision = canSpawnAgent(fanOutParentId, resolveFanOutLimits());
285883
+ if (!fanOutDecision.allowed) {
285884
+ throw new Error(fanOutDecision.reason);
285885
+ }
285886
+ const releaseFanOutSlot = registerAgent(agentId, fanOutParentId, fanOutDecision.depth);
285810
285887
  if (transcriptSubdir) {
285811
285888
  setAgentTranscriptSubdir(agentId, transcriptSubdir);
285812
285889
  }
285813
285890
  if (isPerfettoTracingEnabled()) {
285814
285891
  const parentId = toolUseContext.agentId ?? getSessionId();
285815
- registerAgent(agentId, agentDefinition.agentType, parentId);
285892
+ registerAgent2(agentId, agentDefinition.agentType, parentId);
285816
285893
  }
285817
285894
  if (process.env.USER_TYPE === "ant") {
285818
285895
  logForDebugging(`[Subagent ${agentDefinition.agentType}] API calls: ${getDisplayPath(getDumpPromptsPath(agentId))}`);
@@ -286027,6 +286104,7 @@ async function* runAgent({
286027
286104
  agentDefinition.callback();
286028
286105
  }
286029
286106
  } finally {
286107
+ releaseFanOutSlot();
286030
286108
  await mcpCleanup();
286031
286109
  if (agentDefinition.hooks) {
286032
286110
  clearSessionHooks(rootSetAppState, agentId);
@@ -286102,6 +286180,8 @@ function resolveSkillName(skillName, allSkills, agentDefinition) {
286102
286180
  return null;
286103
286181
  }
286104
286182
  var init_runAgent = __esm(() => {
286183
+ init_fanOutLimits();
286184
+ init_fanOutSettings();
286105
286185
  init_uniqBy();
286106
286186
  init_debug();
286107
286187
  init_state();
@@ -334099,7 +334179,7 @@ function isAnyTracingEnabled() {
334099
334179
  return isTelemetryEnabled() || isEnhancedTelemetryEnabled() || isBetaTracingEnabled();
334100
334180
  }
334101
334181
  function getTracer() {
334102
- return import_api39.trace.getTracer("ur-agent.gen_ai", "1.55.0");
334182
+ return import_api39.trace.getTracer("ur-agent.gen_ai", "1.56.0");
334103
334183
  }
334104
334184
  function createSpanAttributes(spanType, customAttributes = {}) {
334105
334185
  const baseAttributes = getTelemetryAttributes();
@@ -363169,7 +363249,7 @@ function Feedback({
363169
363249
  platform: env2.platform,
363170
363250
  gitRepo: envInfo.isGit,
363171
363251
  terminal: env2.terminal,
363172
- version: "1.55.0",
363252
+ version: "1.56.0",
363173
363253
  transcript: normalizeMessagesForAPI(messages),
363174
363254
  errors: sanitizedErrors,
363175
363255
  lastApiRequest: getLastAPIRequest(),
@@ -363361,7 +363441,7 @@ function Feedback({
363361
363441
  ", ",
363362
363442
  env2.terminal,
363363
363443
  ", v",
363364
- "1.55.0"
363444
+ "1.56.0"
363365
363445
  ]
363366
363446
  }, undefined, true, undefined, this)
363367
363447
  ]
@@ -363467,7 +363547,7 @@ ${sanitizedDescription}
363467
363547
  ` + `**Environment Info**
363468
363548
  ` + `- Platform: ${env2.platform}
363469
363549
  ` + `- Terminal: ${env2.terminal}
363470
- ` + `- Version: ${"1.55.0"}
363550
+ ` + `- Version: ${"1.56.0"}
363471
363551
  ` + `- Feedback ID: ${feedbackId}
363472
363552
  ` + `
363473
363553
  **Errors**
@@ -366577,7 +366657,7 @@ function buildPrimarySection() {
366577
366657
  }, undefined, false, undefined, this);
366578
366658
  return [{
366579
366659
  label: "Version",
366580
- value: "1.55.0"
366660
+ value: "1.56.0"
366581
366661
  }, {
366582
366662
  label: "Session name",
366583
366663
  value: nameValue
@@ -369907,7 +369987,7 @@ function Config({
369907
369987
  }
369908
369988
  }, undefined, false, undefined, this)
369909
369989
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime178.jsxDEV(ChannelDowngradeDialog, {
369910
- currentVersion: "1.55.0",
369990
+ currentVersion: "1.56.0",
369911
369991
  onChoice: (choice) => {
369912
369992
  setShowSubmenu(null);
369913
369993
  setTabsHidden(false);
@@ -369919,7 +369999,7 @@ function Config({
369919
369999
  autoUpdatesChannel: "stable"
369920
370000
  };
369921
370001
  if (choice === "stay") {
369922
- newSettings.minimumVersion = "1.55.0";
370002
+ newSettings.minimumVersion = "1.56.0";
369923
370003
  }
369924
370004
  updateSettingsForSource("userSettings", newSettings);
369925
370005
  setSettingsData((prev_27) => ({
@@ -377983,7 +378063,7 @@ function HelpV2(t0) {
377983
378063
  let t6;
377984
378064
  if ($2[31] !== tabs) {
377985
378065
  t6 = /* @__PURE__ */ jsx_dev_runtime205.jsxDEV(Tabs, {
377986
- title: `UR v${"1.55.0"}`,
378066
+ title: `UR v${"1.56.0"}`,
377987
378067
  color: "professionalBlue",
377988
378068
  defaultTab: "general",
377989
378069
  children: tabs
@@ -378900,7 +378980,7 @@ function buildToolUseContext(tools, readFileStateCache, toolPermissionContext, a
378900
378980
  async function handleInitialize(options2) {
378901
378981
  return {
378902
378982
  name: "UR",
378903
- version: "1.55.0",
378983
+ version: "1.56.0",
378904
378984
  protocolVersion: "0.1.0",
378905
378985
  workspaceRoot: options2.cwd,
378906
378986
  capabilities: {
@@ -387655,9 +387735,9 @@ function DiscoverPlugins({
387655
387735
  const [loading, setLoading] = import_react131.useState(true);
387656
387736
  const [installCounts, setInstallCounts] = import_react131.useState(null);
387657
387737
  const [isSearchMode, setIsSearchModeRaw] = import_react131.useState(false);
387658
- const setIsSearchMode = import_react131.useCallback((active) => {
387659
- setIsSearchModeRaw(active);
387660
- onSearchModeChange?.(active);
387738
+ const setIsSearchMode = import_react131.useCallback((active2) => {
387739
+ setIsSearchModeRaw(active2);
387740
+ onSearchModeChange?.(active2);
387661
387741
  }, [onSearchModeChange]);
387662
387742
  const {
387663
387743
  query: searchQuery,
@@ -391639,9 +391719,9 @@ function ManagePlugins({
391639
391719
  const pluginErrors = useAppState((s_1) => s_1.plugins.errors);
391640
391720
  const flaggedPlugins = getFlaggedPlugins();
391641
391721
  const [isSearchMode, setIsSearchModeRaw] = import_react133.useState(false);
391642
- const setIsSearchMode = import_react133.useCallback((active) => {
391643
- setIsSearchModeRaw(active);
391644
- onSearchModeChange?.(active);
391722
+ const setIsSearchMode = import_react133.useCallback((active2) => {
391723
+ setIsSearchModeRaw(active2);
391724
+ onSearchModeChange?.(active2);
391645
391725
  }, [onSearchModeChange]);
391646
391726
  const isTerminalFocused = useTerminalFocus();
391647
391727
  const {
@@ -396008,7 +396088,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
396008
396088
  return [];
396009
396089
  }
396010
396090
  }
396011
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.55.0") {
396091
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.56.0") {
396012
396092
  if (process.env.USER_TYPE === "ant") {
396013
396093
  const changelog = "";
396014
396094
  if (changelog) {
@@ -396035,7 +396115,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.55.0")
396035
396115
  releaseNotes
396036
396116
  };
396037
396117
  }
396038
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.55.0") {
396118
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.56.0") {
396039
396119
  if (process.env.USER_TYPE === "ant") {
396040
396120
  const changelog = "";
396041
396121
  if (changelog) {
@@ -398892,7 +398972,7 @@ function getRecentActivitySync() {
398892
398972
  return cachedActivity;
398893
398973
  }
398894
398974
  function getLogoDisplayData() {
398895
- const version2 = process.env.DEMO_VERSION ?? "1.55.0";
398975
+ const version2 = process.env.DEMO_VERSION ?? "1.56.0";
398896
398976
  const serverUrl = getDirectConnectServerUrl();
398897
398977
  const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd());
398898
398978
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -399776,7 +399856,7 @@ function LogoV2() {
399776
399856
  if ($2[2] === Symbol.for("react.memo_cache_sentinel")) {
399777
399857
  t2 = () => {
399778
399858
  const currentConfig2 = getGlobalConfig();
399779
- if (currentConfig2.lastReleaseNotesSeen === "1.55.0") {
399859
+ if (currentConfig2.lastReleaseNotesSeen === "1.56.0") {
399780
399860
  return;
399781
399861
  }
399782
399862
  saveGlobalConfig(_temp327);
@@ -400461,12 +400541,12 @@ function LogoV2() {
400461
400541
  return t41;
400462
400542
  }
400463
400543
  function _temp327(current) {
400464
- if (current.lastReleaseNotesSeen === "1.55.0") {
400544
+ if (current.lastReleaseNotesSeen === "1.56.0") {
400465
400545
  return current;
400466
400546
  }
400467
400547
  return {
400468
400548
  ...current,
400469
- lastReleaseNotesSeen: "1.55.0"
400549
+ lastReleaseNotesSeen: "1.56.0"
400470
400550
  };
400471
400551
  }
400472
400552
  function _temp241(s_0) {
@@ -406843,7 +406923,7 @@ function listProfiles(read = (source) => getSettingsForSource(source)) {
406843
406923
  const seen = new Set;
406844
406924
  for (const source of LOOKUP_ORDER) {
406845
406925
  const permissions = read(source)?.permissions;
406846
- const active = permissions?.activeProfile;
406926
+ const active2 = permissions?.activeProfile;
406847
406927
  for (const [name, profile] of Object.entries(permissions?.profiles ?? {})) {
406848
406928
  if (seen.has(name))
406849
406929
  continue;
@@ -406854,7 +406934,7 @@ function listProfiles(read = (source) => getSettingsForSource(source)) {
406854
406934
  allow: profile.allow?.length ?? 0,
406855
406935
  deny: profile.deny?.length ?? 0,
406856
406936
  ask: profile.ask?.length ?? 0,
406857
- active: active === name
406937
+ active: active2 === name
406858
406938
  });
406859
406939
  }
406860
406940
  }
@@ -409196,14 +409276,14 @@ async function launchUltraplan(opts) {
409196
409276
  onSessionReady
409197
409277
  } = opts;
409198
409278
  const {
409199
- ultraplanSessionUrl: active,
409279
+ ultraplanSessionUrl: active2,
409200
409280
  ultraplanLaunching
409201
409281
  } = getAppState();
409202
- if (active || ultraplanLaunching) {
409282
+ if (active2 || ultraplanLaunching) {
409203
409283
  logEvent("tengu_ultraplan_create_failed", {
409204
- reason: active ? "already_polling" : "already_launching"
409284
+ reason: active2 ? "already_polling" : "already_launching"
409205
409285
  });
409206
- return buildAlreadyActiveMessage(active);
409286
+ return buildAlreadyActiveMessage(active2);
409207
409287
  }
409208
409288
  if (!blurb && !seedPlan) {
409209
409289
  return [
@@ -409352,14 +409432,14 @@ var ULTRAPLAN_TIMEOUT_MS, CCR_TERMS_URL2 = "https://docs.ur.dev/docs/en/ur-on-th
409352
409432
  return null;
409353
409433
  }
409354
409434
  const {
409355
- ultraplanSessionUrl: active,
409435
+ ultraplanSessionUrl: active2,
409356
409436
  ultraplanLaunching
409357
409437
  } = context6.getAppState();
409358
- if (active || ultraplanLaunching) {
409438
+ if (active2 || ultraplanLaunching) {
409359
409439
  logEvent("tengu_ultraplan_create_failed", {
409360
- reason: active ? "already_polling" : "already_launching"
409440
+ reason: active2 ? "already_polling" : "already_launching"
409361
409441
  });
409362
- onDone(buildAlreadyActiveMessage(active), {
409442
+ onDone(buildAlreadyActiveMessage(active2), {
409363
409443
  display: "system"
409364
409444
  });
409365
409445
  return null;
@@ -417642,7 +417722,7 @@ function compileAgenticCiWorkflow(specName = "default", options2 = {}) {
417642
417722
  if (spec.name !== specName) {
417643
417723
  throw new Error("Agentic CI workflow spec name does not match");
417644
417724
  }
417645
- const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.55.0" : "1.55.0");
417725
+ const packageVersion = options2.packageVersion ?? (typeof MACRO !== "undefined" ? "1.56.0" : "1.56.0");
417646
417726
  if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(packageVersion)) {
417647
417727
  throw new Error("invalid ur-agent package version");
417648
417728
  }
@@ -418635,7 +418715,7 @@ runner; \`ur trigger\` is the inbound parser that decides what to run.
418635
418715
  path: ".github/workflows/ur.yml",
418636
418716
  root: "project",
418637
418717
  content: compileAgenticCiWorkflow("default", {
418638
- packageVersion: typeof MACRO !== "undefined" ? "1.55.0" : "1.55.0"
418718
+ packageVersion: typeof MACRO !== "undefined" ? "1.56.0" : "1.56.0"
418639
418719
  })
418640
418720
  },
418641
418721
  {
@@ -418698,7 +418778,7 @@ function value(tokens, flag) {
418698
418778
  return index2 >= 0 ? tokens[index2 + 1] : undefined;
418699
418779
  }
418700
418780
  function cliVersion() {
418701
- return typeof MACRO !== "undefined" ? "1.55.0" : "1.55.0";
418781
+ return typeof MACRO !== "undefined" ? "1.56.0" : "1.56.0";
418702
418782
  }
418703
418783
  function workflowPath(cwd2) {
418704
418784
  return join158(cwd2, ".github", "workflows", "ur-agentic-ci.yml");
@@ -424216,20 +424296,20 @@ function createRuntime2(deps) {
424216
424296
  const validatedCwd = validateSessionCwd(cwd2);
424217
424297
  const validatedMcpServers = validateMcpServers(mcpServers);
424218
424298
  const validatedAdditionalDirectories = validateAdditionalDirectories(additionalDirectories);
424219
- const active = sessions.get(sessionId);
424220
- if (active) {
424221
- if (active.cwd !== validatedCwd) {
424299
+ const active2 = sessions.get(sessionId);
424300
+ if (active2) {
424301
+ if (active2.cwd !== validatedCwd) {
424222
424302
  invalidParams2("session/resume cwd must match the original session cwd");
424223
424303
  }
424224
- if (active.activePrompt) {
424304
+ if (active2.activePrompt) {
424225
424305
  throw new RequestError(-32000, `session ${sessionId} already has an active prompt`);
424226
424306
  }
424227
- active.mcpServers = validatedMcpServers;
424228
- active.additionalDirectories = validatedAdditionalDirectories;
424229
- touch(sessionId, active);
424307
+ active2.mcpServers = validatedMcpServers;
424308
+ active2.additionalDirectories = validatedAdditionalDirectories;
424309
+ touch(sessionId, active2);
424230
424310
  return {
424231
- modes: modeState(active),
424232
- configOptions: configOptions(active)
424311
+ modes: modeState(active2),
424312
+ configOptions: configOptions(active2)
424233
424313
  };
424234
424314
  }
424235
424315
  assertCapacity();
@@ -424464,12 +424544,12 @@ function createRuntime2(deps) {
424464
424544
  const deleteSession = async (sessionId) => {
424465
424545
  const metadataPath = persistedSessionPath(sessionId, sessionStoreRoot);
424466
424546
  const historyPath = persistedSessionHistoryPath(sessionId, sessionStoreRoot);
424467
- const active = sessions.get(sessionId);
424547
+ const active2 = sessions.get(sessionId);
424468
424548
  const persisted = shouldPersistSessions && existsSync42(metadataPath);
424469
- if (!active && !persisted)
424549
+ if (!active2 && !persisted)
424470
424550
  invalidParams2(`unknown session: ${sessionId}`);
424471
- if (active) {
424472
- await waitForPromptToStop(active);
424551
+ if (active2) {
424552
+ await waitForPromptToStop(active2);
424473
424553
  sessions.delete(sessionId);
424474
424554
  }
424475
424555
  if (shouldPersistSessions) {
@@ -424554,7 +424634,7 @@ function createAcpStdioApp(deps) {
424554
424634
  }
424555
424635
  },
424556
424636
  authMethods: [],
424557
- agentInfo: { name: "UR-Nexus", version: "1.55.0" }
424637
+ agentInfo: { name: "UR-Nexus", version: "1.56.0" }
424558
424638
  })).onRequest("authenticate", () => ({})).onRequest("session/new", async (context6) => {
424559
424639
  const result = runtime2.newSession(context6.params.cwd, context6.params.mcpServers, context6.params.additionalDirectories);
424560
424640
  await runtime2.announce({
@@ -424651,7 +424731,7 @@ function createAcpStdioAgent(deps) {
424651
424731
  }
424652
424732
  },
424653
424733
  authMethods: [],
424654
- agentInfo: { name: "UR-Nexus", version: "1.55.0" }
424734
+ agentInfo: { name: "UR-Nexus", version: "1.56.0" }
424655
424735
  });
424656
424736
  return;
424657
424737
  case "authenticate":
@@ -432421,11 +432501,11 @@ async function steerCloudTask(cwd2, id, message, options2 = {}) {
432421
432501
  reason: "live steering is supported for managed cloud tasks; use ur bg for steerable local runs"
432422
432502
  };
432423
432503
  }
432424
- const active = (task.candidates ?? []).filter((candidate) => candidate.status === "running" && typeof candidate.sessionId === "string").map((candidate) => ({
432504
+ const active2 = (task.candidates ?? []).filter((candidate) => candidate.status === "running" && typeof candidate.sessionId === "string").map((candidate) => ({
432425
432505
  id: candidate.id,
432426
432506
  sessionId: candidate.sessionId
432427
432507
  }));
432428
- if (active.length === 0) {
432508
+ if (active2.length === 0) {
432429
432509
  return {
432430
432510
  state: "rejected",
432431
432511
  reason: "no active managed candidate accepted the message"
@@ -432441,7 +432521,7 @@ async function steerCloudTask(cwd2, id, message, options2 = {}) {
432441
432521
  });
432442
432522
  task.steeringReceipts = task.steeringReceipts.slice(-MAX_CLOUD_STEERING_RECEIPTS);
432443
432523
  task.updatedAt = now7();
432444
- return { state: "reserved", active };
432524
+ return { state: "reserved", active: active2 };
432445
432525
  });
432446
432526
  if (reservation.state === "rejected") {
432447
432527
  return {
@@ -433542,11 +433622,11 @@ async function handleArtifactsPost(cwd2, url3, exec7) {
433542
433622
  return { status: 404, type: "application/json", body: JSON.stringify({ error: `Unknown endpoint: ${path22}` }) };
433543
433623
  }
433544
433624
  function activeArtifactsServer() {
433545
- return active ? { port: active.port, url: `http://127.0.0.1:${active.port}` } : null;
433625
+ return active2 ? { port: active2.port, url: `http://127.0.0.1:${active2.port}` } : null;
433546
433626
  }
433547
433627
  function startArtifactsServer(cwd2, port = 4180, exec7) {
433548
- if (active) {
433549
- return Promise.resolve({ port: active.port, url: `http://127.0.0.1:${active.port}`, alreadyRunning: true });
433628
+ if (active2) {
433629
+ return Promise.resolve({ port: active2.port, url: `http://127.0.0.1:${active2.port}`, alreadyRunning: true });
433550
433630
  }
433551
433631
  if (starting) {
433552
433632
  return starting.then((result) => ({ ...result, alreadyRunning: true }));
@@ -433590,10 +433670,10 @@ function startArtifactsServer(cwd2, port = 4180, exec7) {
433590
433670
  server2.listen(port, "127.0.0.1", () => {
433591
433671
  const address = server2.address();
433592
433672
  const boundPort = typeof address === "object" && address ? address.port : port;
433593
- active = { server: server2, port: boundPort };
433673
+ active2 = { server: server2, port: boundPort };
433594
433674
  server2.once("close", () => {
433595
- if (active?.server === server2)
433596
- active = null;
433675
+ if (active2?.server === server2)
433676
+ active2 = null;
433597
433677
  });
433598
433678
  resolvePromise({
433599
433679
  port: boundPort,
@@ -433618,16 +433698,16 @@ async function stopArtifactsServer() {
433618
433698
  await starting.catch(() => {
433619
433699
  return;
433620
433700
  });
433621
- if (!active)
433701
+ if (!active2)
433622
433702
  return false;
433623
- const { server: server2 } = active;
433624
- active = null;
433703
+ const { server: server2 } = active2;
433704
+ active2 = null;
433625
433705
  await new Promise((resolvePromise) => server2.close(() => resolvePromise()));
433626
433706
  return true;
433627
433707
  }
433628
433708
  var STATUS_COLOR, DIFF_VIEWER_HEAD = `
433629
433709
  <link rel="stylesheet" href="/assets/hljs.css">
433630
- <link rel="stylesheet" href="/assets/diff2html.css">`, ASSET_SPECS, assetCache, SAFE_INLINE_ATTACHMENT_TYPES, active = null, starting = null;
433710
+ <link rel="stylesheet" href="/assets/diff2html.css">`, ASSET_SPECS, assetCache, SAFE_INLINE_ATTACHMENT_TYPES, active2 = null, starting = null;
433631
433711
  var init_artifactsServer = __esm(() => {
433632
433712
  init_dashboardRoutes();
433633
433713
  init_artifacts();
@@ -434846,22 +434926,22 @@ async function runCrew(name, options2) {
434846
434926
  let spawned = 0;
434847
434927
  if (options2.dynamic) {
434848
434928
  const governor = Math.min(32, Math.max(1, options2.maxWorkers ?? 8));
434849
- const active2 = new Set;
434929
+ const active3 = new Set;
434850
434930
  const todoCount = () => {
434851
434931
  const spec = loadCrew(cwd2, name);
434852
434932
  return spec ? spec.tasks.filter((t) => t.status === "todo").length : 0;
434853
434933
  };
434854
434934
  for (;; ) {
434855
- while (active2.size < governor && todoCount() > active2.size) {
434935
+ while (active3.size < governor && todoCount() > active3.size) {
434856
434936
  spawned += 1;
434857
434937
  const id = `w${spawned}`;
434858
- const p2 = worker(id).finally(() => active2.delete(p2));
434859
- active2.add(p2);
434938
+ const p2 = worker(id).finally(() => active3.delete(p2));
434939
+ active3.add(p2);
434860
434940
  }
434861
- if (active2.size === 0)
434941
+ if (active3.size === 0)
434862
434942
  break;
434863
- await Promise.race(active2);
434864
- if (active2.size === 0 && todoCount() === 0)
434943
+ await Promise.race(active3);
434944
+ if (active3.size === 0 && todoCount() === 0)
434865
434945
  break;
434866
434946
  }
434867
434947
  } else {
@@ -625756,8 +625836,8 @@ function resolveAgentOverrides(allAgents, activeAgents) {
625756
625836
  if (seen.has(key))
625757
625837
  continue;
625758
625838
  seen.add(key);
625759
- const active2 = activeMap.get(agent2.agentType);
625760
- const overriddenBy = active2 && active2.source !== agent2.source ? active2.source : undefined;
625839
+ const active3 = activeMap.get(agent2.agentType);
625840
+ const overriddenBy = active3 && active3.source !== agent2.source ? active3.source : undefined;
625761
625841
  resolved.push({ ...agent2, overriddenBy });
625762
625842
  }
625763
625843
  return resolved;
@@ -632018,7 +632098,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
632018
632098
  smapsRollup,
632019
632099
  platform: process.platform,
632020
632100
  nodeVersion: process.version,
632021
- ccVersion: "1.55.0"
632101
+ ccVersion: "1.56.0"
632022
632102
  };
632023
632103
  }
632024
632104
  async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
@@ -632598,7 +632678,7 @@ var init_bridge_kick = __esm(() => {
632598
632678
  var call149 = async () => {
632599
632679
  return {
632600
632680
  type: "text",
632601
- value: "1.55.0"
632681
+ value: "1.56.0"
632602
632682
  };
632603
632683
  }, version2, version_default;
632604
632684
  var init_version = __esm(() => {
@@ -643669,7 +643749,7 @@ function generateHtmlReport(data, insights) {
643669
643749
  </html>`;
643670
643750
  }
643671
643751
  function buildExportData(data, insights, facets, remoteStats) {
643672
- const version3 = typeof MACRO !== "undefined" ? "1.55.0" : "unknown";
643752
+ const version3 = typeof MACRO !== "undefined" ? "1.56.0" : "unknown";
643673
643753
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
643674
643754
  const facets_summary = {
643675
643755
  total: facets.size,
@@ -647972,7 +648052,7 @@ var init_sessionStorage = __esm(() => {
647972
648052
  init_settings2();
647973
648053
  init_slowOperations();
647974
648054
  init_uuid();
647975
- VERSION7 = typeof MACRO !== "undefined" ? "1.55.0" : "unknown";
648055
+ VERSION7 = typeof MACRO !== "undefined" ? "1.56.0" : "unknown";
647976
648056
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
647977
648057
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
647978
648058
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -649187,7 +649267,7 @@ var init_filesystem = __esm(() => {
649187
649267
  });
649188
649268
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
649189
649269
  const nonce = randomBytes19(16).toString("hex");
649190
- return join226(getURTempDir(), "bundled-skills", "1.55.0", nonce);
649270
+ return join226(getURTempDir(), "bundled-skills", "1.56.0", nonce);
649191
649271
  });
649192
649272
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
649193
649273
  });
@@ -655482,7 +655562,7 @@ function computeFingerprint(messageText2, version3) {
655482
655562
  }
655483
655563
  function computeFingerprintFromMessages(messages) {
655484
655564
  const firstMessageText = extractFirstMessageText(messages);
655485
- return computeFingerprint(firstMessageText, "1.55.0");
655565
+ return computeFingerprint(firstMessageText, "1.56.0");
655486
655566
  }
655487
655567
  var FINGERPRINT_SALT = "59cf53e54c78";
655488
655568
  var init_fingerprint = () => {};
@@ -657378,7 +657458,7 @@ async function sideQuery(opts) {
657378
657458
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
657379
657459
  }
657380
657460
  const messageText2 = extractFirstUserMessageText(messages);
657381
- const fingerprint2 = computeFingerprint(messageText2, "1.55.0");
657461
+ const fingerprint2 = computeFingerprint(messageText2, "1.56.0");
657382
657462
  const attributionHeader = getAttributionHeader(fingerprint2);
657383
657463
  const systemBlocks = [
657384
657464
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -662149,7 +662229,7 @@ function buildSystemInitMessage(inputs) {
662149
662229
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
662150
662230
  apiKeySource: getURHQApiKeyWithSource().source,
662151
662231
  betas: getSdkBetas(),
662152
- ur_version: "1.55.0",
662232
+ ur_version: "1.56.0",
662153
662233
  output_style: outputStyle2,
662154
662234
  agents: inputs.agents.map((agent2) => agent2.agentType),
662155
662235
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
@@ -676009,7 +676089,7 @@ var init_useVoiceEnabled = __esm(() => {
676009
676089
  function getSemverPart(version3) {
676010
676090
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
676011
676091
  }
676012
- function useUpdateNotification(updatedVersion, initialVersion = "1.55.0") {
676092
+ function useUpdateNotification(updatedVersion, initialVersion = "1.56.0") {
676013
676093
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react222.useState(() => getSemverPart(initialVersion));
676014
676094
  if (!updatedVersion) {
676015
676095
  return null;
@@ -676058,7 +676138,7 @@ function AutoUpdater({
676058
676138
  return;
676059
676139
  }
676060
676140
  if (false) {}
676061
- const currentVersion = "1.55.0";
676141
+ const currentVersion = "1.56.0";
676062
676142
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
676063
676143
  let latestVersion = await getLatestVersion(channel);
676064
676144
  const isDisabled = isAutoUpdaterDisabled();
@@ -676287,12 +676367,12 @@ function NativeAutoUpdater({
676287
676367
  logEvent("tengu_native_auto_updater_start", {});
676288
676368
  try {
676289
676369
  const maxVersion = await getMaxVersion();
676290
- if (maxVersion && gt("1.55.0", maxVersion)) {
676370
+ if (maxVersion && gt("1.56.0", maxVersion)) {
676291
676371
  const msg = await getMaxVersionMessage();
676292
676372
  setMaxVersionIssue(msg ?? "affects your version");
676293
676373
  }
676294
676374
  const result = await installLatest(channel);
676295
- const currentVersion = "1.55.0";
676375
+ const currentVersion = "1.56.0";
676296
676376
  const latencyMs = Date.now() - startTime;
676297
676377
  if (result.lockFailed) {
676298
676378
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -676429,17 +676509,17 @@ function PackageManagerAutoUpdater(t0) {
676429
676509
  const maxVersion = await getMaxVersion();
676430
676510
  if (maxVersion && latest && gt(latest, maxVersion)) {
676431
676511
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
676432
- if (gte("1.55.0", maxVersion)) {
676433
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.55.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
676512
+ if (gte("1.56.0", maxVersion)) {
676513
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.56.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
676434
676514
  setUpdateAvailable(false);
676435
676515
  return;
676436
676516
  }
676437
676517
  latest = maxVersion;
676438
676518
  }
676439
- const hasUpdate = latest && !gte("1.55.0", latest) && !shouldSkipVersion(latest);
676519
+ const hasUpdate = latest && !gte("1.56.0", latest) && !shouldSkipVersion(latest);
676440
676520
  setUpdateAvailable(!!hasUpdate);
676441
676521
  if (hasUpdate) {
676442
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.55.0"} -> ${latest}`);
676522
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.56.0"} -> ${latest}`);
676443
676523
  }
676444
676524
  };
676445
676525
  $2[0] = t1;
@@ -676473,7 +676553,7 @@ function PackageManagerAutoUpdater(t0) {
676473
676553
  wrap: "truncate",
676474
676554
  children: [
676475
676555
  "currentVersion: ",
676476
- "1.55.0"
676556
+ "1.56.0"
676477
676557
  ]
676478
676558
  }, undefined, true, undefined, this);
676479
676559
  $2[3] = verbose;
@@ -687170,7 +687250,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
687170
687250
  project_dir: getOriginalCwd(),
687171
687251
  added_dirs: addedDirs
687172
687252
  },
687173
- version: "1.55.0",
687253
+ version: "1.56.0",
687174
687254
  output_style: {
687175
687255
  name: outputStyleName
687176
687256
  },
@@ -687253,7 +687333,7 @@ function StatusLineInner({
687253
687333
  const taskValues = Object.values(tasks2);
687254
687334
  const taskRunningCount = taskValues.filter((task2) => task2.status === "running" || task2.status === "pending").length;
687255
687335
  const defaultStatusLineText = buildDefaultStatusBar({
687256
- version: "1.55.0",
687336
+ version: "1.56.0",
687257
687337
  providerLabel: providerRuntime.providerLabel,
687258
687338
  authMode: providerRuntime.authLabel,
687259
687339
  model: providerRuntime.model ?? renderModelName(mainLoopModel),
@@ -689584,9 +689664,9 @@ function useSwarmBanner() {
689584
689664
  };
689585
689665
  }
689586
689666
  }
689587
- const active2 = getActiveAgentForInput(state2);
689588
- if (active2.type === "named_agent") {
689589
- const task2 = active2.task;
689667
+ const active3 = getActiveAgentForInput(state2);
689668
+ if (active3.type === "named_agent") {
689669
+ const task2 = active3.task;
689590
689670
  let name;
689591
689671
  for (const [n3, id] of state2.agentNameRegistry) {
689592
689672
  if (id === task2.id) {
@@ -699396,7 +699476,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
699396
699476
  } catch {}
699397
699477
  const data = {
699398
699478
  trigger: trigger2,
699399
- version: "1.55.0",
699479
+ version: "1.56.0",
699400
699480
  platform: process.platform,
699401
699481
  transcript,
699402
699482
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -711676,7 +711756,7 @@ function WelcomeV2() {
711676
711756
  dimColor: true,
711677
711757
  children: [
711678
711758
  "v",
711679
- "1.55.0"
711759
+ "1.56.0"
711680
711760
  ]
711681
711761
  }, undefined, true, undefined, this)
711682
711762
  ]
@@ -712936,7 +713016,7 @@ function completeOnboarding() {
712936
713016
  saveGlobalConfig((current) => ({
712937
713017
  ...current,
712938
713018
  hasCompletedOnboarding: true,
712939
- lastOnboardingVersion: "1.55.0"
713019
+ lastOnboardingVersion: "1.56.0"
712940
713020
  }));
712941
713021
  }
712942
713022
  function showDialog(root2, renderer) {
@@ -717980,7 +718060,7 @@ function appendToLog(path24, message) {
717980
718060
  cwd: getFsImplementation().cwd(),
717981
718061
  userType: process.env.USER_TYPE,
717982
718062
  sessionId: getSessionId(),
717983
- version: "1.55.0"
718063
+ version: "1.56.0"
717984
718064
  };
717985
718065
  getLogWriter(path24).write(messageWithTimestamp);
717986
718066
  }
@@ -722139,8 +722219,8 @@ async function getEnvLessBridgeConfig() {
722139
722219
  }
722140
722220
  async function checkEnvLessBridgeMinVersion() {
722141
722221
  const cfg = await getEnvLessBridgeConfig();
722142
- if (cfg.min_version && lt("1.55.0", cfg.min_version)) {
722143
- return `Your version of UR (${"1.55.0"}) is too old for Remote Control.
722222
+ if (cfg.min_version && lt("1.56.0", cfg.min_version)) {
722223
+ return `Your version of UR (${"1.56.0"}) is too old for Remote Control.
722144
722224
  Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
722145
722225
  }
722146
722226
  return null;
@@ -722614,7 +722694,7 @@ async function initBridgeCore(params) {
722614
722694
  const rawApi = createBridgeApiClient({
722615
722695
  baseUrl,
722616
722696
  getAccessToken,
722617
- runnerVersion: "1.55.0",
722697
+ runnerVersion: "1.56.0",
722618
722698
  onDebug: logForDebugging,
722619
722699
  onAuth401,
722620
722700
  getTrustedDeviceToken
@@ -732086,7 +732166,7 @@ function getAgUiCapabilities() {
732086
732166
  name: "UR-Nexus",
732087
732167
  type: "ur-nexus",
732088
732168
  description: "Provider-flexible, local-first autonomous engineering workflow agent.",
732089
- version: "1.55.0",
732169
+ version: "1.56.0",
732090
732170
  provider: "UR",
732091
732171
  documentationUrl: "https://github.com/Maitham16/UR/blob/master/docs/AG_UI.md"
732092
732172
  },
@@ -733226,7 +733306,7 @@ function createMCPServer(cwd4, debug2, verbose) {
733226
733306
  };
733227
733307
  const server2 = new Server({
733228
733308
  name: "ur-nexus",
733229
- version: "1.55.0"
733309
+ version: "1.56.0"
733230
733310
  }, {
733231
733311
  capabilities: {
733232
733312
  tools: {}
@@ -733639,7 +733719,7 @@ function supportsApps(capabilities) {
733639
733719
  function collectMcpHeaderBindings(schema) {
733640
733720
  const bindings = [];
733641
733721
  const seenHeaders = new Set;
733642
- const active2 = new Set;
733722
+ const active3 = new Set;
733643
733723
  let valid = true;
733644
733724
  const resolveLocalRef = (reference) => {
733645
733725
  if (reference === "#")
@@ -733670,9 +733750,9 @@ function collectMcpHeaderBindings(schema) {
733670
733750
  valid = false;
733671
733751
  return;
733672
733752
  }
733673
- if (active2.has(node))
733753
+ if (active3.has(node))
733674
733754
  return;
733675
- active2.add(node);
733755
+ active3.add(node);
733676
733756
  if (typeof node.$ref === "string") {
733677
733757
  const resolved = resolveLocalRef(node.$ref);
733678
733758
  if (node.$ref.startsWith("#") && resolved === undefined) {
@@ -733687,7 +733767,7 @@ function collectMcpHeaderBindings(schema) {
733687
733767
  const normalized = typeof headerName === "string" ? headerName.toLowerCase() : "";
733688
733768
  if (path24.length === 0 || typeof headerName !== "string" || !HTTP_FIELD_NAME.test(headerName) || seenHeaders.has(normalized) || type !== "string" && type !== "integer" && type !== "boolean") {
733689
733769
  valid = false;
733690
- active2.delete(node);
733770
+ active3.delete(node);
733691
733771
  return;
733692
733772
  }
733693
733773
  seenHeaders.add(normalized);
@@ -733705,7 +733785,7 @@ function collectMcpHeaderBindings(schema) {
733705
733785
  visit2(child, path24, depth + 1);
733706
733786
  }
733707
733787
  }
733708
- active2.delete(node);
733788
+ active3.delete(node);
733709
733789
  };
733710
733790
  visit2(schema, []);
733711
733791
  return valid ? bindings : undefined;
@@ -734384,7 +734464,7 @@ function thrownResponse(error40) {
734384
734464
  }
734385
734465
  async function createUrMcp2026Runtime(options4) {
734386
734466
  const server2 = createMCPServer(options4.cwd, options4.debug === true, options4.verbose === true);
734387
- const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.55.0" }, { capabilities: {} });
734467
+ const client2 = new Client({ name: "ur-mcp-2026-adapter", version: "1.56.0" }, { capabilities: {} });
734388
734468
  const [clientTransport, serverTransport] = createLinkedTransportPair();
734389
734469
  try {
734390
734470
  await server2.connect(serverTransport);
@@ -734395,7 +734475,7 @@ async function createUrMcp2026Runtime(options4) {
734395
734475
  }
734396
734476
  const runtime2 = new Mcp2026Runtime({
734397
734477
  cwd: options4.cwd,
734398
- version: "1.55.0",
734478
+ version: "1.56.0",
734399
734479
  backend: {
734400
734480
  listTools: async () => {
734401
734481
  const listed = await client2.listTools();
@@ -735050,8 +735130,8 @@ async function providerListHandler(options4 = {}) {
735050
735130
  }
735051
735131
  async function providerStatusHandler(options4 = {}) {
735052
735132
  const settings = getInitialSettings();
735053
- const active2 = getActiveProviderSettings(settings).active ?? "ollama";
735054
- const result = await doctorProvider(active2, { settings });
735133
+ const active3 = getActiveProviderSettings(settings).active ?? "ollama";
735134
+ const result = await doctorProvider(active3, { settings });
735055
735135
  writeOutput(formatProviderStatus(result, Boolean(options4.json)));
735056
735136
  process.exit(result.ok ? 0 : 1);
735057
735137
  }
@@ -735066,15 +735146,15 @@ async function providerDoctorHandler(providerArg, options4 = {}) {
735066
735146
  provider = resolved;
735067
735147
  }
735068
735148
  const settings = getInitialSettings();
735069
- const active2 = getActiveProviderSettings(settings).active ?? "ollama";
735070
- const result = await doctorProvider(provider ?? active2, { settings });
735149
+ const active3 = getActiveProviderSettings(settings).active ?? "ollama";
735150
+ const result = await doctorProvider(provider ?? active3, { settings });
735071
735151
  writeOutput(formatProviderDoctor(result, Boolean(options4.json)));
735072
735152
  process.exit(result.ok ? 0 : 1);
735073
735153
  }
735074
735154
  async function providerModelsHandler(providerArg, options4 = {}) {
735075
735155
  const settings = getInitialSettings();
735076
- const active2 = getActiveProviderSettings(settings).active ?? "ollama";
735077
- const provider = providerArg ? resolveProviderId(providerArg) : active2;
735156
+ const active3 = getActiveProviderSettings(settings).active ?? "ollama";
735157
+ const provider = providerArg ? resolveProviderId(providerArg) : active3;
735078
735158
  if (!provider) {
735079
735159
  writeError(`Unknown provider "${providerArg}". Run: ur provider list`);
735080
735160
  process.exit(1);
@@ -736528,7 +736608,7 @@ async function update() {
736528
736608
  logEvent("tengu_update_check", {});
736529
736609
  const diagnostic2 = await getDoctorDiagnostic();
736530
736610
  const result = await checkUpgradeStatus({
736531
- currentVersion: "1.55.0",
736611
+ currentVersion: "1.56.0",
736532
736612
  packageName: UR_AGENT_PACKAGE_NAME,
736533
736613
  installationType: diagnostic2.installationType,
736534
736614
  latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
@@ -737844,7 +737924,7 @@ ${customInstructions}` : customInstructions;
737844
737924
  }
737845
737925
  }
737846
737926
  logForDiagnosticsNoPII("info", "started", {
737847
- version: "1.55.0",
737927
+ version: "1.56.0",
737848
737928
  is_native_binary: isInBundledMode()
737849
737929
  });
737850
737930
  registerCleanup(async () => {
@@ -738630,7 +738710,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
738630
738710
  pendingHookMessages
738631
738711
  }, renderAndRun);
738632
738712
  }
738633
- }).version("1.55.0 (UR-Nexus)", "-v, --version", "Output the version number");
738713
+ }).version("1.56.0 (UR-Nexus)", "-v, --version", "Output the version number");
738634
738714
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
738635
738715
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
738636
738716
  if (canUserConfigureAdvisor()) {
@@ -739665,7 +739745,7 @@ if (false) {}
739665
739745
  async function main2() {
739666
739746
  const args = process.argv.slice(2);
739667
739747
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
739668
- console.log(`${"1.55.0"} (UR-Nexus)`);
739748
+ console.log(`${"1.56.0"} (UR-Nexus)`);
739669
739749
  return;
739670
739750
  }
739671
739751
  if (args[0] === "a2a" && args[1] === "serve" && !args.includes("--help") && !args.includes("-h")) {
@@ -45,7 +45,7 @@
45
45
  <main id="content" class="content">
46
46
  <header class="topbar">
47
47
  <div>
48
- <p class="eyebrow">Version 1.55.0</p>
48
+ <p class="eyebrow">Version 1.56.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.55.0"
10
+ version = "1.56.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.55.0",
5
+ "version": "1.56.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.55.0",
3
+ "version": "1.56.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",