ur-agent 1.35.0 → 1.35.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/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.35.1
4
+
5
+ - Polished the bundled VS Code inline-diffs view with native toolbar icons,
6
+ useful empty-state rows, clearer diff labels, and a cleaner review webview.
7
+ - Fixed `ur ide status` routing so the IDE extension status action reports
8
+ provider/model/plugin status instead of printing inline-diff usage.
9
+ - Kept model/provider selections project-local by default and made transient
10
+ Ollama gateway timeouts retry cleanly.
11
+
3
12
  ## 1.35.0
4
13
 
5
14
  - New `ur connect` CLI command (same implementation as the `/connect` slash
package/dist/cli.js CHANGED
@@ -51815,7 +51815,7 @@ function normalizeBaseUrl(value) {
51815
51815
  }
51816
51816
  return withScheme.replace(/\/$/, "");
51817
51817
  }
51818
- function setSafeProviderConfig(key, value) {
51818
+ function setSafeProviderConfig(key, value, options = {}) {
51819
51819
  const trimmed = value.trim();
51820
51820
  if (!trimmed) {
51821
51821
  return { ok: false, message: `Missing value for ${key}.` };
@@ -51907,7 +51907,8 @@ function setSafeProviderConfig(key, value) {
51907
51907
  message: error40 instanceof Error ? error40.message : String(error40)
51908
51908
  };
51909
51909
  }
51910
- const result = updateSettingsForSource("userSettings", settings);
51910
+ const source = options.source ?? "localSettings";
51911
+ const result = updateSettingsForSource(source, settings);
51911
51912
  if (result.error) {
51912
51913
  return {
51913
51914
  ok: false,
@@ -52801,7 +52802,8 @@ function setProviderModel(providerId, modelId, options = {}) {
52801
52802
  message: validation.error
52802
52803
  };
52803
52804
  }
52804
- const result = updateSettingsForSource("userSettings", {
52805
+ const source = options.source ?? "localSettings";
52806
+ const result = updateSettingsForSource(source, {
52805
52807
  provider: {
52806
52808
  active: provider,
52807
52809
  model: modelId
@@ -55184,7 +55186,7 @@ async function fetchOllamaChat(params, stream4, controller, options) {
55184
55186
  });
55185
55187
  if (!response.ok) {
55186
55188
  const body = await response.text().catch(() => "");
55187
- throw new Error(`Ollama request failed (${response.status}): ${body || response.statusText}`);
55189
+ throw createOllamaHTTPError(response.status, body, response.statusText);
55188
55190
  }
55189
55191
  return response;
55190
55192
  } catch (error40) {
@@ -55194,6 +55196,9 @@ async function fetchOllamaChat(params, stream4, controller, options) {
55194
55196
  }
55195
55197
  throw new APIConnectionTimeoutError({ message: "Ollama request timed out" });
55196
55198
  }
55199
+ if (error40 instanceof APIConnectionError || error40 instanceof APIConnectionTimeoutError || error40 instanceof APIUserAbortError) {
55200
+ throw error40;
55201
+ }
55197
55202
  if (error40 instanceof Error) {
55198
55203
  throw new APIConnectionError({ message: error40.message, cause: error40 });
55199
55204
  }
@@ -55204,6 +55209,34 @@ async function fetchOllamaChat(params, stream4, controller, options) {
55204
55209
  }
55205
55210
  }
55206
55211
  }
55212
+ function createOllamaHTTPError(status, body, statusText) {
55213
+ const rawMessage = extractOllamaHTTPErrorMessage(body) || statusText;
55214
+ if (isOllamaGatewayTimeout(status, rawMessage)) {
55215
+ return new APIConnectionTimeoutError({
55216
+ message: OLLAMA_GATEWAY_TIMEOUT_MESSAGE,
55217
+ cause: new Error(`Ollama request failed (${status}): ${rawMessage}`)
55218
+ });
55219
+ }
55220
+ return new Error(`Ollama request failed (${status}): ${rawMessage}`);
55221
+ }
55222
+ function extractOllamaHTTPErrorMessage(body) {
55223
+ if (!body.trim()) {
55224
+ return "";
55225
+ }
55226
+ try {
55227
+ const parsed = JSON.parse(body);
55228
+ if (typeof parsed.error === "string") {
55229
+ return parsed.error;
55230
+ }
55231
+ } catch {}
55232
+ return body;
55233
+ }
55234
+ function isOllamaGatewayTimeout(status, message) {
55235
+ if (status !== 502 && status !== 504) {
55236
+ return false;
55237
+ }
55238
+ return /operation timed out|read:.*timed out|timeout|deadline exceeded/i.test(message);
55239
+ }
55207
55240
  function createLinkedAbortController(options) {
55208
55241
  const controller = new AbortController;
55209
55242
  const signal = options?.signal;
@@ -55999,7 +56032,7 @@ function parseToolInput(input) {
55999
56032
  return {};
56000
56033
  }
56001
56034
  }
56002
- var DEFAULT_OLLAMA_REQUEST_TIMEOUT_MS = 300000, REMOTE_OLLAMA_REQUEST_TIMEOUT_MS = 120000, ollamaModelCapabilitiesCache, ollamaBaseUrlOverride;
56035
+ var DEFAULT_OLLAMA_REQUEST_TIMEOUT_MS = 300000, REMOTE_OLLAMA_REQUEST_TIMEOUT_MS = 120000, OLLAMA_GATEWAY_TIMEOUT_MESSAGE = "Ollama gateway timed out while waiting for the model to respond. Check the selected Ollama endpoint or increase API_TIMEOUT_MS if the model needs more time.", ollamaModelCapabilitiesCache, ollamaBaseUrlOverride;
56003
56036
  var init_ollama = __esm(() => {
56004
56037
  init_urhq_sdk();
56005
56038
  init_ollamaModels();
@@ -69472,7 +69505,7 @@ var init_auth = __esm(() => {
69472
69505
 
69473
69506
  // src/utils/userAgent.ts
69474
69507
  function getURCodeUserAgent() {
69475
- return `ur/${"1.35.0"}`;
69508
+ return `ur/${"1.35.1"}`;
69476
69509
  }
69477
69510
 
69478
69511
  // src/utils/workloadContext.ts
@@ -69494,7 +69527,7 @@ function getUserAgent() {
69494
69527
  const clientApp = process.env.UR_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}` : "";
69495
69528
  const workload = getWorkload();
69496
69529
  const workloadSuffix = workload ? `, workload/${workload}` : "";
69497
- return `ur-cli/${"1.35.0"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
69530
+ return `ur-cli/${"1.35.1"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
69498
69531
  }
69499
69532
  function getMCPUserAgent() {
69500
69533
  const parts = [];
@@ -69508,7 +69541,7 @@ function getMCPUserAgent() {
69508
69541
  parts.push(`client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}`);
69509
69542
  }
69510
69543
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
69511
- return `ur/${"1.35.0"}${suffix}`;
69544
+ return `ur/${"1.35.1"}${suffix}`;
69512
69545
  }
69513
69546
  function getWebFetchUserAgent() {
69514
69547
  return `UR-User (${getURCodeUserAgent()})`;
@@ -69646,7 +69679,7 @@ var init_user = __esm(() => {
69646
69679
  deviceId,
69647
69680
  sessionId: getSessionId(),
69648
69681
  email: getEmail(),
69649
- appVersion: "1.35.0",
69682
+ appVersion: "1.35.1",
69650
69683
  platform: getHostPlatformForAnalytics(),
69651
69684
  organizationUuid,
69652
69685
  accountUuid,
@@ -76163,7 +76196,7 @@ var init_metadata = __esm(() => {
76163
76196
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
76164
76197
  WHITESPACE_REGEX = /\s+/;
76165
76198
  getVersionBase = memoize_default(() => {
76166
- const match = "1.35.0".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
76199
+ const match = "1.35.1".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
76167
76200
  return match ? match[0] : undefined;
76168
76201
  });
76169
76202
  buildEnvContext = memoize_default(async () => {
@@ -76203,7 +76236,7 @@ var init_metadata = __esm(() => {
76203
76236
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
76204
76237
  isURCodeAction: isEnvTruthy(process.env.UR_CODE_ACTION),
76205
76238
  isURAiAuth: isURAISubscriber2(),
76206
- version: "1.35.0",
76239
+ version: "1.35.1",
76207
76240
  versionBase: getVersionBase(),
76208
76241
  buildTime: "",
76209
76242
  deploymentEnvironment: env2.detectDeploymentEnvironment(),
@@ -76873,7 +76906,7 @@ function initialize1PEventLogging() {
76873
76906
  const platform2 = getPlatform();
76874
76907
  const attributes = {
76875
76908
  [import_semantic_conventions4.ATTR_SERVICE_NAME]: "ur",
76876
- [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.35.0"
76909
+ [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.35.1"
76877
76910
  };
76878
76911
  if (platform2 === "wsl") {
76879
76912
  const wslVersion = getWslVersion();
@@ -76900,7 +76933,7 @@ function initialize1PEventLogging() {
76900
76933
  })
76901
76934
  ]
76902
76935
  });
76903
- firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.35.0");
76936
+ firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.35.1");
76904
76937
  }
76905
76938
  async function reinitialize1PEventLoggingIfConfigChanged() {
76906
76939
  if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
@@ -80616,7 +80649,7 @@ function getOllamaBaseUrl(env4 = process.env, settings) {
80616
80649
  if (envHost) {
80617
80650
  return normalizeOllamaBaseUrl(envHost);
80618
80651
  }
80619
- const settingsHost = settings === undefined ? getSettingsForSource("userSettings")?.ollama?.host : settings.ollama?.host;
80652
+ const settingsHost = settings === undefined ? getInitialSettings().ollama?.host : settings.ollama?.host;
80620
80653
  if (settingsHost) {
80621
80654
  return normalizeOllamaBaseUrl(settingsHost);
80622
80655
  }
@@ -82197,7 +82230,7 @@ function formatAgentTrendReport(report = buildAgentTrendReport()) {
82197
82230
  function formatA2AAgentCard(options = {}, pretty = true) {
82198
82231
  return JSON.stringify(buildA2AAgentCard(options), null, pretty ? 2 : 0);
82199
82232
  }
82200
- var urVersion = "1.35.0", coverage, priorityRoadmap;
82233
+ var urVersion = "1.35.1", coverage, priorityRoadmap;
82201
82234
  var init_trends = __esm(() => {
82202
82235
  coverage = [
82203
82236
  {
@@ -84190,7 +84223,7 @@ function getAttributionHeader(fingerprint) {
84190
84223
  if (!isAttributionHeaderEnabled()) {
84191
84224
  return "";
84192
84225
  }
84193
- const version2 = `${"1.35.0"}.${fingerprint}`;
84226
+ const version2 = `${"1.35.1"}.${fingerprint}`;
84194
84227
  const entrypoint = process.env.UR_CODE_ENTRYPOINT ?? "unknown";
84195
84228
  const cch = "";
84196
84229
  const workload = getWorkload();
@@ -139616,7 +139649,7 @@ async function* withRetry(getClient, operation, options2) {
139616
139649
  throw new CannotRetryError(error40, retryContext);
139617
139650
  }
139618
139651
  const handledCloudAuthError = handleAwsCredentialError(error40) || handleGcpCredentialError(error40);
139619
- if (!handledCloudAuthError && (!(error40 instanceof APIError) || !shouldRetry(error40))) {
139652
+ if (!handledCloudAuthError && !((error40 instanceof APIError || error40 instanceof APIConnectionError) && shouldRetry(error40))) {
139620
139653
  throw new CannotRetryError(error40, retryContext);
139621
139654
  }
139622
139655
  if (error40 instanceof APIError) {
@@ -191844,7 +191877,7 @@ function getTelemetryAttributes() {
191844
191877
  attributes["session.id"] = sessionId;
191845
191878
  }
191846
191879
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
191847
- attributes["app.version"] = "1.35.0";
191880
+ attributes["app.version"] = "1.35.1";
191848
191881
  }
191849
191882
  const oauthAccount = getOauthAccountInfo();
191850
191883
  if (oauthAccount) {
@@ -227229,7 +227262,7 @@ function getInstallationEnv() {
227229
227262
  return;
227230
227263
  }
227231
227264
  function getURCodeVersion() {
227232
- return "1.35.0";
227265
+ return "1.35.1";
227233
227266
  }
227234
227267
  async function getInstalledVSCodeExtensionVersion(command) {
227235
227268
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -230068,7 +230101,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
230068
230101
  const client2 = new Client({
230069
230102
  name: "ur",
230070
230103
  title: "UR",
230071
- version: "1.35.0",
230104
+ version: "1.35.1",
230072
230105
  description: "UR-AGENT autonomous engineering workflow engine",
230073
230106
  websiteUrl: PRODUCT_URL
230074
230107
  }, {
@@ -230422,7 +230455,7 @@ var init_client5 = __esm(() => {
230422
230455
  const client2 = new Client({
230423
230456
  name: "ur",
230424
230457
  title: "UR",
230425
- version: "1.35.0",
230458
+ version: "1.35.1",
230426
230459
  description: "UR-AGENT autonomous engineering workflow engine",
230427
230460
  websiteUrl: PRODUCT_URL
230428
230461
  }, {
@@ -240236,9 +240269,9 @@ async function assertMinVersion() {
240236
240269
  if (false) {}
240237
240270
  try {
240238
240271
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
240239
- if (versionConfig.minVersion && lt("1.35.0", versionConfig.minVersion)) {
240272
+ if (versionConfig.minVersion && lt("1.35.1", versionConfig.minVersion)) {
240240
240273
  console.error(`
240241
- It looks like your version of UR (${"1.35.0"}) needs an update.
240274
+ It looks like your version of UR (${"1.35.1"}) needs an update.
240242
240275
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
240243
240276
 
240244
240277
  To update, please run:
@@ -240454,7 +240487,7 @@ async function installGlobalPackage(specificVersion) {
240454
240487
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
240455
240488
  logEvent("tengu_auto_updater_lock_contention", {
240456
240489
  pid: process.pid,
240457
- currentVersion: "1.35.0"
240490
+ currentVersion: "1.35.1"
240458
240491
  });
240459
240492
  return "in_progress";
240460
240493
  }
@@ -240463,7 +240496,7 @@ async function installGlobalPackage(specificVersion) {
240463
240496
  if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
240464
240497
  logError2(new Error("Windows NPM detected in WSL environment"));
240465
240498
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
240466
- currentVersion: "1.35.0"
240499
+ currentVersion: "1.35.1"
240467
240500
  });
240468
240501
  console.error(`
240469
240502
  Error: Windows NPM detected in WSL
@@ -240998,7 +241031,7 @@ function detectLinuxGlobPatternWarnings() {
240998
241031
  }
240999
241032
  async function getDoctorDiagnostic() {
241000
241033
  const installationType = await getCurrentInstallationType();
241001
- const version2 = typeof MACRO !== "undefined" ? "1.35.0" : "unknown";
241034
+ const version2 = typeof MACRO !== "undefined" ? "1.35.1" : "unknown";
241002
241035
  const installationPath = await getInstallationPath();
241003
241036
  const invokedBinary = getInvokedBinary();
241004
241037
  const multipleInstallations = await detectMultipleInstallations();
@@ -241933,8 +241966,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
241933
241966
  const maxVersion = await getMaxVersion();
241934
241967
  if (maxVersion && gt(version2, maxVersion)) {
241935
241968
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
241936
- if (gte("1.35.0", maxVersion)) {
241937
- logForDebugging(`Native installer: current version ${"1.35.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
241969
+ if (gte("1.35.1", maxVersion)) {
241970
+ logForDebugging(`Native installer: current version ${"1.35.1"} is already at or above maxVersion ${maxVersion}, skipping update`);
241938
241971
  logEvent("tengu_native_update_skipped_max_version", {
241939
241972
  latency_ms: Date.now() - startTime,
241940
241973
  max_version: maxVersion,
@@ -241945,7 +241978,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
241945
241978
  version2 = maxVersion;
241946
241979
  }
241947
241980
  }
241948
- if (!forceReinstall && version2 === "1.35.0" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
241981
+ if (!forceReinstall && version2 === "1.35.1" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
241949
241982
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
241950
241983
  logEvent("tengu_native_update_complete", {
241951
241984
  latency_ms: Date.now() - startTime,
@@ -338849,7 +338882,7 @@ function Feedback({
338849
338882
  platform: env2.platform,
338850
338883
  gitRepo: envInfo.isGit,
338851
338884
  terminal: env2.terminal,
338852
- version: "1.35.0",
338885
+ version: "1.35.1",
338853
338886
  transcript: normalizeMessagesForAPI(messages),
338854
338887
  errors: sanitizedErrors,
338855
338888
  lastApiRequest: getLastAPIRequest(),
@@ -339041,7 +339074,7 @@ function Feedback({
339041
339074
  ", ",
339042
339075
  env2.terminal,
339043
339076
  ", v",
339044
- "1.35.0"
339077
+ "1.35.1"
339045
339078
  ]
339046
339079
  }, undefined, true, undefined, this)
339047
339080
  ]
@@ -339147,7 +339180,7 @@ ${sanitizedDescription}
339147
339180
  ` + `**Environment Info**
339148
339181
  ` + `- Platform: ${env2.platform}
339149
339182
  ` + `- Terminal: ${env2.terminal}
339150
- ` + `- Version: ${"1.35.0"}
339183
+ ` + `- Version: ${"1.35.1"}
339151
339184
  ` + `- Feedback ID: ${feedbackId}
339152
339185
  ` + `
339153
339186
  **Errors**
@@ -342258,7 +342291,7 @@ function buildPrimarySection() {
342258
342291
  }, undefined, false, undefined, this);
342259
342292
  return [{
342260
342293
  label: "Version",
342261
- value: "1.35.0"
342294
+ value: "1.35.1"
342262
342295
  }, {
342263
342296
  label: "Session name",
342264
342297
  value: nameValue
@@ -343074,11 +343107,12 @@ function ModelPicker({
343074
343107
  const [thinkingEnabled, setThinkingEnabled] = import_react101.useState(() => appThinkingEnabled ?? shouldEnableThinkingByDefault());
343075
343108
  const [providerModelOptions, setProviderModelOptions] = import_react101.useState([]);
343076
343109
  const [pickerError, setPickerError] = import_react101.useState(null);
343077
- const currentProvider = getActiveProviderSettings(getSettingsForSource("userSettings") ?? {}).active ?? "ollama";
343110
+ const effectiveSettings = getInitialSettings();
343111
+ const currentProvider = getActiveProviderSettings(effectiveSettings).active ?? "ollama";
343078
343112
  import_react101.useEffect(() => {
343079
343113
  const controller = new AbortController;
343080
343114
  listModelsForProviderWithSource(currentProvider, {
343081
- settings: getSettingsForSource("userSettings") ?? undefined,
343115
+ settings: effectiveSettings,
343082
343116
  signal: controller.signal
343083
343117
  }).then((result) => {
343084
343118
  if (controller.signal.aborted)
@@ -343096,7 +343130,7 @@ function ModelPicker({
343096
343130
  setPickerError(error40 instanceof Error ? error40.message : String(error40));
343097
343131
  });
343098
343132
  return () => controller.abort();
343099
- }, [currentProvider]);
343133
+ }, [currentProvider, effectiveSettings]);
343100
343134
  const modelOptions = providerModelOptions;
343101
343135
  const optionsWithInitial = initial !== null && validateProviderModelPair(currentProvider, initial, {
343102
343136
  availableModels: modelOptions.map((option) => option.value)
@@ -345558,7 +345592,7 @@ function Config({
345558
345592
  }
345559
345593
  }, undefined, false, undefined, this)
345560
345594
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime177.jsxDEV(ChannelDowngradeDialog, {
345561
- currentVersion: "1.35.0",
345595
+ currentVersion: "1.35.1",
345562
345596
  onChoice: (choice) => {
345563
345597
  setShowSubmenu(null);
345564
345598
  setTabsHidden(false);
@@ -345570,7 +345604,7 @@ function Config({
345570
345604
  autoUpdatesChannel: "stable"
345571
345605
  };
345572
345606
  if (choice === "stay") {
345573
- newSettings.minimumVersion = "1.35.0";
345607
+ newSettings.minimumVersion = "1.35.1";
345574
345608
  }
345575
345609
  updateSettingsForSource("userSettings", newSettings);
345576
345610
  setSettingsData((prev_27) => ({
@@ -353640,7 +353674,7 @@ function HelpV2(t0) {
353640
353674
  let t6;
353641
353675
  if ($3[31] !== tabs) {
353642
353676
  t6 = /* @__PURE__ */ jsx_dev_runtime204.jsxDEV(Tabs, {
353643
- title: `UR v${"1.35.0"}`,
353677
+ title: `UR v${"1.35.1"}`,
353644
353678
  color: "professionalBlue",
353645
353679
  defaultTab: "general",
353646
353680
  children: tabs
@@ -354386,7 +354420,7 @@ function buildToolUseContext(tools, readFileStateCache) {
354386
354420
  async function handleInitialize(options2) {
354387
354421
  return {
354388
354422
  name: "ur-agent",
354389
- version: "1.35.0",
354423
+ version: "1.35.1",
354390
354424
  protocolVersion: "0.1.0",
354391
354425
  workspaceRoot: options2.cwd,
354392
354426
  capabilities: {
@@ -374510,7 +374544,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
374510
374544
  return [];
374511
374545
  }
374512
374546
  }
374513
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.35.0") {
374547
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.35.1") {
374514
374548
  if (process.env.USER_TYPE === "ant") {
374515
374549
  const changelog = "";
374516
374550
  if (changelog) {
@@ -374537,7 +374571,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.35.0")
374537
374571
  releaseNotes
374538
374572
  };
374539
374573
  }
374540
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.35.0") {
374574
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.35.1") {
374541
374575
  if (process.env.USER_TYPE === "ant") {
374542
374576
  const changelog = "";
374543
374577
  if (changelog) {
@@ -375707,7 +375741,7 @@ function getRecentActivitySync() {
375707
375741
  return cachedActivity;
375708
375742
  }
375709
375743
  function getLogoDisplayData() {
375710
- const version2 = process.env.DEMO_VERSION ?? "1.35.0";
375744
+ const version2 = process.env.DEMO_VERSION ?? "1.35.1";
375711
375745
  const serverUrl = getDirectConnectServerUrl();
375712
375746
  const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd2());
375713
375747
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -376496,7 +376530,7 @@ function LogoV2() {
376496
376530
  if ($3[2] === Symbol.for("react.memo_cache_sentinel")) {
376497
376531
  t2 = () => {
376498
376532
  const currentConfig = getGlobalConfig();
376499
- if (currentConfig.lastReleaseNotesSeen === "1.35.0") {
376533
+ if (currentConfig.lastReleaseNotesSeen === "1.35.1") {
376500
376534
  return;
376501
376535
  }
376502
376536
  saveGlobalConfig(_temp326);
@@ -377181,12 +377215,12 @@ function LogoV2() {
377181
377215
  return t41;
377182
377216
  }
377183
377217
  function _temp326(current) {
377184
- if (current.lastReleaseNotesSeen === "1.35.0") {
377218
+ if (current.lastReleaseNotesSeen === "1.35.1") {
377185
377219
  return current;
377186
377220
  }
377187
377221
  return {
377188
377222
  ...current,
377189
- lastReleaseNotesSeen: "1.35.0"
377223
+ lastReleaseNotesSeen: "1.35.1"
377190
377224
  };
377191
377225
  }
377192
377226
  function _temp243(s_0) {
@@ -407547,7 +407581,7 @@ var init_code_index2 = __esm(() => {
407547
407581
 
407548
407582
  // node_modules/typescript/lib/typescript.js
407549
407583
  var require_typescript2 = __commonJS((exports, module) => {
407550
- var __dirname = "/sessions/practical-upbeat-bohr/mnt/UR-1.19.0/node_modules/typescript/lib", __filename = "/sessions/practical-upbeat-bohr/mnt/UR-1.19.0/node_modules/typescript/lib/typescript.js";
407584
+ var __dirname = "/Users/maith/Desktop/ur3-dev/UR-1.19.0/node_modules/typescript/lib", __filename = "/Users/maith/Desktop/ur3-dev/UR-1.19.0/node_modules/typescript/lib/typescript.js";
407551
407585
  /*! *****************************************************************************
407552
407586
  Copyright (c) Microsoft Corporation. All rights reserved.
407553
407587
  Licensed under the Apache License, Version 2.0 (the "License"); you may not use
@@ -593081,7 +593115,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
593081
593115
  smapsRollup,
593082
593116
  platform: process.platform,
593083
593117
  nodeVersion: process.version,
593084
- ccVersion: "1.35.0"
593118
+ ccVersion: "1.35.1"
593085
593119
  };
593086
593120
  }
593087
593121
  async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
@@ -593667,7 +593701,7 @@ var init_bridge_kick = __esm(() => {
593667
593701
  var call137 = async () => {
593668
593702
  return {
593669
593703
  type: "text",
593670
- value: "1.35.0"
593704
+ value: "1.35.1"
593671
593705
  };
593672
593706
  }, version2, version_default;
593673
593707
  var init_version = __esm(() => {
@@ -597519,7 +597553,7 @@ function ProviderPicker({
597519
597553
  if (!result.ok) {
597520
597554
  return;
597521
597555
  }
597522
- const saved = getActiveProviderSettings(getSettingsForSource("userSettings") ?? {});
597556
+ const saved = getActiveProviderSettings(getInitialSettings());
597523
597557
  setAppState((prev) => ({
597524
597558
  ...prev,
597525
597559
  provider: {
@@ -603737,7 +603771,7 @@ function generateHtmlReport(data, insights) {
603737
603771
  </html>`;
603738
603772
  }
603739
603773
  function buildExportData(data, insights, facets, remoteStats) {
603740
- const version3 = typeof MACRO !== "undefined" ? "1.35.0" : "unknown";
603774
+ const version3 = typeof MACRO !== "undefined" ? "1.35.1" : "unknown";
603741
603775
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
603742
603776
  const facets_summary = {
603743
603777
  total: facets.size,
@@ -608017,7 +608051,7 @@ var init_sessionStorage = __esm(() => {
608017
608051
  init_settings2();
608018
608052
  init_slowOperations();
608019
608053
  init_uuid();
608020
- VERSION5 = typeof MACRO !== "undefined" ? "1.35.0" : "unknown";
608054
+ VERSION5 = typeof MACRO !== "undefined" ? "1.35.1" : "unknown";
608021
608055
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
608022
608056
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
608023
608057
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -609222,7 +609256,7 @@ var init_filesystem = __esm(() => {
609222
609256
  });
609223
609257
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
609224
609258
  const nonce = randomBytes18(16).toString("hex");
609225
- return join200(getURTempDir(), "bundled-skills", "1.35.0", nonce);
609259
+ return join200(getURTempDir(), "bundled-skills", "1.35.1", nonce);
609226
609260
  });
609227
609261
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
609228
609262
  });
@@ -615511,7 +615545,7 @@ function computeFingerprint(messageText2, version3) {
615511
615545
  }
615512
615546
  function computeFingerprintFromMessages(messages) {
615513
615547
  const firstMessageText = extractFirstMessageText(messages);
615514
- return computeFingerprint(firstMessageText, "1.35.0");
615548
+ return computeFingerprint(firstMessageText, "1.35.1");
615515
615549
  }
615516
615550
  var FINGERPRINT_SALT = "59cf53e54c78";
615517
615551
  var init_fingerprint = () => {};
@@ -617378,7 +617412,7 @@ async function sideQuery(opts) {
617378
617412
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
617379
617413
  }
617380
617414
  const messageText2 = extractFirstUserMessageText(messages);
617381
- const fingerprint = computeFingerprint(messageText2, "1.35.0");
617415
+ const fingerprint = computeFingerprint(messageText2, "1.35.1");
617382
617416
  const attributionHeader = getAttributionHeader(fingerprint);
617383
617417
  const systemBlocks = [
617384
617418
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -621276,11 +621310,11 @@ function onChangeAppState({
621276
621310
  notifyPermissionModeChanged(newMode);
621277
621311
  }
621278
621312
  if (newState.mainLoopModel !== oldState.mainLoopModel && newState.mainLoopModel === null) {
621279
- updateSettingsForSource("userSettings", { model: undefined });
621313
+ updateSettingsForSource("localSettings", { model: undefined });
621280
621314
  setMainLoopModelOverride(null);
621281
621315
  }
621282
621316
  if (newState.mainLoopModel !== oldState.mainLoopModel && newState.mainLoopModel !== null) {
621283
- updateSettingsForSource("userSettings", { model: newState.mainLoopModel });
621317
+ updateSettingsForSource("localSettings", { model: newState.mainLoopModel });
621284
621318
  setMainLoopModelOverride(newState.mainLoopModel);
621285
621319
  }
621286
621320
  if (newState.expandedView !== oldState.expandedView) {
@@ -622115,7 +622149,7 @@ function buildSystemInitMessage(inputs) {
622115
622149
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
622116
622150
  apiKeySource: getURHQApiKeyWithSource().source,
622117
622151
  betas: getSdkBetas(),
622118
- ur_version: "1.35.0",
622152
+ ur_version: "1.35.1",
622119
622153
  output_style: outputStyle2,
622120
622154
  agents: inputs.agents.map((agent) => agent.agentType),
622121
622155
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
@@ -636743,7 +636777,7 @@ var init_useVoiceEnabled = __esm(() => {
636743
636777
  function getSemverPart(version3) {
636744
636778
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
636745
636779
  }
636746
- function useUpdateNotification(updatedVersion, initialVersion = "1.35.0") {
636780
+ function useUpdateNotification(updatedVersion, initialVersion = "1.35.1") {
636747
636781
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react226.useState(() => getSemverPart(initialVersion));
636748
636782
  if (!updatedVersion) {
636749
636783
  return null;
@@ -636792,7 +636826,7 @@ function AutoUpdater({
636792
636826
  return;
636793
636827
  }
636794
636828
  if (false) {}
636795
- const currentVersion = "1.35.0";
636829
+ const currentVersion = "1.35.1";
636796
636830
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
636797
636831
  let latestVersion = await getLatestVersion(channel);
636798
636832
  const isDisabled = isAutoUpdaterDisabled();
@@ -637021,12 +637055,12 @@ function NativeAutoUpdater({
637021
637055
  logEvent("tengu_native_auto_updater_start", {});
637022
637056
  try {
637023
637057
  const maxVersion = await getMaxVersion();
637024
- if (maxVersion && gt("1.35.0", maxVersion)) {
637058
+ if (maxVersion && gt("1.35.1", maxVersion)) {
637025
637059
  const msg = await getMaxVersionMessage();
637026
637060
  setMaxVersionIssue(msg ?? "affects your version");
637027
637061
  }
637028
637062
  const result = await installLatest(channel);
637029
- const currentVersion = "1.35.0";
637063
+ const currentVersion = "1.35.1";
637030
637064
  const latencyMs = Date.now() - startTime;
637031
637065
  if (result.lockFailed) {
637032
637066
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -637163,17 +637197,17 @@ function PackageManagerAutoUpdater(t0) {
637163
637197
  const maxVersion = await getMaxVersion();
637164
637198
  if (maxVersion && latest && gt(latest, maxVersion)) {
637165
637199
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
637166
- if (gte("1.35.0", maxVersion)) {
637167
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.35.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
637200
+ if (gte("1.35.1", maxVersion)) {
637201
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.35.1"} is already at or above maxVersion ${maxVersion}, skipping update`);
637168
637202
  setUpdateAvailable(false);
637169
637203
  return;
637170
637204
  }
637171
637205
  latest = maxVersion;
637172
637206
  }
637173
- const hasUpdate = latest && !gte("1.35.0", latest) && !shouldSkipVersion(latest);
637207
+ const hasUpdate = latest && !gte("1.35.1", latest) && !shouldSkipVersion(latest);
637174
637208
  setUpdateAvailable(!!hasUpdate);
637175
637209
  if (hasUpdate) {
637176
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.35.0"} -> ${latest}`);
637210
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.35.1"} -> ${latest}`);
637177
637211
  }
637178
637212
  };
637179
637213
  $3[0] = t1;
@@ -637207,7 +637241,7 @@ function PackageManagerAutoUpdater(t0) {
637207
637241
  wrap: "truncate",
637208
637242
  children: [
637209
637243
  "currentVersion: ",
637210
- "1.35.0"
637244
+ "1.35.1"
637211
637245
  ]
637212
637246
  }, undefined, true, undefined, this);
637213
637247
  $3[3] = verbose;
@@ -649658,7 +649692,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
649658
649692
  project_dir: getOriginalCwd(),
649659
649693
  added_dirs: addedDirs
649660
649694
  },
649661
- version: "1.35.0",
649695
+ version: "1.35.1",
649662
649696
  output_style: {
649663
649697
  name: outputStyleName
649664
649698
  },
@@ -649741,7 +649775,7 @@ function StatusLineInner({
649741
649775
  const taskValues = Object.values(tasks2);
649742
649776
  const taskRunningCount = taskValues.filter((task2) => task2.status === "running" || task2.status === "pending").length;
649743
649777
  const defaultStatusLineText = buildDefaultStatusBar({
649744
- version: "1.35.0",
649778
+ version: "1.35.1",
649745
649779
  providerLabel: providerRuntime.providerLabel,
649746
649780
  authMode: providerRuntime.authLabel,
649747
649781
  model: providerRuntime.model ?? renderModelName(mainLoopModel),
@@ -661229,7 +661263,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
661229
661263
  } catch {}
661230
661264
  const data = {
661231
661265
  trigger: trigger2,
661232
- version: "1.35.0",
661266
+ version: "1.35.1",
661233
661267
  platform: process.platform,
661234
661268
  transcript,
661235
661269
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -673113,7 +673147,7 @@ function WelcomeV2() {
673113
673147
  dimColor: true,
673114
673148
  children: [
673115
673149
  "v",
673116
- "1.35.0"
673150
+ "1.35.1"
673117
673151
  ]
673118
673152
  }, undefined, true, undefined, this)
673119
673153
  ]
@@ -674373,7 +674407,7 @@ function completeOnboarding() {
674373
674407
  saveGlobalConfig((current) => ({
674374
674408
  ...current,
674375
674409
  hasCompletedOnboarding: true,
674376
- lastOnboardingVersion: "1.35.0"
674410
+ lastOnboardingVersion: "1.35.1"
674377
674411
  }));
674378
674412
  }
674379
674413
  function showDialog(root2, renderer) {
@@ -679410,7 +679444,7 @@ function appendToLog(path24, message) {
679410
679444
  cwd: getFsImplementation().cwd(),
679411
679445
  userType: process.env.USER_TYPE,
679412
679446
  sessionId: getSessionId(),
679413
- version: "1.35.0"
679447
+ version: "1.35.1"
679414
679448
  };
679415
679449
  getLogWriter(path24).write(messageWithTimestamp);
679416
679450
  }
@@ -683504,8 +683538,8 @@ async function getEnvLessBridgeConfig() {
683504
683538
  }
683505
683539
  async function checkEnvLessBridgeMinVersion() {
683506
683540
  const cfg = await getEnvLessBridgeConfig();
683507
- if (cfg.min_version && lt("1.35.0", cfg.min_version)) {
683508
- return `Your version of UR (${"1.35.0"}) is too old for Remote Control.
683541
+ if (cfg.min_version && lt("1.35.1", cfg.min_version)) {
683542
+ return `Your version of UR (${"1.35.1"}) is too old for Remote Control.
683509
683543
  Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
683510
683544
  }
683511
683545
  return null;
@@ -683979,7 +684013,7 @@ async function initBridgeCore(params) {
683979
684013
  const rawApi = createBridgeApiClient({
683980
684014
  baseUrl,
683981
684015
  getAccessToken,
683982
- runnerVersion: "1.35.0",
684016
+ runnerVersion: "1.35.1",
683983
684017
  onDebug: logForDebugging,
683984
684018
  onAuth401,
683985
684019
  getTrustedDeviceToken
@@ -689661,7 +689695,7 @@ async function startMCPServer(cwd3, debug2, verbose) {
689661
689695
  setCwd(cwd3);
689662
689696
  const server2 = new Server({
689663
689697
  name: "ur/tengu",
689664
- version: "1.35.0"
689698
+ version: "1.35.1"
689665
689699
  }, {
689666
689700
  capabilities: {
689667
689701
  tools: {}
@@ -691638,7 +691672,7 @@ async function update() {
691638
691672
  logEvent("tengu_update_check", {});
691639
691673
  const diagnostic = await getDoctorDiagnostic();
691640
691674
  const result = await checkUpgradeStatus({
691641
- currentVersion: "1.35.0",
691675
+ currentVersion: "1.35.1",
691642
691676
  packageName: UR_AGENT_PACKAGE_NAME,
691643
691677
  installationType: diagnostic.installationType,
691644
691678
  latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
@@ -692884,7 +692918,7 @@ ${customInstructions}` : customInstructions;
692884
692918
  }
692885
692919
  }
692886
692920
  logForDiagnosticsNoPII("info", "started", {
692887
- version: "1.35.0",
692921
+ version: "1.35.1",
692888
692922
  is_native_binary: isInBundledMode()
692889
692923
  });
692890
692924
  registerCleanup(async () => {
@@ -693670,7 +693704,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
693670
693704
  pendingHookMessages
693671
693705
  }, renderAndRun);
693672
693706
  }
693673
- }).version("1.35.0 (UR-AGENT)", "-v, --version", "Output the version number");
693707
+ }).version("1.35.1 (UR-AGENT)", "-v, --version", "Output the version number");
693674
693708
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
693675
693709
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
693676
693710
  if (canUserConfigureAdvisor()) {
@@ -694125,13 +694159,21 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
694125
694159
  await runLocalTextCommand(() => Promise.resolve().then(() => (init_repo_edit(), exports_repo_edit)), args);
694126
694160
  });
694127
694161
  program2.command("ide [action] [rest...]").description("Manage IDE integrations and inline diff bundles").option("--title <title>", "Title for captured inline diff bundle").option("--base <ref>", "Capture branch diff from this base ref").option("--staged", "Capture staged changes instead of unstaged changes").option("--feedback <text>", "Comment text for an IDE diff bundle").option("--file <path>", "File path for an inline diff comment").option("--line <line>", "Line number for an inline diff comment").option("--json", "Output as JSON").action(async (action3, rest = [], opts) => {
694128
- const {
694129
- runIdeDiffCommand: runIdeDiffCommand2
694130
- } = await Promise.resolve().then(() => (init_inlineDiffCommand(), exports_inlineDiffCommand));
694131
694162
  if (action3 === "open") {
694132
694163
  console.log("Use `/ide open` inside an interactive UR session, or use `ur ide diff ...` for inline diff bundles.");
694133
694164
  process.exit(0);
694134
694165
  }
694166
+ if (action3 === "status" || action3 === "doctor" || action3 === "config") {
694167
+ const {
694168
+ runIdeInfoCommand: runIdeInfoCommand2
694169
+ } = await Promise.resolve().then(() => (init_ideInfoCommand(), exports_ideInfoCommand));
694170
+ const args2 = [action3, ...rest, opts.json ? "--json" : undefined].filter(Boolean).join(" ");
694171
+ console.log(await runIdeInfoCommand2(args2));
694172
+ process.exit(0);
694173
+ }
694174
+ const {
694175
+ runIdeDiffCommand: runIdeDiffCommand2
694176
+ } = await Promise.resolve().then(() => (init_inlineDiffCommand(), exports_inlineDiffCommand));
694135
694177
  const command8 = action3 === "diff" || action3 === "diffs" ? [action3, ...rest] : ["diff", action3 ?? "list", ...rest];
694136
694178
  const args = [...command8, opts.title ? `--title ${quoteLocalCommandArg(opts.title)}` : undefined, opts.base ? `--base ${quoteLocalCommandArg(opts.base)}` : undefined, opts.staged ? "--staged" : undefined, opts.feedback ? `--feedback ${quoteLocalCommandArg(opts.feedback)}` : undefined, opts.file ? `--file ${quoteLocalCommandArg(opts.file)}` : undefined, opts.line ? `--line ${opts.line}` : undefined, opts.json ? "--json" : undefined].filter(Boolean).join(" ");
694137
694179
  console.log(await runIdeDiffCommand2(args));
@@ -694565,7 +694607,7 @@ if (false) {}
694565
694607
  async function main2() {
694566
694608
  const args = process.argv.slice(2);
694567
694609
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
694568
- console.log(`${"1.35.0"} (UR-AGENT)`);
694610
+ console.log(`${"1.35.1"} (UR-AGENT)`);
694569
694611
  return;
694570
694612
  }
694571
694613
  if (args[0] === "a2a" && args[1] === "serve" && !args.includes("--help") && !args.includes("-h")) {
@@ -18,7 +18,7 @@ You need:
18
18
 
19
19
  ```sh
20
20
  ur --version
21
- # expected: the version from package.json, e.g. "1.35.0 (UR-AGENT)"
21
+ # expected: the version from package.json, e.g. "1.35.1 (UR-AGENT)"
22
22
  ```
23
23
 
24
24
  ## 0.1 Permission safety and context pack (1.19.0)
@@ -44,7 +44,7 @@
44
44
  <main id="content" class="content">
45
45
  <header class="topbar">
46
46
  <div>
47
- <p class="eyebrow">Version 1.35.0</p>
47
+ <p class="eyebrow">Version 1.35.1</p>
48
48
  <h1>UR-AGENT Documentation</h1>
49
49
  <p class="lead">A practical, tutorial-style reference for installing, configuring, automating, extending, and operating UR-AGENT.</p>
50
50
  </div>
@@ -52,13 +52,58 @@ function escapeHtml(text) {
52
52
  .replace(/"/g, '&quot;')
53
53
  }
54
54
 
55
+ function formatCount(count, singular, plural = `${singular}s`) {
56
+ return `${count} ${count === 1 ? singular : plural}`
57
+ }
58
+
59
+ function formatRelativeTime(value) {
60
+ if (!value) return 'unknown time'
61
+ const date = new Date(value)
62
+ if (Number.isNaN(date.getTime())) return String(value)
63
+ const deltaMs = Date.now() - date.getTime()
64
+ const minute = 60 * 1000
65
+ const hour = 60 * minute
66
+ const day = 24 * hour
67
+ if (deltaMs < minute) return 'just now'
68
+ if (deltaMs < hour) return `${Math.max(1, Math.floor(deltaMs / minute))}m ago`
69
+ if (deltaMs < day) return `${Math.floor(deltaMs / hour)}h ago`
70
+ if (deltaMs < 7 * day) return `${Math.floor(deltaMs / day)}d ago`
71
+ return date.toLocaleDateString()
72
+ }
73
+
74
+ function statusIcon(status) {
75
+ switch (status) {
76
+ case 'applied':
77
+ return new vscode.ThemeIcon('check', new vscode.ThemeColor('testing.iconPassed'))
78
+ case 'rejected':
79
+ return new vscode.ThemeIcon('circle-slash', new vscode.ThemeColor('testing.iconFailed'))
80
+ case 'commented':
81
+ return new vscode.ThemeIcon('comment-discussion', new vscode.ThemeColor('charts.yellow'))
82
+ default:
83
+ return new vscode.ThemeIcon('diff', new vscode.ThemeColor('charts.blue'))
84
+ }
85
+ }
86
+
55
87
  class DiffItem extends vscode.TreeItem {
56
88
  constructor(bundle) {
57
- super(`${bundle.id}: ${bundle.title}`, vscode.TreeItemCollapsibleState.None)
89
+ const title = bundle.title || bundle.id
90
+ super(title, vscode.TreeItemCollapsibleState.None)
58
91
  this.bundle = bundle
59
92
  this.contextValue = 'diff'
60
- this.description = `${bundle.status} · ${bundle.files?.length ?? 0} file(s)`
61
- this.tooltip = `${bundle.title}\n${bundle.patchFile}`
93
+ const fileCount = bundle.files?.length ?? 0
94
+ const changedAt = bundle.updatedAt ?? bundle.createdAt
95
+ this.description = `${bundle.status ?? 'captured'} · ${formatCount(fileCount, 'file')} · ${formatRelativeTime(changedAt)}`
96
+ this.iconPath = statusIcon(bundle.status)
97
+ this.tooltip = new vscode.MarkdownString(
98
+ [
99
+ `**${escapeHtml(title)}**`,
100
+ '',
101
+ `- ID: \`${escapeHtml(bundle.id)}\``,
102
+ `- Status: ${escapeHtml(bundle.status ?? 'captured')}`,
103
+ `- Files: ${fileCount}`,
104
+ `- Patch: \`${escapeHtml(bundle.patchFile)}\``,
105
+ ].join('\n'),
106
+ )
62
107
  this.command = {
63
108
  command: 'urInlineDiffs.open',
64
109
  title: 'Open Inline Diff',
@@ -67,6 +112,27 @@ class DiffItem extends vscode.TreeItem {
67
112
  }
68
113
  }
69
114
 
115
+ class ActionItem extends vscode.TreeItem {
116
+ constructor(label, description, icon, command, tooltip) {
117
+ super(label, vscode.TreeItemCollapsibleState.None)
118
+ this.contextValue = 'urAction'
119
+ this.description = description
120
+ this.iconPath = new vscode.ThemeIcon(icon)
121
+ this.tooltip = tooltip ?? `${label}${description ? ` — ${description}` : ''}`
122
+ this.command = command
123
+ }
124
+ }
125
+
126
+ class InfoItem extends vscode.TreeItem {
127
+ constructor(label, description, icon = 'info') {
128
+ super(label, vscode.TreeItemCollapsibleState.None)
129
+ this.contextValue = 'urInfo'
130
+ this.description = description
131
+ this.iconPath = new vscode.ThemeIcon(icon)
132
+ this.tooltip = `${label}${description ? ` — ${description}` : ''}`
133
+ }
134
+ }
135
+
70
136
  class DiffProvider {
71
137
  constructor() {
72
138
  this._onDidChangeTreeData = new vscode.EventEmitter()
@@ -83,12 +149,41 @@ class DiffProvider {
83
149
 
84
150
  getChildren() {
85
151
  const root = workspaceRoot()
86
- if (!root) return []
87
- return loadManifest(root)
152
+ if (!root) {
153
+ return [
154
+ new InfoItem('Open a workspace folder', 'UR inline diffs are scoped to the active project', 'folder-opened'),
155
+ ]
156
+ }
157
+
158
+ const manifest = loadManifest(root)
159
+ const diffs = manifest
88
160
  .diffs
89
161
  .slice()
90
162
  .sort((a, b) => String(b.createdAt).localeCompare(String(a.createdAt)))
91
- .map(bundle => new DiffItem(bundle))
163
+
164
+ if (diffs.length === 0) {
165
+ return [
166
+ new InfoItem(
167
+ 'Ready for inline review',
168
+ fs.existsSync(manifestPath(root)) ? 'No pending diff bundles' : 'No diff bundles captured yet',
169
+ 'pass',
170
+ ),
171
+ new ActionItem(
172
+ 'Show UR status',
173
+ 'Provider, model, plugins',
174
+ 'pulse',
175
+ { command: 'urInlineDiffs.status', title: 'Show UR Status' },
176
+ ),
177
+ new ActionItem(
178
+ 'Refresh',
179
+ path.relative(root, manifestPath(root)),
180
+ 'refresh',
181
+ { command: 'urInlineDiffs.refresh', title: 'Refresh Inline Diffs' },
182
+ ),
183
+ ]
184
+ }
185
+
186
+ return diffs.map(bundle => new DiffItem(bundle))
92
187
  }
93
188
  }
94
189
 
@@ -103,18 +198,29 @@ function renderDiffHtml(root, bundle) {
103
198
  <meta charset="utf-8">
104
199
  <meta name="viewport" content="width=device-width, initial-scale=1">
105
200
  <style>
106
- body { font: 13px/1.45 var(--vscode-editor-font-family); color: var(--vscode-editor-foreground); padding: 16px; }
107
- h1 { font-size: 18px; margin: 0 0 4px; }
108
- .meta { color: var(--vscode-descriptionForeground); margin-bottom: 14px; }
109
- pre { background: var(--vscode-editor-background); border: 1px solid var(--vscode-panel-border); padding: 12px; overflow: auto; }
201
+ :root { color-scheme: light dark; }
202
+ body { font: 13px/1.5 var(--vscode-font-family); color: var(--vscode-foreground); padding: 20px; margin: 0; }
203
+ header { border-bottom: 1px solid var(--vscode-panel-border); padding-bottom: 14px; margin-bottom: 16px; }
204
+ h1 { font-size: 20px; font-weight: 600; margin: 0 0 6px; }
205
+ h2 { font-size: 14px; margin: 20px 0 10px; }
206
+ .meta, .where { color: var(--vscode-descriptionForeground); }
207
+ .chips { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
208
+ .chip { border: 1px solid var(--vscode-panel-border); border-radius: 4px; padding: 3px 8px; background: var(--vscode-sideBar-background); }
209
+ pre { background: var(--vscode-editor-background); border: 1px solid var(--vscode-panel-border); border-radius: 6px; padding: 14px; overflow: auto; font-family: var(--vscode-editor-font-family); }
110
210
  .comments { margin-top: 18px; }
111
- .comment { border-top: 1px solid var(--vscode-panel-border); padding: 8px 0; }
112
- .where { color: var(--vscode-descriptionForeground); }
211
+ .comment { border: 1px solid var(--vscode-panel-border); border-radius: 6px; padding: 10px 12px; margin-bottom: 10px; background: var(--vscode-sideBar-background); }
113
212
  </style>
114
213
  </head>
115
214
  <body>
116
- <h1>${escapeHtml(bundle.title)}</h1>
117
- <div class="meta">${escapeHtml(bundle.id)} · ${escapeHtml(bundle.status)} · ${escapeHtml(bundle.files?.length ?? 0)} file(s)</div>
215
+ <header>
216
+ <h1>${escapeHtml(bundle.title)}</h1>
217
+ <div class="meta">${escapeHtml(bundle.id)} · ${escapeHtml(formatRelativeTime(bundle.updatedAt ?? bundle.createdAt))}</div>
218
+ <div class="chips">
219
+ <span class="chip">${escapeHtml(bundle.status ?? 'captured')}</span>
220
+ <span class="chip">${escapeHtml(formatCount(bundle.files?.length ?? 0, 'file'))}</span>
221
+ <span class="chip">${escapeHtml(formatCount(comments.length, 'comment'))}</span>
222
+ </div>
223
+ </header>
118
224
  <pre>${escapeHtml(patch)}</pre>
119
225
  <section class="comments">
120
226
  <h2>Comments</h2>
@@ -256,9 +362,13 @@ async function showStatus(channel) {
256
362
  function activate(context) {
257
363
  const provider = new DiffProvider()
258
364
  const channel = vscode.window.createOutputChannel('UR')
365
+ const tree = vscode.window.createTreeView('urInlineDiffs', {
366
+ treeDataProvider: provider,
367
+ showCollapseAll: false,
368
+ })
259
369
  context.subscriptions.push(
260
370
  channel,
261
- vscode.window.registerTreeDataProvider('urInlineDiffs', provider),
371
+ tree,
262
372
  vscode.commands.registerCommand('urInlineDiffs.refresh', () => provider.refresh()),
263
373
  vscode.commands.registerCommand('urInlineDiffs.open', item => openDiff(item)),
264
374
  vscode.commands.registerCommand('urInlineDiffs.comment', item => commentDiff(item, provider)),
@@ -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.35.0",
5
+ "version": "1.35.1",
6
6
  "publisher": "ur-agent",
7
7
  "engines": {
8
8
  "vscode": "^1.92.0"
@@ -41,27 +41,39 @@
41
41
  "commands": [
42
42
  {
43
43
  "command": "urInlineDiffs.refresh",
44
- "title": "UR: Refresh Inline Diffs"
44
+ "title": "UR: Refresh Inline Diffs",
45
+ "icon": "$(refresh)"
45
46
  },
46
47
  {
47
48
  "command": "urInlineDiffs.open",
48
- "title": "UR: Open Inline Diff"
49
+ "title": "UR: Open Inline Diff",
50
+ "icon": "$(diff)"
49
51
  },
50
52
  {
51
53
  "command": "urInlineDiffs.comment",
52
- "title": "UR: Comment On Inline Diff"
54
+ "title": "UR: Comment On Inline Diff",
55
+ "icon": "$(comment-discussion)"
53
56
  },
54
57
  {
55
58
  "command": "urInlineDiffs.apply",
56
- "title": "UR: Apply Inline Diff"
59
+ "title": "UR: Apply Inline Diff",
60
+ "icon": "$(check)"
57
61
  },
58
62
  {
59
63
  "command": "urInlineDiffs.reject",
60
- "title": "UR: Reject Inline Diff"
64
+ "title": "UR: Reject Inline Diff",
65
+ "icon": "$(circle-slash)"
61
66
  },
62
67
  {
63
68
  "command": "urInlineDiffs.status",
64
- "title": "UR: Show Status (provider, model, plugins)"
69
+ "title": "UR: Show Status (provider, model, plugins)",
70
+ "icon": "$(pulse)"
71
+ }
72
+ ],
73
+ "viewsWelcome": [
74
+ {
75
+ "view": "urInlineDiffs",
76
+ "contents": "UR inline diffs appear here when a review bundle is captured.\n[Show Status](command:urInlineDiffs.status) [Refresh](command:urInlineDiffs.refresh)"
65
77
  }
66
78
  ],
67
79
  "menus": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ur-agent",
3
- "version": "1.35.0",
3
+ "version": "1.35.1",
4
4
  "description": "UR-AGENT — autonomous engineering workflow engine (plan, execute, test, verify, document, benchmark, reproduce)",
5
5
  "type": "module",
6
6
  "packageManager": "bun@1.3.14",