ur-agent 1.37.1 → 1.37.3

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/docs/IDE.md CHANGED
@@ -86,9 +86,14 @@ Install it with `ur ide install` (offers the bundled VSIX) or from the
86
86
  packaged `.vsix`. The extension is bundled inside this repository and
87
87
  packaged as a local VSIX when installed from UR-AGENT; the public install
88
88
  path does not depend on an unpublished marketplace extension ID. Every
89
- feature below requires the UR CLI on your `PATH` the extension calls `ur`
90
- as a local subprocess and never talks to a model provider or network service
91
- directly.
89
+ feature below runs UR as a local subprocess and never talks to a model
90
+ provider or network service directly.
91
+
92
+ When the workspace itself is a UR checkout, the extension prefers the
93
+ workspace-local runtime (`bun dist/cli.js`, then `node bin/ur.js`) before
94
+ falling back to `ur` from `PATH`. Set `ur.executablePath` in VS Code settings
95
+ to force a specific binary; `ur.executableArgs` can provide fixed wrapper
96
+ arguments before normal UR command arguments.
92
97
 
93
98
  ### Chat panel
94
99
 
package/docs/providers.md CHANGED
@@ -420,3 +420,32 @@ Local/server providers use their normal endpoints:
420
420
  - LM Studio: `http://localhost:1234/v1`
421
421
  - llama.cpp server mode: `http://localhost:8080/v1`
422
422
  - vLLM server mode: `http://localhost:8000/v1`
423
+
424
+ ## Optional Live Provider Smoke
425
+
426
+ `bun run provider:smoke` runs optional live checks only for providers with the
427
+ required environment variables present. With no variables set it exits
428
+ successfully and reports every provider as skipped, so CI does not need secrets.
429
+
430
+ Configured providers run one short text request, a finite-timeout streaming
431
+ request, and, when `PROVIDER_SMOKE_TOOL_CALLS=1`, a forced tool-call request.
432
+
433
+ Required variables:
434
+
435
+ | Provider | Required env vars | Optional env vars |
436
+ | --- | --- | --- |
437
+ | OpenAI-compatible | `OPENAI_COMPATIBLE_BASE_URL`, `OPENAI_COMPATIBLE_MODEL` | `OPENAI_COMPATIBLE_API_KEY` |
438
+ | OpenRouter | `OPENROUTER_API_KEY`, `OPENROUTER_MODEL` | |
439
+ | Anthropic | `ANTHROPIC_API_KEY`, `ANTHROPIC_MODEL` | `ANTHROPIC_BASE_URL` |
440
+ | Gemini | `GEMINI_API_KEY`, `GEMINI_MODEL` | `GEMINI_BASE_URL` |
441
+ | Ollama | `OLLAMA_MODEL` | `OLLAMA_BASE_URL` or `OLLAMA_HOST` |
442
+ | LM Studio | `LMSTUDIO_BASE_URL`, `LMSTUDIO_MODEL` | `LMSTUDIO_API_KEY` |
443
+ | vLLM | `VLLM_BASE_URL`, `VLLM_MODEL` | `VLLM_API_KEY` |
444
+
445
+ Common knobs:
446
+
447
+ ```sh
448
+ PROVIDER_SMOKE_TIMEOUT_MS=30000
449
+ PROVIDER_SMOKE_MAX_RETRIES=0
450
+ PROVIDER_SMOKE_TOOL_CALLS=1
451
+ ```
@@ -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.37.0</p>
47
+ <p class="eyebrow">Version 1.37.3</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>
@@ -58,12 +58,12 @@
58
58
  <div class="section-heading">
59
59
  <p class="eyebrow">What UR Is</p>
60
60
  <h2>Autonomous engineering workflow engine</h2>
61
- <p>UR is not only chat, autocomplete, or code edits. It turns work into a plan, executes patches, tests and verifies them, documents the result, benchmarks behavior, and keeps the run reproducible from the terminal.</p>
61
+ <p>UR is not only chat, autocomplete, or code edits. It turns work into a plan, executes patches, tests and verifies them, documents the result, benchmarks behavior, and keeps the run reproducible.</p>
62
62
  </div>
63
63
  <div class="stat-grid">
