ur-agent 1.42.0 → 1.43.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,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.43.1
4
+
5
+ - Artifacts page renders diffs VS Code-style: side-by-side/inline views with
6
+ syntax highlighting via diff2html (plain-text fallback when offline). New
7
+ live view `/diff` shows current working-tree changes without manual capture,
8
+ with a one-click "Capture as artifact" button (`POST /api/capture-diff`,
9
+ `GET /api/diff`).
10
+ - Tolerate empty-string parameter names in model tool calls: stripped before
11
+ validation instead of failing with `An unexpected parameter \`\` was
12
+ provided`.
13
+
14
+ ## 1.43.0
15
+
16
+ - Add `ur artifacts serve [--port 4180]`: a local web page for artifacts.
17
+ `GET /artifacts/<id>` renders one artifact (status, summary, feedback,
18
+ content), `/` lists all, with `/artifacts/<id>/raw` and `/api/artifacts[/<id>]`
19
+ endpoints. Bound to 127.0.0.1; stop with `ur artifacts serve --stop`.
20
+
3
21
  ## 1.42.0
4
22
 
5
23
  - Project safety policy no longer hard-blocks commands. Risky or deny-matched
package/README.md CHANGED
@@ -377,7 +377,7 @@ as first-class subcommands in the shipped CLI.
377
377
  | `ur semantic-memory` | Build and search a project-local memory index. |
378
378
  | `ur memory retention` | Configure and apply local memory retention policies (TTL, max entries, decay). |
379
379
  | `ur knowledge` | Manage a curated project knowledge base with provenance. |
380
- | `ur artifacts` | Capture diffs, test runs, notes, and review feedback under `.ur/artifacts/`. |
380
+ | `ur artifacts` | Capture diffs, test runs, notes, and review feedback under `.ur/artifacts/`; `serve` opens a local web page per artifact ID. |
381
381
  | `ur claim-ledger` | Map generated claims to file, web, MCP, tool, or user sources. |
382
382
  | `ur browser-qa` | Validate and smoke-run browser QA replay fixtures. |
383
383
  | `ur eval run` | Run an eval suite and grade outputs; optionally capture cost/tokens/files/test metrics. |
@@ -560,6 +560,7 @@ ur code-index repo search "rate limiter"
560
560
  ur skill init security-review
561
561
  ur skill run security-review "src/auth.ts"
562
562
  ur artifacts capture-tests --command "bun test"
563
+ ur artifacts serve --port 4180
563
564
  ur agent-task pr --create --dry-run
564
565
  ur acp serve --port 8123
565
566
  ur exec "add tests for the parser" --concurrency 4 --json