64
64
  <article>
65
65
  <strong>Local-first runtime</strong>
66
- <span>Use local Ollama/OpenAI-compatible runtimes for private and offline work, or explicitly select configured API provider paths. Subscription access stays visible but unavailable when no independent backend exists.</span>
66
+ <span>Use local Ollama/OpenAI-compatible runtimes for private and offline work, or explicitly select configured API provider paths. Subscription access stays visible but unavailable when not authenticated.</span>
67
67
  </article>
68
68
  <article>
69
69
  <strong>Interactive and headless</strong>
@@ -128,7 +128,7 @@ ur -p --output-format json "Review the current diff"</code></pre>
128
128
  </div>
129
129
  <div class="callout">
130
130
  <strong>Runtime requirement</strong>
131
- <p>UR expects Bun. For local-first work, run a local Ollama app/server at <code>http://localhost:11434/api</code>. Set <code>OLLAMA_MODEL</code> or <code>UR_MODEL</code> to force a model, or use <code>ur provider</code> and <code>ur config set</code> to select official subscription, API, or OpenAI-compatible providers.</p>
131
+ <p>UR expects Bun. For local-first work, run a local Ollama app/server at <code>http://localhost:11434/api</code>. Set <code>OLLAMA_MODEL</code> or <code>UR_MODEL</code> to force a model route.</p>
132
132
  </div>
133
133
  </section>
134
134
 
@@ -136,7 +136,7 @@ ur -p --output-format json "Review the current diff"</code></pre>
136
136
  <div class="section-heading">
137
137
  <p class="eyebrow">Legal Access Paths</p>
138
138
  <h2>Providers and authentication</h2>
139
- <p>UR-AGENT integrates official access paths only. It never scrapes browser sessions, extracts OAuth tokens, reads hidden provider auth files, bypasses provider restrictions, or proxies consumer web sessions as APIs.</p>
139
+ <p>UR-AGENT integrates official access paths only. It never scrapes browser sessions, extracts OAuth tokens, reads hidden provider auth files, bypasses provider restrictions, or proxies credentials.</p>
140
140
  </div>
141
141
  <div class="reference-grid">
142
142
  <article>
@@ -146,7 +146,7 @@ ur auth claude
146
146
  ur auth gemini
147
147
  ur auth antigravity
148
148
  ur provider doctor agy</code></pre>
149
- <p>Codex CLI, Claude Code, Gemini CLI, and Antigravity are first-class providers that dispatch each turn through the vendor's official CLI using your subscription login. They are optional, never required, and never used as a silent fallback. The generic subscription entry is an internal placeholder hidden from listings and exposes no fake models.</p>
149
+ <p>Codex CLI, Claude Code, Gemini CLI, and Antigravity are first-class providers that dispatch each turn through the vendor's official CLI using your subscription login. They are optional and can be disabled.</p>
150
150
  </article>
151
151
  <article>
152
152
  <h3>API and local providers</h3>
@@ -155,12 +155,12 @@ ur config set provider openai-api
155
155
  ur config set base_url http://localhost:11434/v1
156
156
  ur config set model qwen3-coder:480b-cloud
157
157
  ur config set provider.fallback ollama</code></pre>
158
- <p>API providers require explicit selection and read keys from a key stored via <code>ur connect</code> (OS keychain) or from environment variables. Local providers include Ollama, LM Studio, llama.cpp server mode, and vLLM OpenAI-compatible server mode. Subscription CLI providers (Codex CLI, Claude Code, Gemini CLI, Antigravity) dispatch through the official vendor CLIs.</p>
158
+ <p>API providers require explicit selection and read keys from a key stored via <code>ur connect</code> (OS keychain) or from environment variables. Local providers include Ollama, LM Studio, llama.cpp, and vLLM.</p>
159
159
  </article>
160
160
  <article>
161
161
  <h3>Status bar and updates</h3>
162
- <pre><code>Ollama | llama3 | ask | main | update 1.37.0 available</code></pre>
163
- <p>The interactive status bar shows only important runtime state: provider, model, mode, branch, active tasks, checks status when known, and update availability. It is hidden in CI, dumb terminals, and non-interactive mode.</p>
162
+ <pre><code>Ollama | llama3 | ask | main | update 1.37.3 available</code></pre>
163
+ <p>The interactive status bar shows only important runtime state: provider, model, mode, branch, active tasks, checks status when known, and update availability. It is hidden in CI, dumb terminals, and print mode.</p>
164
164
  </article>
165
165
  </div>
166
166
  </section>
@@ -169,7 +169,7 @@ ur config set provider.fallback ollama</code></pre>
169
169
  <div class="section-heading">
170
170
  <p class="eyebrow">Runtime</p>
171
171
  <h2>Architecture</h2>
172
- <p>The CLI is the control plane. Project context and <code>.ur</code> assets feed agent orchestration, which uses approved provider adapters, local-first model runtimes, and approved tools to produce code, docs, PRs, reports, and automation outputs.</p>
172
+ <p>The CLI is the control plane. Project context and <code>.ur</code> assets feed agent orchestration, which uses approved provider adapters, local-first model runtimes, and approved tools to produce auditable results.</p>
173
173
  </div>
174
174
  <figure class="diagram">
175
175
  <img src="assets/ur-architecture.svg" alt="UR-AGENT runtime architecture diagram">
@@ -11,7 +11,13 @@ marketplace extension ID.
11
11
 
12
12
  The extension never talks to a model provider or network service directly —
13
13
  every AI request goes through your local `ur` CLI, the same way `ur` behaves
14
- in a terminal. Everything below requires the UR CLI on your `PATH`.
14
+ in a terminal.
15
+
16
+ When the opened workspace is a UR checkout, the extension prefers the
17
+ workspace-local runtime (`bun dist/cli.js`, then `node bin/ur.js`) before
18
+ falling back to `ur` on `PATH`. To force a specific binary, set
19
+ `ur.executablePath` in VS Code settings. Use `ur.executableArgs` only for
20
+ custom wrappers that need fixed arguments before normal UR arguments.
15
21
 
16
22
  ## Chat
17
23
 
@@ -221,23 +221,66 @@ var DiffTreeProvider = class {
221
221
  };
222
222
 
223
223
  // src/bridge/urCli.ts
224
- var import_node_child_process = require("node:child_process");
224
+ var import_node_child_process2 = require("node:child_process");
225
225
  var import_node_util = require("node:util");