package/dist/cli.js CHANGED
@@ -71146,7 +71146,7 @@ var init_auth = __esm(() => {
71146
71146
 
71147
71147
  // src/utils/userAgent.ts
71148
71148
  function getURCodeUserAgent() {
71149
- return `ur/${"1.42.0"}`;
71149
+ return `ur/${"1.43.1"}`;
71150
71150
  }
71151
71151
 
71152
71152
  // src/utils/workloadContext.ts
@@ -71168,7 +71168,7 @@ function getUserAgent() {
71168
71168
  const clientApp = process.env.UR_AGENT_SDK_CLIENT_APP ? `, client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}` : "";
71169
71169
  const workload = getWorkload();
71170
71170
  const workloadSuffix = workload ? `, workload/${workload}` : "";
71171
- return `ur-cli/${"1.42.0"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
71171
+ return `ur-cli/${"1.43.1"} (${process.env.USER_TYPE}, ${process.env.UR_CODE_ENTRYPOINT ?? "cli"}${agentSdkVersion}${clientApp}${workloadSuffix})`;
71172
71172
  }
71173
71173
  function getMCPUserAgent() {
71174
71174
  const parts = [];
@@ -71182,7 +71182,7 @@ function getMCPUserAgent() {
71182
71182
  parts.push(`client-app/${process.env.UR_AGENT_SDK_CLIENT_APP}`);
71183
71183
  }
71184
71184
  const suffix = parts.length > 0 ? ` (${parts.join(", ")})` : "";
71185
- return `ur/${"1.42.0"}${suffix}`;
71185
+ return `ur/${"1.43.1"}${suffix}`;
71186
71186
  }
71187
71187
  function getWebFetchUserAgent() {
71188
71188
  return `UR-User (${getURCodeUserAgent()})`;
@@ -71320,7 +71320,7 @@ var init_user = __esm(() => {
71320
71320
  deviceId,
71321
71321
  sessionId: getSessionId(),
71322
71322
  email: getEmail(),
71323
- appVersion: "1.42.0",
71323
+ appVersion: "1.43.1",
71324
71324
  platform: getHostPlatformForAnalytics(),
71325
71325
  organizationUuid,
71326
71326
  accountUuid,
@@ -77837,7 +77837,7 @@ var init_metadata = __esm(() => {
77837
77837
  COMPOUND_OPERATOR_REGEX = /\s*(?:&&|\|\||[;|])\s*/;
77838
77838
  WHITESPACE_REGEX = /\s+/;
77839
77839
  getVersionBase = memoize_default(() => {
77840
- const match = "1.42.0".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
77840
+ const match = "1.43.1".match(/^\d+\.\d+\.\d+(?:-[a-z]+)?/);
77841
77841
  return match ? match[0] : undefined;
77842
77842
  });
77843
77843
  buildEnvContext = memoize_default(async () => {
@@ -77877,7 +77877,7 @@ var init_metadata = __esm(() => {
77877
77877
  isGithubAction: isEnvTruthy(process.env.GITHUB_ACTIONS),
77878
77878
  isURCodeAction: isEnvTruthy(process.env.UR_CODE_ACTION),
77879
77879
  isURAiAuth: isURAISubscriber(),
77880
- version: "1.42.0",
77880
+ version: "1.43.1",
77881
77881
  versionBase: getVersionBase(),
77882
77882
  buildTime: "",
77883
77883
  deploymentEnvironment: env2.detectDeploymentEnvironment(),
@@ -78547,7 +78547,7 @@ function initialize1PEventLogging() {
78547
78547
  const platform2 = getPlatform();
78548
78548
  const attributes = {
78549
78549
  [import_semantic_conventions4.ATTR_SERVICE_NAME]: "ur",
78550
- [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.42.0"
78550
+ [import_semantic_conventions4.ATTR_SERVICE_VERSION]: "1.43.1"
78551
78551
  };
78552
78552
  if (platform2 === "wsl") {
78553
78553
  const wslVersion = getWslVersion();
@@ -78574,7 +78574,7 @@ function initialize1PEventLogging() {
78574
78574
  })
78575
78575
  ]
78576
78576
  });
78577
- firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.42.0");
78577
+ firstPartyEventLogger = firstPartyEventLoggerProvider.getLogger("com.urhq.ur.events", "1.43.1");
78578
78578
  }
78579
78579
  async function reinitialize1PEventLoggingIfConfigChanged() {
78580
78580
  if (!is1PEventLoggingEnabled() || !firstPartyEventLoggerProvider) {
@@ -83873,7 +83873,7 @@ function formatAgentTrendReport(report = buildAgentTrendReport()) {
83873
83873
  function formatA2AAgentCard(options = {}, pretty = true) {
83874
83874
  return JSON.stringify(buildA2AAgentCard(options), null, pretty ? 2 : 0);
83875
83875
  }
83876
- var urVersion = "1.42.0", coverage, priorityRoadmap;
83876
+ var urVersion = "1.43.1", coverage, priorityRoadmap;
83877
83877
  var init_trends = __esm(() => {
83878
83878
  coverage = [
83879
83879
  {
@@ -85868,7 +85868,7 @@ function getAttributionHeader(fingerprint) {
85868
85868
  if (!isAttributionHeaderEnabled()) {
85869
85869
  return "";
85870
85870
  }
85871
- const version2 = `${"1.42.0"}.${fingerprint}`;
85871
+ const version2 = `${"1.43.1"}.${fingerprint}`;
85872
85872
  const entrypoint = process.env.UR_CODE_ENTRYPOINT ?? "unknown";
85873
85873
  const cch = "";
85874
85874
  const workload = getWorkload();
@@ -193771,7 +193771,7 @@ function getTelemetryAttributes() {
193771
193771
  attributes["session.id"] = sessionId;
193772
193772
  }
193773
193773
  if (shouldIncludeAttribute("OTEL_METRICS_INCLUDE_VERSION")) {
193774
- attributes["app.version"] = "1.42.0";
193774
+ attributes["app.version"] = "1.43.1";
193775
193775
  }
193776
193776
  const oauthAccount = getOauthAccountInfo();
193777
193777
  if (oauthAccount) {
@@ -229157,7 +229157,7 @@ function getInstallationEnv() {
229157
229157
  return;
229158
229158
  }
229159
229159
  function getURCodeVersion() {
229160
- return "1.42.0";
229160
+ return "1.43.1";
229161
229161
  }
229162
229162
  async function getInstalledVSCodeExtensionVersion(command) {
229163
229163
  const { stdout } = await execFileNoThrow(command, ["--list-extensions", "--show-versions"], {
@@ -231996,7 +231996,7 @@ async function setupSdkMcpClients(sdkMcpConfigs, sendMcpMessage) {
231996
231996
  const client2 = new Client({
231997
231997
  name: "ur",
231998
231998
  title: "UR",
231999
- version: "1.42.0",
231999
+ version: "1.43.1",
232000
232000
  description: "UR-Nexus autonomous engineering workflow engine",
232001
232001
  websiteUrl: PRODUCT_URL
232002
232002
  }, {
@@ -232350,7 +232350,7 @@ var init_client5 = __esm(() => {
232350
232350
  const client2 = new Client({
232351
232351
  name: "ur",
232352
232352
  title: "UR",
232353
- version: "1.42.0",
232353
+ version: "1.43.1",
232354
232354
  description: "UR-Nexus autonomous engineering workflow engine",
232355
232355
  websiteUrl: PRODUCT_URL
232356
232356
  }, {
@@ -242164,9 +242164,9 @@ async function assertMinVersion() {
242164
242164
  if (false) {}
242165
242165
  try {
242166
242166
  const versionConfig = await getDynamicConfig_BLOCKS_ON_INIT("tengu_version_config", { minVersion: "0.0.0" });
242167
- if (versionConfig.minVersion && lt("1.42.0", versionConfig.minVersion)) {
242167
+ if (versionConfig.minVersion && lt("1.43.1", versionConfig.minVersion)) {
242168
242168
  console.error(`
242169
- It looks like your version of UR (${"1.42.0"}) needs an update.
242169
+ It looks like your version of UR (${"1.43.1"}) needs an update.
242170
242170
  A newer version (${versionConfig.minVersion} or higher) is required to continue.
242171
242171
 
242172
242172
  To update, please run:
@@ -242382,7 +242382,7 @@ async function installGlobalPackage(specificVersion) {
242382
242382
  logError2(new AutoUpdaterError("Another process is currently installing an update"));
242383
242383
  logEvent("tengu_auto_updater_lock_contention", {
242384
242384
  pid: process.pid,
242385
- currentVersion: "1.42.0"
242385
+ currentVersion: "1.43.1"
242386
242386
  });
242387
242387
  return "in_progress";
242388
242388
  }
@@ -242391,7 +242391,7 @@ async function installGlobalPackage(specificVersion) {
242391
242391
  if (!env2.isRunningWithBun() && env2.isNpmFromWindowsPath()) {
242392
242392
  logError2(new Error("Windows NPM detected in WSL environment"));
242393
242393
  logEvent("tengu_auto_updater_windows_npm_in_wsl", {
242394
- currentVersion: "1.42.0"
242394
+ currentVersion: "1.43.1"
242395
242395
  });
242396
242396
  console.error(`
242397
242397
  Error: Windows NPM detected in WSL
@@ -242926,7 +242926,7 @@ function detectLinuxGlobPatternWarnings() {
242926
242926
  }
242927
242927
  async function getDoctorDiagnostic() {
242928
242928
  const installationType = await getCurrentInstallationType();
242929
- const version2 = typeof MACRO !== "undefined" ? "1.42.0" : "unknown";
242929
+ const version2 = typeof MACRO !== "undefined" ? "1.43.1" : "unknown";
242930
242930
  const installationPath = await getInstallationPath();
242931
242931
  const invokedBinary = getInvokedBinary();
242932
242932
  const multipleInstallations = await detectMultipleInstallations();
@@ -243861,8 +243861,8 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
243861
243861
  const maxVersion = await getMaxVersion();
243862
243862
  if (maxVersion && gt(version2, maxVersion)) {
243863
243863
  logForDebugging(`Native installer: maxVersion ${maxVersion} is set, capping update from ${version2} to ${maxVersion}`);
243864
- if (gte("1.42.0", maxVersion)) {
243865
- logForDebugging(`Native installer: current version ${"1.42.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
243864
+ if (gte("1.43.1", maxVersion)) {
243865
+ logForDebugging(`Native installer: current version ${"1.43.1"} is already at or above maxVersion ${maxVersion}, skipping update`);
243866
243866
  logEvent("tengu_native_update_skipped_max_version", {
243867
243867
  latency_ms: Date.now() - startTime,
243868
243868
  max_version: maxVersion,
@@ -243873,7 +243873,7 @@ async function updateLatest(channelOrVersion, forceReinstall = false) {
243873
243873
  version2 = maxVersion;
243874
243874
  }
243875
243875
  }
243876
- if (!forceReinstall && version2 === "1.42.0" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
243876
+ if (!forceReinstall && version2 === "1.43.1" && await versionIsAvailable(version2) && await isPossibleURBinary(executablePath)) {
243877
243877
  logForDebugging(`Found ${version2} at ${executablePath}, skipping install`);
243878
243878
  logEvent("tengu_native_update_complete", {
243879
243879
  latency_ms: Date.now() - startTime,
@@ -329888,6 +329888,17 @@ ${EXPLANATORY_FEATURE_PROMPT}`
329888
329888
  });
329889
329889
  });
329890
329890
 
329891
+ // src/utils/toolInputSanitize.ts
329892
+ function stripEmptyParameterNames(input) {
329893
+ if (typeof input !== "object" || input === null || Array.isArray(input)) {
329894
+ return { input, stripped: false };
329895
+ }
329896
+ if (!("" in input))
329897
+ return { input, stripped: false };
329898
+ const { "": _dropped, ...rest } = input;
329899
+ return { input: rest, stripped: true };
329900
+ }
329901
+
329891
329902
  // src/utils/messages.ts
329892
329903
  import { randomUUID as randomUUID32 } from "crypto";
329893
329904
  function getTeammateMailbox() {
@@ -331181,6 +331192,13 @@ function normalizeContentFromAPI(contentBlocks, tools, agentId) {
331181
331192
  } else {
331182
331193
  normalizedInput = contentBlock.input;
331183
331194
  }
331195
+ const sanitized = stripEmptyParameterNames(normalizedInput);
331196
+ if (sanitized.stripped) {
331197
+ normalizedInput = sanitized.input;
331198
+ logEvent("tengu_tool_input_empty_key_stripped", {
331199
+ toolName: sanitizeToolNameForAnalytics(contentBlock.name)
331200
+ });
331201
+ }
331184
331202
  if (typeof normalizedInput === "object" && normalizedInput !== null) {
331185
331203
  const tool = findToolByName(tools, contentBlock.name);
331186
331204
  if (tool) {
@@ -340844,7 +340862,7 @@ function Feedback({
340844
340862
  platform: env2.platform,
340845
340863
  gitRepo: envInfo.isGit,
340846
340864
  terminal: env2.terminal,
340847
- version: "1.42.0",
340865
+ version: "1.43.1",
340848
340866
  transcript: normalizeMessagesForAPI(messages),
340849
340867
  errors: sanitizedErrors,
340850
340868
  lastApiRequest: getLastAPIRequest(),
@@ -341036,7 +341054,7 @@ function Feedback({
341036
341054
  ", ",
341037
341055
  env2.terminal,
341038
341056
  ", v",
341039
- "1.42.0"
341057
+ "1.43.1"
341040
341058
  ]
341041
341059
  }, undefined, true, undefined, this)
341042
341060
  ]
@@ -341142,7 +341160,7 @@ ${sanitizedDescription}
341142
341160
  ` + `**Environment Info**
341143
341161
  ` + `- Platform: ${env2.platform}
341144
341162
  ` + `- Terminal: ${env2.terminal}
341145
- ` + `- Version: ${"1.42.0"}
341163
+ ` + `- Version: ${"1.43.1"}
341146
341164
  ` + `- Feedback ID: ${feedbackId}
341147
341165
  ` + `
341148
341166
  **Errors**
@@ -344253,7 +344271,7 @@ function buildPrimarySection() {
344253
344271
  }, undefined, false, undefined, this);
344254
344272
  return [{
344255
344273
  label: "Version",
344256
- value: "1.42.0"
344274
+ value: "1.43.1"
344257
344275
  }, {
344258
344276
  label: "Session name",
344259
344277
  value: nameValue
@@ -347554,7 +347572,7 @@ function Config({
347554
347572
  }
347555
347573
  }, undefined, false, undefined, this)
347556
347574
  }, undefined, false, undefined, this) : showSubmenu === "ChannelDowngrade" ? /* @__PURE__ */ jsx_dev_runtime177.jsxDEV(ChannelDowngradeDialog, {
347557
- currentVersion: "1.42.0",
347575
+ currentVersion: "1.43.1",
347558
347576
  onChoice: (choice) => {
347559
347577
  setShowSubmenu(null);
347560
347578
  setTabsHidden(false);
@@ -347566,7 +347584,7 @@ function Config({
347566
347584
  autoUpdatesChannel: "stable"
347567
347585
  };
347568
347586
  if (choice === "stay") {
347569
- newSettings.minimumVersion = "1.42.0";
347587
+ newSettings.minimumVersion = "1.43.1";
347570
347588
  }
347571
347589
  updateSettingsForSource("userSettings", newSettings);
347572
347590
  setSettingsData((prev_27) => ({
@@ -355636,7 +355654,7 @@ function HelpV2(t0) {
355636
355654
  let t6;
355637
355655
  if ($3[31] !== tabs) {
355638
355656
  t6 = /* @__PURE__ */ jsx_dev_runtime204.jsxDEV(Tabs, {
355639
- title: `UR v${"1.42.0"}`,
355657
+ title: `UR v${"1.43.1"}`,
355640
355658
  color: "professionalBlue",
355641
355659
  defaultTab: "general",
355642
355660
  children: tabs
@@ -356382,7 +356400,7 @@ function buildToolUseContext(tools, readFileStateCache) {
356382
356400
  async function handleInitialize(options2) {
356383
356401
  return {
356384
356402
  name: "UR",
356385
- version: "1.42.0",
356403
+ version: "1.43.1",
356386
356404
  protocolVersion: "0.1.0",
356387
356405
  workspaceRoot: options2.cwd,
356388
356406
  capabilities: {
@@ -376524,7 +376542,7 @@ function getAllReleaseNotes(changelogContent = getStoredChangelogFromMemory()) {
376524
376542
  return [];
376525
376543
  }
376526
376544
  }
376527
- async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.42.0") {
376545
+ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.43.1") {
376528
376546
  if (process.env.USER_TYPE === "ant") {
376529
376547
  const changelog = "";
376530
376548
  if (changelog) {
@@ -376551,7 +376569,7 @@ async function checkForReleaseNotes(lastSeenVersion, currentVersion = "1.42.0")
376551
376569
  releaseNotes
376552
376570
  };
376553
376571
  }
376554
- function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.42.0") {
376572
+ function checkForReleaseNotesSync(lastSeenVersion, currentVersion = "1.43.1") {
376555
376573
  if (process.env.USER_TYPE === "ant") {
376556
376574
  const changelog = "";
376557
376575
  if (changelog) {
@@ -377730,7 +377748,7 @@ function getRecentActivitySync() {
377730
377748
  return cachedActivity;
377731
377749
  }
377732
377750
  function getLogoDisplayData() {
377733
- const version2 = process.env.DEMO_VERSION ?? "1.42.0";
377751
+ const version2 = process.env.DEMO_VERSION ?? "1.43.1";
377734
377752
  const serverUrl = getDirectConnectServerUrl();
377735
377753
  const displayPath = process.env.DEMO_VERSION ? "/code/ur" : getDisplayPath(getCwd());
377736
377754
  const cwd2 = serverUrl ? `${displayPath} in ${serverUrl.replace(/^https?:\/\//, "")}` : displayPath;
@@ -378519,7 +378537,7 @@ function LogoV2() {
378519
378537
  if ($3[2] === Symbol.for("react.memo_cache_sentinel")) {
378520
378538
  t2 = () => {
378521
378539
  const currentConfig2 = getGlobalConfig();
378522
- if (currentConfig2.lastReleaseNotesSeen === "1.42.0") {
378540
+ if (currentConfig2.lastReleaseNotesSeen === "1.43.1") {
378523
378541
  return;
378524
378542
  }
378525
378543
  saveGlobalConfig(_temp326);
@@ -379204,12 +379222,12 @@ function LogoV2() {
379204
379222
  return t41;
379205
379223
  }
379206
379224
  function _temp326(current) {
379207
- if (current.lastReleaseNotesSeen === "1.42.0") {
379225
+ if (current.lastReleaseNotesSeen === "1.43.1") {
379208
379226
  return current;
379209
379227
  }
379210
379228
  return {
379211
379229
  ...current,
379212
- lastReleaseNotesSeen: "1.42.0"
379230
+ lastReleaseNotesSeen: "1.43.1"
379213
379231
  };
379214
379232
  }
379215
379233
  function _temp243(s_0) {
@@ -404532,15 +404550,19 @@ function deleteArtifact(cwd2, id) {
404532
404550
  saveManifest3(cwd2, manifest);
404533
404551
  return true;
404534
404552
  }
404535
- async function captureDiff2(cwd2, title = "Working tree diff", exec6 = defaultExec) {
404553
+ async function getWorkingDiff(cwd2, exec6 = defaultExec) {
404536
404554
  const diff3 = await exec6("git", ["diff", "HEAD"], cwd2);
404537
- if (!diff3.stdout.trim())
404555
+ return diff3.stdout;
404556
+ }
404557
+ async function captureDiff2(cwd2, title = "Working tree diff", exec6 = defaultExec) {
404558
+ const stdout = await getWorkingDiff(cwd2, exec6);
404559
+ if (!stdout.trim())
404538
404560
  return null;
404539
- const files = (diff3.stdout.match(/^\+\+\+ /gm) ?? []).length;
404561
+ const files = (stdout.match(/^\+\+\+ /gm) ?? []).length;
404540
404562
  return recordArtifact(cwd2, {
404541
404563
  kind: "diff",
404542
404564
  title,
404543
- body: diff3.stdout,
404565
+ body: stdout,
404544
404566
  summary: `${files} file(s) changed`
404545
404567
  });
404546
404568
  }
@@ -406936,6 +406958,201 @@ var init_context_pack2 = __esm(() => {
406936
406958
  context_pack_default = contextPack;
406937
406959
  });
406938
406960
 
406961
+ // src/services/agents/artifactsServer.ts
406962
+ import { createServer as createServer5 } from "http";
406963
+ function page(title, body, head = "") {
406964
+ return `<!doctype html>
406965
+ <html lang="en">
406966
+ <head>
406967
+ <meta charset="utf-8">
406968
+ <meta name="viewport" content="width=device-width, initial-scale=1">
406969
+ <title>${escapeXmlAttr(title)}</title>${head}
406970
+ <style>
406971
+ :root { color-scheme: light dark; }
406972
+ body { font-family: ui-sans-serif, system-ui, sans-serif; max-width: 1200px; margin: 2rem auto; padding: 0 1rem; line-height: 1.5; }
406973
+ a { color: #4078c0; text-decoration: none; }
406974
+ a:hover { text-decoration: underline; }
406975
+ table { border-collapse: collapse; width: 100%; }
406976
+ th, td { text-align: left; padding: .4rem .6rem; border-bottom: 1px solid #8884; }
406977
+ pre { background: #8881; padding: 1rem; border-radius: 6px; overflow-x: auto; }
406978
+ .badge { padding: .1rem .5rem; border-radius: 999px; color: #fff; font-size: .8rem; }
406979
+ .meta { color: #888; font-size: .9rem; }
406980
+ .feedback { border-left: 3px solid #8884; padding-left: .8rem; margin: .5rem 0; }
406981
+ .btn { display: inline-block; padding: .35rem .9rem; border: 1px solid #8886; border-radius: 6px; background: #8881; cursor: pointer; font-size: .9rem; color: inherit; }
406982
+ .btn:hover { background: #8882; }
406983
+ .toolbar { margin: .8rem 0; display: flex; gap: .5rem; align-items: center; }
406984
+ </style>
406985
+ </head>
406986
+ <body>${body}</body>
406987
+ </html>
406988
+ `;
406989
+ }
406990
+ function badge(status2) {
406991
+ return `<span class="badge" style="background:${STATUS_COLOR[status2]}">${status2}</span>`;
406992
+ }
406993
+ function jsString(value) {
406994
+ return JSON.stringify(value).replace(/</g, "\\u003c");
406995
+ }
406996
+ function isDiffArtifact(artifact) {
406997
+ return artifact.kind === "diff" || (artifact.file?.endsWith(".patch") ?? false);
406998
+ }
406999
+ function renderDiffBlock(diff3) {
407000
+ return `
407001
+ <div class="toolbar" id="diff-toggle" style="display:none">
407002
+ <button class="btn" onclick="__drawDiff('side-by-side')">Side by side</button>
407003
+ <button class="btn" onclick="__drawDiff('line-by-line')">Inline</button>
407004
+ </div>
407005
+ <div id="diff-view"></div>
407006
+ <pre id="diff-fallback">${escapeXmlAttr(diff3)}</pre>
407007
+ <script>
407008
+ (function () {
407009
+ var diff = ${jsString(diff3)};
407010
+ window.__drawDiff = function (fmt) {
407011
+ if (typeof Diff2HtmlUI === 'undefined' || !diff.trim()) return;
407012
+ var ui = new Diff2HtmlUI(document.getElementById('diff-view'), diff, {
407013
+ outputFormat: fmt,
407014
+ drawFileList: true,
407015
+ matching: 'lines',
407016
+ highlight: true,
407017
+ colorScheme: 'auto',
407018
+ });
407019
+ ui.draw();
407020
+ ui.highlightCode();
407021
+ document.getElementById('diff-fallback').style.display = 'none';
407022
+ document.getElementById('diff-toggle').style.display = 'flex';
407023
+ };
407024
+ window.__drawDiff('side-by-side');
407025
+ })();
407026
+ </script>`;
407027
+ }
407028
+ function renderArtifactList(artifacts) {
407029
+ const rows = artifacts.map((a2) => `<tr><td><a href="/artifacts/${escapeXmlAttr(a2.id)}">${escapeXmlAttr(a2.id)}</a></td>` + `<td>${escapeXmlAttr(a2.kind)}</td><td>${escapeXmlAttr(a2.title)}</td>` + `<td>${badge(a2.status)}</td><td>${escapeXmlAttr(a2.summary ?? "")}</td></tr>`).join(`
407030
+ `);
407031
+ const table = artifacts.length ? `<table><tr><th>ID</th><th>Kind</th><th>Title</th><th>Status</th><th>Summary</th></tr>${rows}</table>` : "<p>No artifacts yet. Capture one with <code>ur artifacts capture-diff</code> or <code>ur artifacts add ...</code>.</p>";
407032
+ return page("Artifacts", `<h1>Artifacts</h1><p><a class="btn" href="/diff">Current working-tree changes</a></p>${table}`);
407033
+ }
407034
+ function renderArtifactPage(artifact, body) {
407035
+ const feedback2 = artifact.feedback.map((f) => `<div class="feedback"><span class="meta">${escapeXmlAttr(f.at)}</span><br>${escapeXmlAttr(f.text)}</div>`).join(`
407036
+ `);
407037
+ const diffView = body !== null && isDiffArtifact(artifact);
407038
+ const parts = [
407039
+ `<p><a href="/">&larr; all artifacts</a></p>`,
407040
+ `<h1>Artifact ${escapeXmlAttr(artifact.id)} <span class="meta">[${escapeXmlAttr(artifact.kind)}]</span> ${badge(artifact.status)}</h1>`,
407041
+ `<p><strong>${escapeXmlAttr(artifact.title)}</strong></p>`,
407042
+ artifact.summary ? `<p>${escapeXmlAttr(artifact.summary)}</p>` : "",
407043
+ `<p class="meta">created ${escapeXmlAttr(artifact.createdAt)} \xB7 updated ${escapeXmlAttr(artifact.updatedAt)}${artifact.file ? ` \xB7 <a href="/artifacts/${escapeXmlAttr(artifact.id)}/raw">raw</a>` : ""}</p>`,
407044
+ artifact.links?.claims?.length ? `<p class="meta">claims: ${artifact.links.claims.map(escapeXmlAttr).join(", ")}</p>` : "",
407045
+ feedback2 ? `<h2>Feedback</h2>${feedback2}` : "",
407046
+ body !== null ? `<h2>Content</h2>${diffView ? renderDiffBlock(body) : `<pre>${escapeXmlAttr(body)}</pre>`}` : ""
407047
+ ];
407048
+ return page(`Artifact ${artifact.id} \u2014 ${artifact.title}`, parts.filter(Boolean).join(`
407049
+ `), diffView ? DIFF_VIEWER_HEAD : "");
407050
+ }
407051
+ function renderLiveDiffPage(diff3) {
407052
+ const hasDiff = diff3.trim().length > 0;
407053
+ const content = hasDiff ? `${renderDiffBlock(diff3)}
407054
+ <script>
407055
+ function __captureDiff() {
407056
+ fetch('/api/capture-diff', { method: 'POST' })
407057
+ .then(function (r) { return r.json() })
407058
+ .then(function (d) { if (d.id) location = '/artifacts/' + d.id; else alert(d.error || 'No changes to capture.') })
407059
+ .catch(function (e) { alert(String(e)) })
407060
+ }
407061
+ </script>` : "<p>No working-tree changes.</p>";
407062
+ const captureButton = hasDiff ? '<div class="toolbar"><button class="btn" onclick="__captureDiff()">Capture as artifact</button></div>' : "";
407063
+ return page("Working tree changes", `<p><a href="/">&larr; all artifacts</a></p><h1>Working tree changes</h1>${captureButton}${content}`, hasDiff ? DIFF_VIEWER_HEAD : "");
407064
+ }
407065
+ function notFound4(id) {
407066
+ return page("Artifact not found", `<h1>Artifact not found: ${escapeXmlAttr(id)}</h1><p><a href="/">&larr; all artifacts</a></p>`);
407067
+ }
407068
+ async function handleArtifactsRequest(cwd2, url3, exec6) {
407069
+ const path22 = decodeURIComponent(new URL(url3, "http://localhost").pathname).replace(/\/+$/, "") || "/";
407070
+ if (path22 === "/" || path22 === "/artifacts") {
407071
+ return { status: 200, type: "text/html", body: renderArtifactList(listArtifacts(cwd2)) };
407072
+ }
407073
+ if (path22 === "/diff") {
407074
+ return { status: 200, type: "text/html", body: renderLiveDiffPage(await getWorkingDiff(cwd2, exec6)) };
407075
+ }
407076
+ if (path22 === "/api/diff") {
407077
+ return { status: 200, type: "text/plain", body: await getWorkingDiff(cwd2, exec6) };
407078
+ }
407079
+ if (path22 === "/api/artifacts") {
407080
+ return { status: 200, type: "application/json", body: JSON.stringify({ artifacts: listArtifacts(cwd2) }, null, 2) };
407081
+ }
407082
+ let match = path22.match(/^\/api\/artifacts\/([^/]+)$/);
407083
+ if (match) {
407084
+ const artifact = getArtifact(cwd2, match[1]);
407085
+ return artifact ? { status: 200, type: "application/json", body: JSON.stringify(artifact, null, 2) } : { status: 404, type: "application/json", body: JSON.stringify({ error: `Artifact not found: ${match[1]}` }) };
407086
+ }
407087
+ match = path22.match(/^\/artifacts\/([^/]+)\/raw$/);
407088
+ if (match) {
407089
+ const body = readArtifactBody(cwd2, match[1]);
407090
+ return body !== null ? { status: 200, type: "text/plain", body } : { status: 404, type: "text/plain", body: `Artifact body not found: ${match[1]}` };
407091
+ }
407092
+ match = path22.match(/^\/(?:artifacts\/)?([^/]+)$/);
407093
+ if (match) {
407094
+ const artifact = getArtifact(cwd2, match[1]);
407095
+ if (artifact) {
407096
+ return { status: 200, type: "text/html", body: renderArtifactPage(artifact, readArtifactBody(cwd2, artifact.id)) };
407097
+ }
407098
+ return { status: 404, type: "text/html", body: notFound4(match[1]) };
407099
+ }
407100
+ return { status: 404, type: "text/html", body: notFound4(path22) };
407101
+ }
407102
+ async function handleArtifactsPost(cwd2, url3, exec6) {
407103
+ const path22 = new URL(url3, "http://localhost").pathname.replace(/\/+$/, "");
407104
+ if (path22 === "/api/capture-diff") {
407105
+ const artifact = await captureDiff2(cwd2, "Working tree diff", exec6);
407106
+ return artifact ? { status: 200, type: "application/json", body: JSON.stringify({ id: artifact.id }) } : { status: 200, type: "application/json", body: JSON.stringify({ error: "No working-tree changes to capture." }) };
407107
+ }
407108
+ return { status: 404, type: "application/json", body: JSON.stringify({ error: `Unknown endpoint: ${path22}` }) };
407109
+ }
407110
+ function activeArtifactsServer() {
407111
+ return active ? { port: active.port, url: `http://127.0.0.1:${active.port}` } : null;
407112
+ }
407113
+ function startArtifactsServer(cwd2, port = 4180, exec6) {
407114
+ if (active) {
407115
+ return Promise.resolve({ port: active.port, url: `http://127.0.0.1:${active.port}`, alreadyRunning: true });
407116
+ }
407117
+ return new Promise((resolvePromise, reject2) => {
407118
+ const server2 = createServer5((req, res) => {
407119
+ const respond = (r) => {
407120
+ res.writeHead(r.status, { "content-type": `${r.type}; charset=utf-8` });
407121
+ res.end(r.body);
407122
+ };
407123
+ const handler = req.method === "GET" ? handleArtifactsRequest(cwd2, req.url ?? "/", exec6) : req.method === "POST" ? handleArtifactsPost(cwd2, req.url ?? "/", exec6) : Promise.resolve({ status: 405, type: "text/plain", body: "Method not allowed" });
407124
+ handler.then(respond).catch((error40) => respond({ status: 500, type: "text/plain", body: String(error40) }));
407125
+ });
407126
+ server2.once("error", reject2);
407127
+ server2.listen(port, "127.0.0.1", () => {
407128
+ const address = server2.address();
407129
+ const boundPort = typeof address === "object" && address ? address.port : port;
407130
+ active = { server: server2, port: boundPort };
407131
+ resolvePromise({ port: boundPort, url: `http://127.0.0.1:${boundPort}`, alreadyRunning: false });
407132
+ });
407133
+ });
407134
+ }
407135
+ async function stopArtifactsServer() {
407136
+ if (!active)
407137
+ return false;
407138
+ const { server: server2 } = active;
407139
+ active = null;
407140
+ await new Promise((resolvePromise) => server2.close(() => resolvePromise()));
407141
+ return true;
407142
+ }
407143
+ var STATUS_COLOR, DIFF_VIEWER_HEAD = `
407144
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github.min.css">
407145
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/diff2html/bundles/css/diff2html.min.css">
407146
+ <script src="https://cdn.jsdelivr.net/npm/diff2html/bundles/js/diff2html-ui.min.js"></script>`, active = null;
407147
+ var init_artifactsServer = __esm(() => {
407148
+ init_artifacts();
407149
+ STATUS_COLOR = {
407150
+ pending: "#b58900",
407151
+ approved: "#2aa15f",
407152
+ rejected: "#d94f4f"
407153
+ };
407154
+ });
407155
+
406939
407156
  // src/commands/artifacts/artifacts.ts
406940
407157
  var exports_artifacts = {};
406941
407158
  __export(exports_artifacts, {
@@ -406946,7 +407163,7 @@ function option18(tokens, name) {
406946
407163
  return index2 === -1 ? undefined : tokens[index2 + 1];
406947
407164
  }
406948
407165
  function positionals14(tokens) {
406949
- const withValue = new Set(["--kind", "--title", "--body", "--file", "--summary", "--feedback", "--command", "--task"]);
407166
+ const withValue = new Set(["--kind", "--title", "--body", "--file", "--summary", "--feedback", "--command", "--task", "--port"]);
406950
407167
  const values2 = [];
406951
407168
  for (let i3 = 0;i3 < tokens.length; i3++) {
406952
407169
  const token = tokens[i3];
@@ -406968,6 +407185,7 @@ function usage19() {
406968
407185
  ' ur artifacts add --kind plan --title "..." [--body "..."] [--file path] [--summary "..."]',
406969
407186
  ' ur artifacts capture-diff [--title "..."]',
406970
407187
  ' ur artifacts capture-tests --command "bun test"',
407188
+ " ur artifacts serve [--port 4180] | serve --stop",
406971
407189
  " ur artifacts approve <id>",
406972
407190
  ' ur artifacts reject <id> --feedback "..."',
406973
407191
  ' ur artifacts feedback|comment <id> --feedback "..." [--task bg_id]',
@@ -407021,6 +407239,31 @@ var KINDS, call84 = async (args) => {
407021
407239
  value: json2 ? JSON.stringify(artifact, null, 2) : `Captured test run as artifact ${artifact.id} (${artifact.summary}).`
407022
407240
  };
407023
407241
  }
407242
+ if (action3 === "serve") {
407243
+ if (tokens.includes("--stop")) {
407244
+ return {
407245
+ type: "text",
407246
+ value: await stopArtifactsServer() ? "Artifacts server stopped." : "Artifacts server is not running."
407247
+ };
407248
+ }
407249
+ const running = activeArtifactsServer();
407250
+ if (running) {
407251
+ return { type: "text", value: `Artifacts page already running at ${running.url} \u2014 open ${running.url}/artifacts/<id>.` };
407252
+ }
407253
+ const port = Number(option18(tokens, "--port") ?? 4180);
407254
+ if (!Number.isInteger(port) || port < 0 || port > 65535) {
407255
+ return { type: "text", value: `Invalid port: ${option18(tokens, "--port")}` };
407256
+ }
407257
+ try {
407258
+ const { url: url3 } = await startArtifactsServer(cwd2, port);
407259
+ return {
407260
+ type: "text",
407261
+ value: `Artifacts page: ${url3} \u2014 open ${url3}/artifacts/<id> for a single artifact, ${url3}/diff for live working-tree changes (VS Code-style diff). Stop with \`ur artifacts serve --stop\`.`
407262
+ };
407263
+ } catch (error40) {
407264
+ return { type: "text", value: `Failed to start artifacts server on port ${port}: ${error40}` };
407265
+ }
407266
+ }
407024
407267
  if (!id)
407025
407268
  return { type: "text", value: usage19() };
407026
407269
  if (action3 === "show") {
@@ -407061,6 +407304,7 @@ var KINDS, call84 = async (args) => {
407061
407304
  };
407062
407305
  var init_artifacts2 = __esm(() => {
407063
407306
  init_artifacts();
407307
+ init_artifactsServer();
407064
407308
  init_backgroundRunner();
407065
407309
  init_argumentSubstitution();
407066
407310
  init_cwd2();
@@ -407074,8 +407318,8 @@ var init_artifacts3 = __esm(() => {
407074
407318
  type: "local",
407075
407319
  name: "artifacts",
407076
407320
  aliases: ["artifact"],
407077
- description: "Reviewable deliverables (plans, diffs, test runs, screenshots) under .ur/artifacts with approve/reject/feedback",
407078
- argumentHint: "list|show|add|capture-diff|capture-tests|approve|reject|feedback|delete [id] [--kind ...] [--title ...] [--json]",
407321
+ description: "Reviewable deliverables (plans, diffs, test runs, screenshots) under .ur/artifacts with approve/reject/feedback and a local web page (serve)",
407322
+ argumentHint: "list|show|serve|add|capture-diff|capture-tests|approve|reject|feedback|delete [id] [--kind ...] [--title ...] [--port ...] [--json]",
407079
407323
  supportsNonInteractive: true,
407080
407324
  load: () => Promise.resolve().then(() => (init_artifacts2(), exports_artifacts))
407081
407325
  };
@@ -408940,7 +409184,7 @@ function optionValue7(tokens, flag) {
408940
409184
  const index2 = tokens.indexOf(flag);
408941
409185
  return index2 >= 0 ? tokens[index2 + 1] : undefined;
408942
409186
  }
408943
- function notFound4(name) {
409187
+ function notFound5(name) {
408944
409188
  const available = listSuites(getCwd());
408945
409189
  const hint = available.length > 0 ? `
408946
409190
  Available: ${available.join(", ")}` : "";
@@ -409118,7 +409362,7 @@ Run it locally: ur eval run ${result.suite.name}`
409118
409362
  const suite = loadSuite(cwd2, name);
409119
409363
  if (command5 === "validate") {
409120
409364
  if (!suite)
409121
- return notFound4(name);
409365
+ return notFound5(name);
409122
409366
  const validation = validateEvalSuite(suite);
409123
409367
  if (json2)
409124
409368
  return { type: "text", value: JSON.stringify(validation, null, 2) };
@@ -409136,7 +409380,7 @@ Run it locally: ur eval run ${result.suite.name}`
409136
409380
  }
409137
409381
  if (command5 === "run") {
409138
409382
  if (!suite)
409139
- return notFound4(name);
409383
+ return notFound5(name);
409140
409384
  const validation = validateEvalSuite(suite);
409141
409385
  if (!validation.valid) {
409142
409386
  return { type: "text", value: formatSuiteValidation(suite, validation) };
@@ -410832,7 +411076,7 @@ var init_code_index2 = __esm(() => {
410832
411076
 
410833
411077
  // node_modules/typescript/lib/typescript.js
410834
411078
  var require_typescript2 = __commonJS((exports, module) => {
410835
- var __dirname = "/sessions/friendly-inspiring-goldberg/mnt/UR-1.41.1/node_modules/typescript/lib", __filename = "/sessions/friendly-inspiring-goldberg/mnt/UR-1.41.1/node_modules/typescript/lib/typescript.js";
411079
+ var __dirname = "/sessions/friendly-inspiring-goldberg/mnt/UR-1.43.0/node_modules/typescript/lib", __filename = "/sessions/friendly-inspiring-goldberg/mnt/UR-1.43.0/node_modules/typescript/lib/typescript.js";
410836
411080
  /*! *****************************************************************************
410837
411081
  Copyright (c) Microsoft Corporation. All rights reserved.
410838
411082
  Licensed under the Apache License, Version 2.0 (the "License"); you may not use
@@ -590140,8 +590384,8 @@ function resolveAgentOverrides(allAgents, activeAgents) {
590140
590384
  if (seen.has(key))
590141
590385
  continue;
590142
590386
  seen.add(key);
590143
- const active = activeMap.get(agent.agentType);
590144
- const overriddenBy = active && active.source !== agent.source ? active.source : undefined;
590387
+ const active2 = activeMap.get(agent.agentType);
590388
+ const overriddenBy = active2 && active2.source !== agent.source ? active2.source : undefined;
590145
590389
  resolved.push({ ...agent, overriddenBy });
590146
590390
  }
590147
590391
  return resolved;
@@ -596366,7 +596610,7 @@ async function captureMemoryDiagnostics(trigger2, dumpNumber = 0) {
596366
596610
  smapsRollup,
596367
596611
  platform: process.platform,
596368
596612
  nodeVersion: process.version,
596369
- ccVersion: "1.42.0"
596613
+ ccVersion: "1.43.1"
596370
596614
  };
596371
596615
  }
596372
596616
  async function performHeapDump(trigger2 = "manual", dumpNumber = 0) {
@@ -596952,7 +597196,7 @@ var init_bridge_kick = __esm(() => {
596952
597196
  var call137 = async () => {
596953
597197
  return {
596954
597198
  type: "text",
596955
- value: "1.42.0"
597199
+ value: "1.43.1"
596956
597200
  };
596957
597201
  }, version2, version_default;
596958
597202
  var init_version = __esm(() => {
@@ -607045,7 +607289,7 @@ function generateHtmlReport(data, insights) {
607045
607289
  </html>`;
607046
607290
  }
607047
607291
  function buildExportData(data, insights, facets, remoteStats) {
607048
- const version3 = typeof MACRO !== "undefined" ? "1.42.0" : "unknown";
607292
+ const version3 = typeof MACRO !== "undefined" ? "1.43.1" : "unknown";
607049
607293
  const remote_hosts_collected = remoteStats?.hosts.filter((h2) => h2.sessionCount > 0).map((h2) => h2.name);
607050
607294
  const facets_summary = {
607051
607295
  total: facets.size,
@@ -611325,7 +611569,7 @@ var init_sessionStorage = __esm(() => {
611325
611569
  init_settings2();
611326
611570
  init_slowOperations();
611327
611571
  init_uuid();
611328
- VERSION5 = typeof MACRO !== "undefined" ? "1.42.0" : "unknown";
611572
+ VERSION5 = typeof MACRO !== "undefined" ? "1.43.1" : "unknown";
611329
611573
  MAX_TOMBSTONE_REWRITE_BYTES = 50 * 1024 * 1024;
611330
611574
  SKIP_FIRST_PROMPT_PATTERN = /^(?:\s*<[a-z][\w-]*[\s>]|\[Request interrupted by user[^\]]*\])/;
611331
611575
  EPHEMERAL_PROGRESS_TYPES = new Set([
@@ -612530,7 +612774,7 @@ var init_filesystem = __esm(() => {
612530
612774
  });
612531
612775
  getBundledSkillsRoot = memoize_default(function getBundledSkillsRoot2() {
612532
612776
  const nonce = randomBytes18(16).toString("hex");
612533
- return join202(getURTempDir(), "bundled-skills", "1.42.0", nonce);
612777
+ return join202(getURTempDir(), "bundled-skills", "1.43.1", nonce);
612534
612778
  });
612535
612779
  getResolvedWorkingDirPaths = memoize_default(getPathsForPermissionCheck);
612536
612780
  });
@@ -618819,7 +619063,7 @@ function computeFingerprint(messageText2, version3) {
618819
619063
  }
618820
619064
  function computeFingerprintFromMessages(messages) {
618821
619065
  const firstMessageText = extractFirstMessageText(messages);
618822
- return computeFingerprint(firstMessageText, "1.42.0");
619066
+ return computeFingerprint(firstMessageText, "1.43.1");
618823
619067
  }
618824
619068
  var FINGERPRINT_SALT = "59cf53e54c78";
618825
619069
  var init_fingerprint = () => {};
@@ -620693,7 +620937,7 @@ async function sideQuery(opts) {
620693
620937
  betas.push(STRUCTURED_OUTPUTS_BETA_HEADER);
620694
620938
  }
620695
620939
  const messageText2 = extractFirstUserMessageText(messages);
620696
- const fingerprint2 = computeFingerprint(messageText2, "1.42.0");
620940
+ const fingerprint2 = computeFingerprint(messageText2, "1.43.1");
620697
620941
  const attributionHeader = getAttributionHeader(fingerprint2);
620698
620942
  const systemBlocks = [
620699
620943
  attributionHeader ? { type: "text", text: attributionHeader } : null,
@@ -620977,7 +621221,7 @@ import {
620977
621221
  stat as stat45,
620978
621222
  unlink as unlink24
620979
621223
  } from "fs/promises";
620980
- import { createServer as createServer5 } from "net";
621224
+ import { createServer as createServer6 } from "net";
620981
621225
  import { homedir as homedir33, platform as platform6 } from "os";
620982
621226
  import { join as join205 } from "path";
620983
621227
  function log(message, ...args) {
@@ -621053,7 +621297,7 @@ class ChromeNativeHost {
621053
621297
  } catch {}
621054
621298
  }
621055
621299
  log(`Creating socket listener: ${this.socketPath}`);
621056
- this.server = createServer5((socket) => this.handleMcpClient(socket));
621300
+ this.server = createServer6((socket) => this.handleMcpClient(socket));
621057
621301
  await new Promise((resolve50, reject2) => {
621058
621302
  this.server.listen(this.socketPath, () => {
621059
621303
  log("Socket server listening for connections");
@@ -623541,7 +623785,7 @@ var init_managedEnv = __esm(() => {
623541
623785
  });
623542
623786
 
623543
623787
  // src/upstreamproxy/relay.ts
623544
- import { createServer as createServer6 } from "net";
623788
+ import { createServer as createServer7 } from "net";
623545
623789
  function encodeChunk(data) {
623546
623790
  const len = data.length;
623547
623791
  const varint = [];
@@ -623649,7 +623893,7 @@ function startBunRelay(wsUrl, authHeader, wsAuthHeader) {
623649
623893
  async function startNodeRelay(wsUrl, authHeader, wsAuthHeader) {
623650
623894
  nodeWSCtor = (await import("ws")).default;
623651
623895
  const states = new WeakMap;
623652
- const server2 = createServer6((sock) => {
623896
+ const server2 = createServer7((sock) => {
623653
623897
  const st = newConnState();
623654
623898
  states.set(sock, st);
623655
623899
  const adapter2 = {
@@ -625430,7 +625674,7 @@ function buildSystemInitMessage(inputs) {
625430
625674
  slash_commands: inputs.commands.filter((c4) => c4.userInvocable !== false).map((c4) => c4.name),
625431
625675
  apiKeySource: getURHQApiKeyWithSource().source,
625432
625676
  betas: getSdkBetas(),
625433
- ur_version: "1.42.0",
625677
+ ur_version: "1.43.1",
625434
625678
  output_style: outputStyle2,
625435
625679
  agents: inputs.agents.map((agent) => agent.agentType),
625436
625680
  skills: inputs.skills.filter((s) => s.userInvocable !== false).map((skill2) => skill2.name),
@@ -640058,7 +640302,7 @@ var init_useVoiceEnabled = __esm(() => {
640058
640302
  function getSemverPart(version3) {
640059
640303
  return `${import_semver13.major(version3, { loose: true })}.${import_semver13.minor(version3, { loose: true })}.${import_semver13.patch(version3, { loose: true })}`;
640060
640304
  }
640061
- function useUpdateNotification(updatedVersion, initialVersion = "1.42.0") {
640305
+ function useUpdateNotification(updatedVersion, initialVersion = "1.43.1") {
640062
640306
  const [lastNotifiedSemver, setLastNotifiedSemver] = import_react226.useState(() => getSemverPart(initialVersion));
640063
640307
  if (!updatedVersion) {
640064
640308
  return null;
@@ -640107,7 +640351,7 @@ function AutoUpdater({
640107
640351
  return;
640108
640352
  }
640109
640353
  if (false) {}
640110
- const currentVersion = "1.42.0";
640354
+ const currentVersion = "1.43.1";
640111
640355
  const channel = getInitialSettings()?.autoUpdatesChannel ?? "latest";
640112
640356
  let latestVersion = await getLatestVersion(channel);
640113
640357
  const isDisabled = isAutoUpdaterDisabled();
@@ -640336,12 +640580,12 @@ function NativeAutoUpdater({
640336
640580
  logEvent("tengu_native_auto_updater_start", {});
640337
640581
  try {
640338
640582
  const maxVersion = await getMaxVersion();
640339
- if (maxVersion && gt("1.42.0", maxVersion)) {
640583
+ if (maxVersion && gt("1.43.1", maxVersion)) {
640340
640584
  const msg = await getMaxVersionMessage();
640341
640585
  setMaxVersionIssue(msg ?? "affects your version");
640342
640586
  }
640343
640587
  const result = await installLatest(channel);
640344
- const currentVersion = "1.42.0";
640588
+ const currentVersion = "1.43.1";
640345
640589
  const latencyMs = Date.now() - startTime;
640346
640590
  if (result.lockFailed) {
640347
640591
  logEvent("tengu_native_auto_updater_lock_contention", {
@@ -640478,17 +640722,17 @@ function PackageManagerAutoUpdater(t0) {
640478
640722
  const maxVersion = await getMaxVersion();
640479
640723
  if (maxVersion && latest && gt(latest, maxVersion)) {
640480
640724
  logForDebugging(`PackageManagerAutoUpdater: maxVersion ${maxVersion} is set, capping update from ${latest} to ${maxVersion}`);
640481
- if (gte("1.42.0", maxVersion)) {
640482
- logForDebugging(`PackageManagerAutoUpdater: current version ${"1.42.0"} is already at or above maxVersion ${maxVersion}, skipping update`);
640725
+ if (gte("1.43.1", maxVersion)) {
640726
+ logForDebugging(`PackageManagerAutoUpdater: current version ${"1.43.1"} is already at or above maxVersion ${maxVersion}, skipping update`);
640483
640727
  setUpdateAvailable(false);
640484
640728
  return;
640485
640729
  }
640486
640730
  latest = maxVersion;
640487
640731
  }
640488
- const hasUpdate = latest && !gte("1.42.0", latest) && !shouldSkipVersion(latest);
640732
+ const hasUpdate = latest && !gte("1.43.1", latest) && !shouldSkipVersion(latest);
640489
640733
  setUpdateAvailable(!!hasUpdate);
640490
640734
  if (hasUpdate) {
640491
- logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.42.0"} -> ${latest}`);
640735
+ logForDebugging(`PackageManagerAutoUpdater: Update available ${"1.43.1"} -> ${latest}`);
640492
640736
  }
640493
640737
  };
640494
640738
  $3[0] = t1;
@@ -640522,7 +640766,7 @@ function PackageManagerAutoUpdater(t0) {
640522
640766
  wrap: "truncate",
640523
640767
  children: [
640524
640768
  "currentVersion: ",
640525
- "1.42.0"
640769
+ "1.43.1"
640526
640770
  ]
640527
640771
  }, undefined, true, undefined, this);
640528
640772
  $3[3] = verbose;
@@ -652974,7 +653218,7 @@ function buildStatusLineCommandInput(permissionMode, exceeds200kTokens, settings
652974
653218
  project_dir: getOriginalCwd(),
652975
653219
  added_dirs: addedDirs
652976
653220
  },
652977
- version: "1.42.0",
653221
+ version: "1.43.1",
652978
653222
  output_style: {
652979
653223
  name: outputStyleName
652980
653224
  },
@@ -653057,7 +653301,7 @@ function StatusLineInner({
653057
653301
  const taskValues = Object.values(tasks2);
653058
653302
  const taskRunningCount = taskValues.filter((task2) => task2.status === "running" || task2.status === "pending").length;
653059
653303
  const defaultStatusLineText = buildDefaultStatusBar({
653060
- version: "1.42.0",
653304
+ version: "1.43.1",
653061
653305
  providerLabel: providerRuntime.providerLabel,
653062
653306
  authMode: providerRuntime.authLabel,
653063
653307
  model: providerRuntime.model ?? renderModelName(mainLoopModel),
@@ -655371,9 +655615,9 @@ function useSwarmBanner() {
655371
655615
  };
655372
655616
  }
655373
655617
  }
655374
- const active = getActiveAgentForInput(state2);
655375
- if (active.type === "named_agent") {
655376
- const task2 = active.task;
655618
+ const active2 = getActiveAgentForInput(state2);
655619
+ if (active2.type === "named_agent") {
655620
+ const task2 = active2.task;
655377
655621
  let name;
655378
655622
  for (const [n3, id] of state2.agentNameRegistry) {
655379
655623
  if (id === task2.id) {
@@ -664545,7 +664789,7 @@ async function submitTranscriptShare(messages, trigger2, appearanceId) {
664545
664789
  } catch {}
664546
664790
  const data = {
664547
664791
  trigger: trigger2,
664548
- version: "1.42.0",
664792
+ version: "1.43.1",
664549
664793
  platform: process.platform,
664550
664794
  transcript,
664551
664795
  subagentTranscripts: Object.keys(subagentTranscripts).length > 0 ? subagentTranscripts : undefined,
@@ -671770,8 +672014,8 @@ function applyModalPagerAction(s, act, onBeforeJump) {
671770
672014
  }
671771
672015
  case "fullPageUp":
671772
672016
  case "fullPageDown": {
671773
- const page = Math.max(1, s.getViewportHeight());
671774
- const d = act === "fullPageDown" ? page : -page;
672017
+ const page2 = Math.max(1, s.getViewportHeight());
672018
+ const d = act === "fullPageDown" ? page2 : -page2;
671775
672019
  onBeforeJump(d);
671776
672020
  return jumpBy(s, d);
671777
672021
  }
@@ -676430,7 +676674,7 @@ function WelcomeV2() {
676430
676674
  dimColor: true,
676431
676675
  children: [
676432
676676
  "v",
676433
- "1.42.0"
676677
+ "1.43.1"
676434
676678
  ]
676435
676679
  }, undefined, true, undefined, this)
676436
676680
  ]
@@ -677690,7 +677934,7 @@ function completeOnboarding() {
677690
677934
  saveGlobalConfig((current) => ({
677691
677935
  ...current,
677692
677936
  hasCompletedOnboarding: true,
677693
- lastOnboardingVersion: "1.42.0"
677937
+ lastOnboardingVersion: "1.43.1"
677694
677938
  }));
677695
677939
  }
677696
677940
  function showDialog(root2, renderer) {
@@ -682727,7 +682971,7 @@ function appendToLog(path24, message) {
682727
682971
  cwd: getFsImplementation().cwd(),
682728
682972
  userType: process.env.USER_TYPE,
682729
682973
  sessionId: getSessionId(),
682730
- version: "1.42.0"
682974
+ version: "1.43.1"
682731
682975
  };
682732
682976
  getLogWriter(path24).write(messageWithTimestamp);
682733
682977
  }
@@ -684225,11 +684469,11 @@ class CCRClient {
684225
684469
  if (cursor) {
684226
684470
  url3.searchParams.set("cursor", cursor);
684227
684471
  }
684228
- const page = await this.getWithRetry(url3.toString(), authHeaders, context4);
684229
- if (!page)
684472
+ const page2 = await this.getWithRetry(url3.toString(), authHeaders, context4);
684473
+ if (!page2)
684230
684474
  return null;
684231
- allEvents.push(...page.data ?? []);
684232
- cursor = page.next_cursor;
684475
+ allEvents.push(...page2.data ?? []);
684476
+ cursor = page2.next_cursor;
684233
684477
  } while (cursor);
684234
684478
  logForDebugging(`CCRClient: Read ${allEvents.length} internal events from ${path24}${params.subagents ? " (subagents)" : ""}`);
684235
684479
  return allEvents;
@@ -686821,8 +687065,8 @@ async function getEnvLessBridgeConfig() {
686821
687065
  }
686822
687066
  async function checkEnvLessBridgeMinVersion() {
686823
687067
  const cfg = await getEnvLessBridgeConfig();
686824
- if (cfg.min_version && lt("1.42.0", cfg.min_version)) {
686825
- return `Your version of UR (${"1.42.0"}) is too old for Remote Control.
687068
+ if (cfg.min_version && lt("1.43.1", cfg.min_version)) {
687069
+ return `Your version of UR (${"1.43.1"}) is too old for Remote Control.
686826
687070
  Version ${cfg.min_version} or higher is required. Run \`ur update\` to update.`;
686827
687071
  }
686828
687072
  return null;
@@ -687296,7 +687540,7 @@ async function initBridgeCore(params) {
687296
687540
  const rawApi = createBridgeApiClient({
687297
687541
  baseUrl,
687298
687542
  getAccessToken,
687299
- runnerVersion: "1.42.0",
687543
+ runnerVersion: "1.43.1",
687300
687544
  onDebug: logForDebugging,
687301
687545
  onAuth401,
687302
687546
  getTrustedDeviceToken
@@ -692978,7 +693222,7 @@ async function startMCPServer(cwd3, debug2, verbose) {
692978
693222
  setCwd(cwd3);
692979
693223
  const server2 = new Server({
692980
693224
  name: "ur/tengu",
692981
- version: "1.42.0"
693225
+ version: "1.43.1"
692982
693226
  }, {
692983
693227
  capabilities: {
692984
693228
  tools: {}
@@ -693542,8 +693786,8 @@ async function providerListHandler(options2 = {}) {
693542
693786
  }
693543
693787
  async function providerStatusHandler(options2 = {}) {
693544
693788
  const settings = getInitialSettings();
693545
- const active = getActiveProviderSettings(settings).active ?? "ollama";
693546
- const result = await doctorProvider(active, { settings });
693789
+ const active2 = getActiveProviderSettings(settings).active ?? "ollama";
693790
+ const result = await doctorProvider(active2, { settings });
693547
693791
  writeOutput(formatProviderStatus(result, Boolean(options2.json)));
693548
693792
  process.exit(result.ok ? 0 : 1);
693549
693793
  }
@@ -693558,15 +693802,15 @@ async function providerDoctorHandler(providerArg, options2 = {}) {
693558
693802
  provider = resolved;
693559
693803
  }
693560
693804
  const settings = getInitialSettings();
693561
- const active = getActiveProviderSettings(settings).active ?? "ollama";
693562
- const result = await doctorProvider(provider ?? active, { settings });
693805
+ const active2 = getActiveProviderSettings(settings).active ?? "ollama";
693806
+ const result = await doctorProvider(provider ?? active2, { settings });
693563
693807
  writeOutput(formatProviderDoctor(result, Boolean(options2.json)));
693564
693808
  process.exit(result.ok ? 0 : 1);
693565
693809
  }
693566
693810
  async function providerModelsHandler(providerArg, options2 = {}) {
693567
693811
  const settings = getInitialSettings();
693568
- const active = getActiveProviderSettings(settings).active ?? "ollama";
693569
- const provider = providerArg ? resolveProviderId(providerArg) : active;
693812
+ const active2 = getActiveProviderSettings(settings).active ?? "ollama";
693813
+ const provider = providerArg ? resolveProviderId(providerArg) : active2;
693570
693814
  if (!provider) {
693571
693815
  writeError(`Unknown provider "${providerArg}". Run: ur provider list`);
693572
693816
  process.exit(1);
@@ -695020,7 +695264,7 @@ async function update() {
695020
695264
  logEvent("tengu_update_check", {});
695021
695265
  const diagnostic = await getDoctorDiagnostic();
695022
695266
  const result = await checkUpgradeStatus({
695023
- currentVersion: "1.42.0",
695267
+ currentVersion: "1.43.1",
695024
695268
  packageName: UR_AGENT_PACKAGE_NAME,
695025
695269
  installationType: diagnostic.installationType,
695026
695270
  latestVersion: () => getLatestNpmPackageVersion(UR_AGENT_PACKAGE_NAME)
@@ -696266,7 +696510,7 @@ ${customInstructions}` : customInstructions;
696266
696510
  }
696267
696511
  }
696268
696512
  logForDiagnosticsNoPII("info", "started", {
696269
- version: "1.42.0",
696513
+ version: "1.43.1",
696270
696514
  is_native_binary: isInBundledMode()
696271
696515
  });
696272
696516
  registerCleanup(async () => {
@@ -697052,7 +697296,7 @@ Usage: ur --remote "your task description"`, () => gracefulShutdown(1));
697052
697296
  pendingHookMessages
697053
697297
  }, renderAndRun);
697054
697298
  }
697055
- }).version("1.42.0 (UR-Nexus)", "-v, --version", "Output the version number");
697299
+ }).version("1.43.1 (UR-Nexus)", "-v, --version", "Output the version number");
697056
697300
  program2.option("-w, --worktree [name]", "Create a new git worktree for this session (optionally specify a name)");
697057
697301
  program2.option("--tmux", "Create a tmux session for the worktree (requires --worktree). Uses iTerm2 native panes when available; use --tmux=classic for traditional tmux.");
697058
697302
  if (canUserConfigureAdvisor()) {
@@ -697967,7 +698211,7 @@ if (false) {}
697967
698211
  async function main2() {
697968
698212
  const args = process.argv.slice(2);
697969
698213
  if (args.length === 1 && (args[0] === "--version" || args[0] === "-v" || args[0] === "-V")) {
697970
- console.log(`${"1.42.0"} (UR-Nexus)`);
698214
+ console.log(`${"1.43.1"} (UR-Nexus)`);
697971
698215
  return;
697972
698216
  }
697973
698217
  if (args[0] === "a2a" && args[1] === "serve" && !args.includes("--help") && !args.includes("-h")) {
@@ -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.42.0</p>
47
+ <p class="eyebrow">Version 1.43.1</p>
48
48
  <h1>UR-Nexus Documentation</h1>
49
49
  <p class="lead">A practical, tutorial-style reference for installing, configuring, automating, extending, and operating UR-Nexus.</p>
50
50
  </div>
@@ -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.42.0",
5
+ "version": "1.43.1",
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.42.0",
3
+ "version": "1.43.1",
4
4
  "description": "UR-Nexus \u2014 autonomous engineering workflow engine (plan, execute, test, verify, document, benchmark, reproduce)",
5
5
  "type": "module",
6
6
  "packageManager": "bun@1.3.14",