226
- var execFileAsync = (0, import_node_util.promisify)(import_node_child_process.execFile);
226
+
227
+ // src/bridge/urCommand.ts
228
+ var import_node_child_process = require("node:child_process");
229
+ var import_node_fs = require("node:fs");
230
+ var import_node_path = require("node:path");
231
+ function resolveUrCommand(options) {
232
+ const config = options.config ?? {};
233
+ const configuredPath = config.executablePath?.trim();
234
+ const configuredArgs = normalizeExecutableArgs(config.executableArgs);
235
+ if (configuredPath) {
236
+ return command(configuredPath, configuredArgs, "configured");
237
+ }
238
+ const pathExists = options.pathExists ?? import_node_fs.existsSync;
239
+ const bunCommand = options.bunCommand ?? "bun";
240
+ const nodeCommand = options.nodeCommand ?? "node";
241
+ const distEntrypoint = (0, import_node_path.join)(options.cwd, "dist", "cli.js");
242
+ if (pathExists(distEntrypoint) && (options.bunAvailable ?? isBunAvailable)(bunCommand)) {
243
+ return command(bunCommand, [distEntrypoint], "workspace-dist");
244
+ }
245
+ const launcherEntrypoint = (0, import_node_path.join)(options.cwd, "bin", "ur.js");
246
+ if (pathExists(launcherEntrypoint)) {
247
+ return command(nodeCommand, [launcherEntrypoint], "workspace-launcher");
248
+ }
249
+ return command("ur", [], "path");
250
+ }
251
+ function formatResolvedUrCommand(resolved) {
252
+ return [resolved.command, ...resolved.args].join(" ");
253
+ }
254
+ function command(commandName, args, source) {
255
+ const resolved = { command: commandName, args, source, display: "" };
256
+ return { ...resolved, display: formatResolvedUrCommand(resolved) };
257
+ }
258
+ function normalizeExecutableArgs(args) {
259
+ return Array.isArray(args) ? args.filter((arg) => typeof arg === "string" && arg.length > 0) : [];
260
+ }
261
+ function isBunAvailable(commandName) {
262
+ const result = (0, import_node_child_process.spawnSync)(commandName, ["--version"], { stdio: "ignore" });
263
+ return !result.error && result.status === 0;
264
+ }
265
+
266
+ // src/bridge/urCli.ts
267
+ var execFileAsync = (0, import_node_util.promisify)(import_node_child_process2.execFile);
227
268
  async function runUrCli(args, options) {
269
+ const executable = resolveUrCommand({ cwd: options.cwd, config: readUrCommandConfig() });
228
270
  try {
229
- const { stdout, stderr } = await execFileAsync("ur", args, {
271
+ const { stdout, stderr } = await execFileAsync(executable.command, [...executable.args, ...args], {
230
272
  cwd: options.cwd,
231
273
  shell: false
232
274
  });
233
275
  return { stdout, stderr };
234
276
  } catch (error) {
235
- throw new Error(formatUrCliError(args, error));
277
+ throw new Error(formatUrCliError(args, error, executable, options.cwd));
236
278
  }
237
279
  }
238
280
  async function runUrCliCapture(args, options) {
281
+ const executable = resolveUrCommand({ cwd: options.cwd, config: readUrCommandConfig() });
239
282
  try {
240
- const { stdout, stderr } = await execFileAsync("ur", args, {
283
+ const { stdout, stderr } = await execFileAsync(executable.command, [...executable.args, ...args], {
241
284
  cwd: options.cwd,
242
285
  shell: false
243
286
  });
@@ -246,13 +289,34 @@ async function runUrCliCapture(args, options) {
246
289
  if (isCapturedNonZeroExit(error)) {
247
290
  return { stdout: error.stdout, stderr: error.stderr, exitCode: error.code };
248
291
  }
249
- throw new Error(formatUrCliError(args, error));
292
+ throw new Error(formatUrCliError(args, error, executable, options.cwd));
250
293
  }
251
294
  }
252
- function formatUrCliError(args, error) {
295
+ function readUrCommandConfig() {
296
+ try {
297
+ const vscode18 = require("vscode");
298
+ const config = vscode18.workspace.getConfiguration("ur");
299
+ const executablePath = config.get("executablePath")?.trim();
300
+ const executableArgs = config.get("executableArgs") ?? [];
301
+ return {
302
+ executablePath: executablePath || void 0,
303
+ executableArgs: executableArgs.filter((arg) => typeof arg === "string" && arg.length > 0)
304
+ };
305
+ } catch {
306
+ return {};
307
+ }
308
+ }
309
+ function formatUrCliError(args, error, executable, cwd) {
253
310
  const stderr = hasStderr(error) ? error.stderr.trim() : "";
254
311
  const detail = stderr || (error instanceof Error ? error.message : String(error));
255
- return `Failed to run \`ur ${args.join(" ")}\`: ${detail}. Ensure the UR CLI is installed and on PATH.`;
312
+ return [
313
+ `Failed to run UR command.`,
314
+ `Executable: ${executable.display}`,
315
+ `cwd: ${cwd}`,
316
+ `Args: ${args.join(" ")}`,
317
+ `Error: ${detail}`,
318
+ `Hint: Set ur.executablePath in VS Code settings if the extension is using the wrong UR binary.`
319
+ ].join("\n");
256
320
  }
257
321
  function hasStderr(error) {
258
322
  return typeof error === "object" && error !== null && "stderr" in error && typeof error.stderr === "string";
@@ -409,7 +473,7 @@ function isCanUseToolRequest(message) {
409
473
  }
410
474
 
411
475
  // src/bridge/urProcess.ts
412
- var import_node_child_process2 = require("node:child_process");
476
+ var import_node_child_process3 = require("node:child_process");
413
477
  var NdjsonBuffer = class {
414
478
  buffer = "";
415
479
  /** Feed a raw chunk (may contain zero, one, or many complete lines, and may
@@ -477,14 +541,14 @@ function buildControlResponse(requestId, decision) {
477
541
  }
478
542
  };
479
543
  }
480
- var defaultSpawn = (command, args, options) => (0, import_node_child_process2.spawn)(command, args, options);
544
+ var defaultSpawn = (command2, args, options) => (0, import_node_child_process3.spawn)(command2, args, options);
481
545
  function runUrTurn(request, handlers, deps = {}) {
482
546
  const spawnFn = deps.spawn ?? defaultSpawn;
483
- const command = deps.command ?? "ur";
484
- const args = buildUrArgs(request);
547
+ const executable = deps.executable ?? (deps.command ? { command: deps.command, args: [], source: "configured", display: deps.command } : resolveUrCommand({ cwd: request.cwd }));
548
+ const args = [...executable.args, ...buildUrArgs(request)];
485
549
  let child;
486
550
  try {
487
- child = spawnFn(command, args, {
551
+ child = spawnFn(executable.command, args, {
488
552
  cwd: request.cwd,
489
553
  shell: false,
490
554
  stdio: ["pipe", "pipe", "pipe"]
@@ -493,10 +557,18 @@ function runUrTurn(request, handlers, deps = {}) {
493
557
  handlers.onExit({
494
558
  ok: false,
495
559
  exitCode: null,
560
+ signal: null,
496
561
  canceled: false,
497
562
  sawResult: false,
498
563
  stderr: "",
499
- error: `Failed to start \`${command}\`: ${errorMessage2(error)}. Ensure the UR CLI is installed and on PATH.`
564
+ error: formatTurnFailure({
565
+ executable,
566
+ cwd: request.cwd,
567
+ exitCode: null,
568
+ signal: null,
569
+ stderr: "",
570
+ reason: `Failed to start: ${errorMessage2(error)}`
571
+ })
500
572
  });
501
573
  return { cancel: () => {
502
574
  } };
@@ -507,7 +579,7 @@ function runUrTurn(request, handlers, deps = {}) {
507
579
  let resultIsError = false;
508
580
  let canceled = false;
509
581
  let settled = false;
510
- const finish = (exitCode, spawnError) => {
582
+ const finish = (exitCode, signal, spawnError) => {
511
583
  if (settled) return;
512
584
  settled = true;
513
585
  const stderr = stderrChunks.join("");
@@ -515,10 +587,11 @@ function runUrTurn(request, handlers, deps = {}) {
515
587
  handlers.onExit({
516
588
  ok,
517
589
  exitCode,
590
+ signal,
518
591
  canceled,
519
592
  sawResult,
520
593
  stderr,
521
- error: spawnError ?? (!ok && !canceled ? deriveErrorMessage(sawResult, resultIsError, exitCode, stderr) : void 0)
594
+ error: spawnError ?? (!ok && !canceled ? deriveErrorMessage(executable, request.cwd, sawResult, resultIsError, exitCode, signal, stderr) : void 0)
522
595
  });
523
596
  };
524
597
  const handleMessage = (message) => {
@@ -547,13 +620,24 @@ function runUrTurn(request, handlers, deps = {}) {
547
620
  stderrChunks.push(chunk.toString("utf8"));
548
621
  });
549
622
  child.on("error", (error) => {
550
- finish(null, `Failed to run \`${command}\`: ${errorMessage2(error)}. Ensure the UR CLI is installed and on PATH.`);
623
+ finish(
624
+ null,
625
+ null,
626
+ formatTurnFailure({
627
+ executable,
628
+ cwd: request.cwd,
629
+ exitCode: null,
630
+ signal: null,
631
+ stderr: stderrChunks.join(""),
632
+ reason: `Failed to run: ${errorMessage2(error)}`
633
+ })
634
+ );
551
635
  });
552
- child.on("exit", (code) => {
636
+ child.on("exit", (code, signal) => {
553
637
  for (const message of stdoutBuffer.flush()) {
554
638
  handleMessage(message);
555
639
  }
556
- finish(code);
640
+ finish(code, signal);
557
641
  });
558
642
  return {
559
643
  cancel: () => {
@@ -570,11 +654,26 @@ function writeControlResponse(child, requestId, decision) {
570
654
  } catch {
571
655
  }
572
656
  }
573
- function deriveErrorMessage(sawResult, resultIsError, exitCode, stderr) {
574
- if (sawResult && resultIsError) return "UR reported an error completing this turn.";
575
- const trimmedStderr = stderr.trim();
576
- if (trimmedStderr) return trimmedStderr;
577
- return `UR exited with code ${exitCode ?? "unknown"} and produced no result.`;
657
+ function deriveErrorMessage(executable, cwd, sawResult, resultIsError, exitCode, signal, stderr) {
658
+ const reason = sawResult && resultIsError ? "UR reported an error completing this turn." : "UR exited without producing a successful result.";
659
+ return formatTurnFailure({ executable, cwd, exitCode, signal, stderr, reason });
660
+ }
661
+ function formatTurnFailure(options) {
662
+ const stderr = summarizeStderr(options.stderr);
663
+ return [
664
+ `UR chat backend failed.`,
665
+ `Executable: ${options.executable.display}`,
666
+ `cwd: ${options.cwd}`,
667
+ `Exit: code ${options.exitCode ?? "unknown"}, signal ${options.signal ?? "none"}`,
668
+ `stderr: ${stderr || "<empty>"}`,
669
+ options.reason,
670
+ `Hint: Set ur.executablePath in VS Code settings if the extension is using the wrong UR binary.`
671
+ ].join("\n");
672
+ }
673
+ function summarizeStderr(stderr) {
674
+ const trimmed = stderr.trim();
675
+ if (trimmed.length <= 2e3) return trimmed;
676
+ return `${trimmed.slice(0, 2e3)}\u2026`;
578
677
  }
579
678
  function errorMessage2(error) {
580
679
  return error instanceof Error ? error.message : String(error);
@@ -1367,7 +1466,8 @@ var ChatController = class {
1367
1466
  onMessage: (message) => this.handleStreamMessage(root, sessionId, message),
1368
1467
  onControlRequest: (request) => this.handlePermissionRequest(request),
1369
1468
  onExit: (result) => this.handleTurnExit(root, result)
1370
- }
1469
+ },
1470
+ { executable: resolveUrCommand({ cwd: root, config: readUrCommandConfig() }) }
1371
1471
  );
1372
1472
  }
1373
1473
  handleStreamMessage(root, sessionId, message) {
@@ -1489,13 +1589,13 @@ var ChatController = class {
1489
1589
  // src/chat/chatTreeProvider.ts
1490
1590
  var vscode7 = __toESM(require("vscode"));
1491
1591
  var ActionItem = class extends vscode7.TreeItem {
1492
- constructor(label, description, icon, command, tooltip) {
1592
+ constructor(label, description, icon, command2, tooltip) {
1493
1593
  super(label, vscode7.TreeItemCollapsibleState.None);
1494
1594
  this.contextValue = "urChatAction";
1495
1595
  this.description = description;
1496
1596
  this.iconPath = new vscode7.ThemeIcon(icon);
1497
1597
  this.tooltip = tooltip ?? `${label}${description ? ` - ${description}` : ""}`;
1498
- this.command = command;
1598
+ this.command = command2;
1499
1599
  }
1500
1600
  };
1501
1601
  var InfoItem3 = class extends vscode7.TreeItem {
@@ -1567,11 +1667,11 @@ var ChatTreeProvider = class {
1567
1667
  };
1568
1668
 
1569
1669
  // src/diffs/actions.ts
1570
- var import_node_child_process3 = require("node:child_process");
1670
+ var import_node_child_process4 = require("node:child_process");
1571
1671
  var fs3 = __toESM(require("node:fs"));
1572
1672
  var import_node_util2 = require("node:util");
1573
1673
  var vscode8 = __toESM(require("vscode"));
1574
- var execFileAsync2 = (0, import_node_util2.promisify)(import_node_child_process3.execFile);
1674
+ var execFileAsync2 = (0, import_node_util2.promisify)(import_node_child_process4.execFile);
1575
1675
  async function commentDiff(item, provider) {
1576
1676
  const root = workspaceRoot();
1577
1677
  const bundle = item?.bundle;
@@ -2181,7 +2281,7 @@ async function showAgentOptions(cwd) {
2181
2281
  }
2182
2282
 
2183
2283
  // src/review/reviewDiff.ts
2184
- var import_node_child_process4 = require("node:child_process");
2284
+ var import_node_child_process5 = require("node:child_process");
2185
2285
  var import_node_util3 = require("node:util");
2186
2286
  var vscode13 = __toESM(require("vscode"));
2187
2287
 
@@ -2199,7 +2299,7 @@ function buildReviewPrompt(diff) {
2199
2299
  }
2200
2300
 
2201
2301
  // src/review/reviewDiff.ts
2202
- var execFileAsync3 = (0, import_node_util3.promisify)(import_node_child_process4.execFile);
2302
+ var execFileAsync3 = (0, import_node_util3.promisify)(import_node_child_process5.execFile);
2203
2303
  async function captureGitDiff(cwd) {
2204
2304
  const { stdout } = await execFileAsync3("git", ["diff", "HEAD"], { cwd, shell: false });
2205
2305
  return stdout;
@@ -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.37.1",
5
+ "version": "1.37.3",
6
6
  "publisher": "ur-agent",
7
7
  "engines": {
8
8
  "vscode": "^1.92.0"
@@ -55,6 +55,24 @@
55
55
  "typescript": "^5.7.0"
56
56
  },
57
57
  "contributes": {
58
+ "configuration": {
59
+ "title": "UR",
60
+ "properties": {
61
+ "ur.executablePath": {
62
+ "type": "string",
63
+ "default": "",
64
+ "description": "Absolute path or command name for the UR executable the extension should run. Leave empty to prefer a repo-local UR checkout in the workspace, then fall back to ur on PATH."
65
+ },
66
+ "ur.executableArgs": {
67
+ "type": "array",
68
+ "default": [],
69
+ "items": {
70
+ "type": "string"
71
+ },
72
+ "description": "Optional arguments inserted after ur.executablePath and before UR command arguments. Use this only for custom wrappers, for example when ur.executablePath points to bun and the first arg is a dist/cli.js path."
73
+ }
74
+ }
75
+ },
58
76
  "viewsContainers": {
59
77
  "activitybar": [
60
78
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ur-agent",
3
- "version": "1.37.1",
3
+ "version": "1.37.3",
4
4
  "description": "UR-AGENT \u2014 autonomous engineering workflow engine (plan, execute, test, verify, document, benchmark, reproduce)",
5
5
  "type": "module",
6
6
  "packageManager": "bun@1.3.14",
@@ -49,11 +49,23 @@
49
49
  "bundle": "node scripts/bundle.mjs",
50
50
  "build": "node scripts/bundle.mjs",
51
51
  "release:check": "node scripts/release-check.mjs",
52
- "typecheck": "bun run tsc --noEmit",
52
+ "release:create-source-zip": "bun scripts/source-zip-create.mjs",
53
+ "release:check-source-zip": "node scripts/source-zip-check.mjs",
54
+ "typecheck": "bun run tsc --noEmit && bun run typecheck:strict-core",
55
+ "typecheck:strict-core": "node scripts/strict-core-check.mjs",
53
56
  "lint": "node scripts/lint.mjs",
54
57
  "test": "bun test",
55
58
  "smoke": "node ./bin/ur.js --version",
56
59
  "secrets:scan": "bash scripts/secret-scan.sh",
60
+ "benchmark:report": "node scripts/benchmark-report.mjs",
61
+ "benchmark:smoke": "node scripts/benchmark-smoke.mjs",
62
+ "benchmark:local": "node scripts/benchmark-local.mjs",
63
+ "benchmark:compare": "node scripts/benchmark-compare.mjs",
64
+ "benchmark:swe-bench-lite": "node scripts/benchmark-external.mjs swe-bench-lite",
65
+ "benchmark:terminal-bench": "node scripts/benchmark-external.mjs terminal-bench",
66
+ "benchmark:aider-polyglot": "node scripts/benchmark-external.mjs aider-polyglot",
67
+ "safety:matrix": "bun scripts/generate-safety-matrix.mjs",
68
+ "provider:smoke": "bun scripts/provider-smoke.mjs",
57
69
  "package:check": "node scripts/package-check.mjs",
58
70
  "prepack": "bun run release:check"
59
71
  },